Resident Set Size는 프로세스마다 어떻게 할당할지 page replacement 하기 전에 정해줘야 한다.
Resident Set Size를 결정하는 방법에는 두 가지 방법이 있다.
각 프로세스마다 일정한 개수의 페이지 프레임을 나누어 주는 것이다.
Page Fault 가 발생하면, 그 안에서 나누어준 페이지 프레임 안에서 교체할 페이지를 결정한다.
⇒ 각 프로세스에 할당된 페이지 프레임 수에 변화 X
프로세스마다 할당된 페이지 프레임 수에 변화 O
→ 할당되는 프레임 수가 늘어났다 줄어들었다 한다.
프로세스가 실행을 시작해서 끝날때까지 계속해서 할당하는 프레임 수가 늘어났다 줄어들었다 한다.
Fixed-allocation 보다 간단하다.
Resident Set Size 를 결정하는 방법에는 세가지 방법으로 구현할 수 있다.
나한테 할당된 페이지 프레임 중 버리는 페이지를 선택한다.
내 페이지를 버리고 내 페이지를 가져온다. 프레임 숫자에 변화가 없다.
존재하는 전체 페이지 프레임 중 버리는 페이지를 선택한다.
⇒ 따라서 어떤 프로세스는 할당되는 페이지 프레임 수가 증가하고 어떤 프로세스는 할당되는 페이지 프레임 수가 감소할 수 있다.
프로세스에게 정해진 갯수만큼 페이지 프레임을 할당한다.
LRU 방식을 사용할 수 있다.
Local Scope 로 교체되므로 Page Fault 숫자 기준으로 LRU 방식이 가장 효율적이다. LRU 는 공간적 overhead 와 특히 시간적 overhead 가 존재하므로 Global scope 에서는 사용될 수 없다.
→ 메모리 안의 전체, 모든 페이지가 가장 최근에 언제 사용됐는지 비교할 수가 없기 때문이다.
하지만, Local Scope 의 경우 나에게 할당된 페이지 수가 얼마 안되기 때문에 LRU 가 가능하다.
얼만큼 할당할 지 정하기 어렵다.
이 프로세스가 작업을 하는데 필요한 페이지 수
페이지 프레임에 제한 없이 이 프로세스가 원하는대로 페이지 프레임을 할당해주고 실제로 페이지를 얼만큼 사용하는지 확인하면,
처음에 프로세스가 실행을 하면 필요한 페이지 수가 증가해 새로운 페이지가 메모리가 막 들어온다. 어느정도 페이지가 들어오면, 더 이상 페이지가 안들어오고 그 상태로 계속 실행을 한다.
따라서 계속 일정한 working set 을 유지하다가 갑자기 어느 순간 다른 페이지들을 호출하면 다시 페이지 크기가 늘어난다.
working set 이 늘어 났다 줄어드는 것 처럼 보이는 이유는 기존의 있던 페이지들과 새로 들어온 페이지들이 합쳐져서 늘어나는 것처럼 보였지만 기존의 있던 페이지는 사용하지 않기 때문에 다시 working set 의 크기가 줄어든다.
어떤 프로세스도 처음 실행을 시작하면서 끝날때까지 필요한 페이지 수가 일정하지 않고 실행하며 계속 늘어났다 줄어들었다가를 반복 한다.
⇒ 새로운 페이지가 계속 필요하다.
페이지가 버려진 프로세스는 working set 이 줄어든다.
Page Fault 증가 → working set 이 증가하는 중
= 새로운 페이지가 계속 필요하다는 뜻
⇒ 따라서 더 많은 프레임 할당해서 필요한 working set 이 메모리 안에 들어올 수 있게 해준다.
이 과정에서 다른 프로세스의 페이지를 버린다. 아무거나 버리지 않고 use bit 가 0인 것을 버리므로 오랫동안 사용되지 않는 페이지를 버린다.
⇒ 즉, 페이지가 버려진 프로세스는 지금 working set 이 줄어드는 단계라는 것이다. 따라서 working set 이 줄어들어서 예전에 working set 이 컸을 때 가져왔던 페이지들이 이제 필요가 없어졌다는 뜻이다.
궁극적으로 working set == resident set 이 되면, 페이지 fault 가 일어나지 않는 것이다.
내가 필요한 만큼 다 메모리에 들어와 있으면 page fault 가 일어나지 않는다.
variable allocation 의 global scope 는 page fault 수를 줄이는데 가장 적합한 방식이다.
Fixed Allocation 는 page fault 가 일어나도 프레임을 더 할당해주지 않기 때문에 결국 working set이 전부 메모리에 들어올 수 없다.
→ 어떨때는 너무 부족하고 어떨때는 너무 널널하다.
variable allocation 의 global scope 의 가장 적합한 page replacement 는 clock 기법이다.
global scope 에서는 전체 시간을 비교할 수 없기 때문에 LRU 를 사용할 수 없다.
대부분의 OS 시스템에서 메모리를 관리할 떄 대부분 Paging 기법과 Virtual memory system 을 사용하고 모두 페이지 테이블과 TLB 를 이용해서 동적으로 relocation 을 진행한다.
단, 페이지 크기와 페이지 replacement 하는 알고리즘은 시스템 마다 조금씩 다르다.
Unix 는 두 가지 메모리 management 기법이 있다.
Dynamic Partitioning 을 사용한다.
buddy system 의 변형된 형태를 사용한다.
Two Memory Management Mechanism
Clock
기법의 문제점: 굉장히 오랫동안 페이지 교체를 하지 않은 경우, 모든 use bit 가 다 1이 될 것이다. 이후, 페이지를 교체해야할 할 때, 바늘이 움직이면서 전체 페이지 프레임들을 훑어봐야 하기 때문에 시간이 굉장히 오래걸린다.free frame
최대한 확보 할 수 있도록 설계한다. Reset the Referece Bit to 0
Clock
기법에서는 페이지 교체를 할 때 바늘이 움직였지만, UNIX 에서는 평상시에 계속 바늘이 움직이며 Referece Bit 를 0 으로 만든다.만약, 바늘이 한바퀴 다 도는데 한시간이 걸린다고 가정하면,
지금 시스템 상의 어떤 프레임의 use bit 가 1이라고 하면
→ 최근 한시간 이내에 사용이 되었다는 뜻이다.
use bit가 0이라는 뜻은 1시간동안 사용되지 않았다는 뜻이다.
따라서 바늘이 움직이는 속도를 당연히 OS 가 조절한다.
use bit 가 최근시간 T 동안 사용이 된 페이지와 사용이 되지 않은 페이지를 구분할 수 있게 한다.
Pages w/ Reference Bit 0 into Paged-Out List
쭉 움직이면서 reference bit 가 0인 페이지들(상당한 기간동안 사용되지 않은 페이지)을 Paged Out List 에 모아둔다.
버릴 페이지들을 모아둔 곳
페이지를 버릴 때 중요한 것은 이 페이지의 modify bit 가 1인지 0인지에 따라서 작업 내용이 달라진다.
이러한 페이지들을 쭉 모아둔 다음 이 중에 modify bit 가 1인 애들을 어느정도 Paged Out List
길이가 가 길어지면 하드디스크로 다 쓴다.
↳ 다 쓰고 나면 Paged Out List
에 있는 페이지들은 사실상 Free Frame 과 동일하다. 빈 공간과 똑같아 지는 것이다.
⇒ 평상시에 Free Frame 을 만들어 놓는 작업
하드디스크로 접근 할때는 접근할 때 가져가는 양보다 접근 횟수가 실행 속도에 영향을 많이 끼친다.
⇒ 모았다가 한꺼번에 버리는게 굉장히 중요하다.
⇒ 평상시에 free frame 을 만들어 확보해 놨다가 교체 할 때의 시간을 줄인다.
두 바늘이 움직이는 속도가 중요하다.
use bit 가 모두 0 이 된다. reference 해서 1로 바뀔 시간 X ⇒ Paged out list
가 길어진다.
모두 reference 되어서 use bit 가 모두 1 이 된다.
⇒ 두번째 바늘이 Paged out list
에 집어 넣을 페이지가 없다.
두 바늘이 너무 붙어있으면
Paged out list
가 길어지고, 두 바늘이 너무 떨어지면Paged out list
가 짧아진다.
⇒ 속도 조절을 해야한다.
Paged out list
의 길이를 보면서 두 바늘의 속도를 조절한다.ex) → 나는 항상 10개정도는 프레임을 빈 공간으로 가지고 있으면 좋겠다.
항상 일정한 개수의 Free Frame 확보하고, 페이지 교체가 필요한 시점에는 별도의 overhead 없이 바로 페이지 교체하도록 하는게 "Two Handed" Clock Page Replacement
→ Paged out list
에 넣어 놨다가 다시 필요해지는 경우도 있으므로 그냥 Paged out list
에서 빼면 된다. 다시 하드디스크에서 페이지로 가져올 필요가 없다.
→ 여기서 버려짐 ⇒ 진짜 사용하지 않는 페이지를 버린다는 의미