프로그램이 CPU에서 실행되려면 실행에 필요한 부분이 메모리에 올라와 있어야한다. 시분할 환경에서는 한정된 메모리 공간을 여러 프로그램이 조금씩 나누어 사용하는데 어느 정도의 메모리를 할당할 것인가에 대한 문제를 해결할 필요가 있다.
운영체제는 공평하게 같은 크기의 메모리를 할당하기 보다 집중적으로 메모리를 할당하고 다시 메모리를 회수해 다른 프로그램에 메모리를 할당하는 방식을 선택한다.
프로그램이 실행되기 위해 그 프로세스의 주소 공간 전체가 메모리에 올라갈 필요는 없다. CPU에서 당장 수행해야 할 부분만 올려두고 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓는다.
이렇게 되면 자기 자신만의 메모리 주소 공간을 가정할 수 있는데 이러한 메모리 공간을 가상메모리라고 한다.
: 프로세스마다 각각 0번지부터 주소공간을 가지게 되며, 이 공간 중 일부는 물리적 메모리에 적재되고, 일부는 디스크의 스왑 영역에 존재한다.
적재 방식으로는 요구 페이징과 요구 세그먼테이션이 있다.
: 프로그램 실행 시 프로세스를 구성하는 모든 페이지를 한꺼번에 메모리에 올리는 것이 아니라 당장 사용될 페이지만 올리는 방식
: 어떤 페이지가 메모리에 올라와 있는지 구별하기 위해 사용하고 페이지 테이블의 각 항목별로 저장된다.
CPU가 참조하려는 페이지가 현재 메모리에 올라와 있지 않아 유효-무효 비트가 무효로 세팅되어 있는 경우를 '페이지 부재'가 일어났다고 한다.
→ 페이지를 메모리에 적재하기 전 해당 페이지에 대한 접근이 적합한지 먼저 확인
요청된 페이지를 디스크로 부터 메모리로 적재하는데 오랜 시간이 소요된다.
따라서 페이지 부재를 발생시킨 프로세스는 CPU를 뺏기고 봉쇄상태가 된다.
수행되던 CPU 레지스터 상태 및 프로그램 카운터 값을 프로세스 제어블록에 저장해 이 프로세스가 다시 CPU를 할당받을 때와 같은 상태에서 디스크로 부터 메모리를 적재한다.
: 성능에 가장 큰 영향을 미치는 것은 페이지 부재의 발생 빈도이다.
유효 접근시간이 짧을 수록 요구 페이징 기법의 성능은 향상된다.
: 페이지 부재가 발생하면 요청된 페이지를 디스크에서 메모리로 읽어와야한다.
이때 물리적 메모리에 빈 프레임이 존재하지 않을 수 있다.
메모리에 올라와 있는 페이지 중 하나를 디스크로 쫒아내 메모리에 빈 공간을 확보하는 작업
: 먼 미래에 참조될 페이지를 쫒아내는 방식
: 물리적 메모리에 가장 먼저 올라온 페이지를 우선적으로 내쫒는다.
페이지의 향후 참조 가능성을 고려하지 않고, 물리적 메모리에 들어온 순서대로 내쫒을 대상을 선정하기 때문에 비효율적
: 최근에 참조된 페이지가 가까운 미래에 다시 참조될 가능성이 높은 성질
: 페이지의 참조 횟수로 교체시킬 페이지를 결정.
과거에 참조 횟수가 가장 적었던 페이지를 쫒아내고 그 자리에 새로 참조될 페이지를 적재한다.
최저 참조 횟수를 가진 페이지들 중에서도 상대적으로 더 오래전에 참조된 페이지를 쫒아내도록 구현하는 것이 효율적이다.
LFU 알고리즘 & LRU 알고리즘
- LFU 알고리즘
: 오랜 시간 동안의 참조 기록을 반영할 수 있는 장점- LRU 알고리즘
: 시간에 따른 페이지 참조의 변화를 반영하고 LRU 보다 구현이 복잡하다는 단점이 있음
: 하드웨어적인 지원을 통해 이와 같은 알고리즘의 운영 오버헤드를 줄인 방식.
오랫동안 참조되지 않은 페이지 중 하나를 교체.
하드웨어적인 지원으로 동작하기 때문에 LRU에 비해 페이지의 관리가 훨씬 빠르고 효율적으로 이뤄진다.
: 각 프레임마다 하나씩 존재하고 참조될 때 하드웨어에 의해 1로 자동 세팅된다.
참조비트가 1인 페이지는 0으로 바꾼 후 그냥 지나가고 참조비트가 0일 페이지는 교체
: 여러 프로세스가 수행될 때 메모리 공간을 할당하는 방법이 필요한데 이 때 할당 알고리즘이 사용된다.
프로세스를 정상적으로 수행하기 위해 적어도 일정 수준 이상의 페이지 프레임을 각 프로세스에 할당해야 한다.
반복문을 실행중이라면 반복문을 구성하는 페이지들을 한꺼번에 메모리에 올리는 것이 유리하다.
프로세스에게 최소한으로 필요한 메모리의 양은 시간에 따라 다를 수 있다.
: 집중적으로 참조되는 페이지들의 집합을 메모리에 한꺼번에 적재하지 못하면 페이지 부재율이 크게 상승해 CPU 이용률이 떨어질 수 있는데 이것을 스레싱이라고 한다.
: 메모리 내에 존재하는 프로세스의 수를 증가시키면 CPU 이용률은 이에 비례해 증가된다. 한계치를 넘어서면 CPU 이용률이 급격히 떨어져 스레싱이 발생해 CPU이용률을 최대한 높일 수 있도록 MPD를 조절해야 한다.
CPU 이용률을 높이고 스레싱을 방지하는 방법에는 워킹셋 알고리즘과 페이지 부재 빈도 알고리즘이 있다.
: 지역성 집합이 메모리에 동시에 올라갈 수 있도록 보장하는 메모리 관리 알고리즘.
프로세스가 일정 시간 동안 원활히 수행되기 위해 한꺼번에 메로리에 올라와 있어야하는 페이지들의 집합을 워킹셋이라고 정의.
프로세스의 워킹셋을 구성하는 페이지들이 한꺼번에 메모리에 올라갈 수 있는 경우에만 그 프로세스에게 메모리를 할당
: 집중적으로 참조되는 페이지들의 집합
: 프로세스의 페이지 부재율을 주기적으로 조사하고 이 값에 근그해 각 프로세스에 할당할 메모리 양을 동적으로 조절