[ Page Frame 할당 ]
프로그램 여러 개가 물리적 메모리에 같이 올라와 있는데, 어떤 프로세스의 페이지인지 무관하게 그냥 가장 오래된 페이지를 쫓아냈다.
그런데 프로그램들이 CPU에서 실행이 되면서 Page Fault를 내지 않고 원활하게 실행이 되려면 일련의 페이지들이 다 같이 올라와 있어야 효율적이다.
예를 들어, Instruction을 실행할 때 Loop를 돌고 있는데 그 for 문에 속한 페이지가 3개라고 해보자.
그럼 이 프로그램한테 이 세 개의 페이지를 할당해야 Page Fault가 일어나지 않는다.
즉, for 문을 백만 번 돌고 있을 때, 이 프로그램에게 3개의 페이지만 할당해 주면 Page Fault가 일어나지 않는다.
만약 이 프로그램에게 Page 두 개를 할당시키면 100만 번 반복할 때 Page Fault가 계속 발생할 것이다.
프로그램별로 페이지 할당을 해주지 않으면 메모리에서 특정 프로그램이 Page Frame을 장악하는 현상이 발생할 수도 있다.
따라서, 각각의 프로그램마다 필요로 하는 페이지를 할당해서 Page Fault를 적게 나도록 해야 한다.
✓ Allocation problem
- 각 Process에 얼마만큼 Page Frame을 할당할 것인가?
✓ Allocation의 필요성
- 메모리 참조 명령어 수행 시 명령어, 데이터 등 여러 페이지 동시 참조 : 명령어 수행을 위해 최소한 할당되어야 하는 Frame의 수가 있음
- Loop를 구성하는 Page들은 한꺼번에 Allocate 되는 것이 유리함 : 최소한의 Allocation이 없으면 매 Loop마다 Page Fault
✓ Allocation Scheme
- Equal allocation
- 모든 프로세스에 똑같은 개수 할당
- 어떤 프로그램은 페이지를 많이 필요로 하고 어떤 건 적게 필요로 하면 비효율적임
- Proportional allocation
- 프로세스 크기에 비례하여 할당
- 균등 할당. 같은 프로그램이라 하더라도 시간에 따라 필요로 하는 페이지가 다를 수 있음
- Priority allocation
- 프로세스의 priority에 따라 다르게 할당
- CPU 우선순위가 높은 프로세스한테 페이지를 더 많이 할당해 주는 방법.
● Global Replacement
- 프로그램이 많음 메모리를 필요로 하면, 그 순간에는 메모리에 많이 올라오게 되며 상대적으로 다른 프로그램의 Page들은 쫓겨난다.
- 굳이 미리 할당을 하지 않고 그때그때 메모리 할당량이 조절하는 방법이다.
- Replace 시 다른 프로세스에 할당된 Frame을 빼앗아 올 수 있다.
- Process 별 할당량을 조절하는 또 다른 방법임
- FIFO, LRU, LFU 등의 알고리즘을 Global Replacement로 사용 시에 해당
- Working set, PFF 알고리즘 사용
● Local Replacement
- 프로그램에게 미리 메모리 할당을 하여 그 안에서만 페이지 교체를 하는 방법이다.
- 프로그램한테 페이지 할당을 한 다음에 새로운 페이지를 올려놓기 위해 Page를 쫓아내려면 다른 프로그램이 아닌 자신에게 할당된 프레임 내의 페이지를 쫓아내야 한다.
- 자신에게 할당된 frame 내에서만 Replacement
- FIFO, LRU, LFU 등의 알고리즘을 Process 별로 운영
● Thrashing
프로그램한테 메모리가 너무 적게 할당되어 Page Fault가 아주 빈번히 발생하는 경우를 Thrashing(스레싱)이라고 부른다.
x축은 메모리에 동시에 올라가 있는 프로그램의 수이며, 프로그램이 늘어날수록 어느 정도까지는 CPU 이용률이 높아진다.
프로그램 하나만 메모리에 올라가 있을 때, I/O 작업을 하러 가면 CPU가 낭비되어 CPU 이용률이 매우 낮다.
프로그램 두 개가 메모리에 올라가는 경우에는 프로그램 하나가 I/O를 하러 갔을 때, 다른 프로그램이 CPU 제어권을 잡아 일을 할 수 있다.
이렇게 계속 CPU 이용률이 올라가다가 어느 지점에 다다르면 CPU 이용률이 뚝 떨어진다. 이 시점이 Thrashing이 발생한 순간이다.
메모리에 동시에 올라가 있는 프로그램의 수가 많다는 건 각 프로그램이 갖고 있는 메모리 용량이 적다는 뜻이다.
프로세스에게 Page가 너무 적게 할당되면 CPU가 Instruction을 실행할 때, 그 페이지가 메모리에 없어서 I/O 작업을 해야 한다.
이때 CPU 제어권은 다른 프로그램에게 넘어가고, 그 프로그램을 실행하려는데 요청한 페이지가 또 메모리에 올라가 있지 않으면 I/O 작업을 또 해야 한다.
이런 식으로 Page Fault가 많이 발생해 CPU 이용률이 낮아진다.
그런데 운영체제는 CPU 이용률이 낮으면 프로그램을 메모리에 더 올려야겠다고 판단을 하기 때문에 프로그램을 계속해서 올린다.
프로그램을 올릴수록 메모리 용량이 더욱 작아지고 Page Fault는 더 자주 발생한다.
이렇게 되다 보면 어떤 프로세스가 CPU를 잡더라도 거의 무조건 Page Fault가 발생하며,
페이지를 쫓아내고 올리는 작업을 하다가 시간을 다 허비하고 실제로 CPU는 할 일이 없어서 한가한 상황이 되어버린다.
✓ 프로세스의 원활한 수행에 필요한 최소한의 Page Frame 수를 할당받지 못한 경우 발생
- Page Fault Rate이 매우 높아짐
- CPU Utilization이 낮아짐
- OS는 MPD (Multi-Programming Degree)를 높여야 한다고 판단
- 또 다른 프로세스가 시스템에 추가됨 (Higher MPD)
- 프로세스 당 할당된 Frame의 수가 더욱 감소
- 프로세스는 Page의 Swap In/Swap Out으로 매우 바쁨
- 대부분의 시간에 CPU는 한가함
- Low Throughput
이러한 현상을 막기 위해서 각 프로그램이 어느 정도 메모리를 확보할 수 있도록 동시에 메모리에 올라가 있는 프로그램의 수를 조절해 줘야 한다.
이러한 알고리즘이 Working Set과 PFF 알고리즘이다. 이 두 가지 알고리즘은 다음 포스팅에서 정리해 보도록 하겠다.