KOCW - 운영체제(이화여대 반효경 교수)
9장 가상 메모리
실제로 필요할 때 page를 메모리에 올리는 것
valid / invalid bit의 사용
invalid -> 사용되지 않는 주소 영역, 페이지가 물리적 메모리에 없는 경우
처음에는 모든 page entry가 invalid로 초기화
주소변환시에 invalid bit일 경우 -> page fault
page fault가 일어나면 CPU가 자동으로 운영체제에 넘어가게 됨 -> 운영체제가 CPU를 가지고 page fault가 발생한 page를 물리 메모리에 올리게 됨
잘못된 요청인지 확인(bad address, protection violation(접근 권한 침해)) => 잘못된 요청일 경우 abort process
Get an empty page frame(없으면 뺏어온다:replace)
해당 페이지를 disk에서 memory로 읽어온다.
(1) disk I/O가 끝나기까지 이 프로세스는 CPU를 preempt 당함(block)
(2) Disk I/O가 끝나면 page tables entry 기록, valid로 처리
(3) ready queue에 process를 insert
CPU 다시 프로세스에 할당 후 실행
Page replacement : 어떤 framd을 빼앗아올지 결정해야 함
곧바로 사용되지 않을 page를 쫓아내느 것이 좋음
Replacement Algorithm
* page-fault rate을 최소화하는 것이 목표
미래를 안다는 가정하에 진행하는 알고리즘(offline algorithm)
실제 시스템에 사용하는 것은 불가능
다른 실제 사용될 알고리즘의 upper bound 제공(이 알고리즘보다 더 좋은 결과를 낼 수가 없기 때문에)
Reference string : 왼쪽부터 순서대로 참조된 페이지
LRU는 가장 오래 전에 참조한 1번 페이지 삭제
LFU는 참조횟수가 1번으로 가장 적은 4번 페이지 삭제
LRU : 참조된 페이지들을 linked list 형태로 줄세우기(가장 최근에 참조된 페이지를 가장 끝에 줄 세움), 줄 세운 페이지 중 가장 앞에 있는 페이지 삭제
* 알고리즘 시간 복잡도 : O(1)
LFU : Heap 이용(정점 노드에 참조 횟수가 가장 적은 페이지를 배치)
* 시간 복잡도 : O(logn)
빠른 공간(캐쉬)에 어떤 것을 넣고 어떤 것을 쫓아낼지 정하는 기법
빠른 공간 : 물리적 메모리(개수가 한정 되어있음)
한 개의 요소를 교체하기 위해서 모든 요소를 순회하는 것은 시간적으로 매우 비효율적임 -> online으로 사용 불가능
Buffer caching이나 web acching의 경우 O(1)에서 O(logn)까지 허용
Paging system의 경우에는 LRU, LFU 사용 불가능 -> 사용하지 못하면 왜 설명했는가?
-> 실제로는 LRU, LFU 사용 못함
LRU를 근사시켜서 실제로 사용할 수 있도록 만든 알고리즘
각 페이지마다 0 또는 1이 적혀있음
1인 경우 최근에 사용된 페이지, 0인 경우 최근에 사용이 안된 페이지(정확한 LRU는 아니지만, 근사시킨 알고리즘)
NRU(Not Recently Used), NUR(No Used Recently) 라고도 불림
하드웨어가 페이지를 가져갔을 경우 1로 처리
시계바늘이 돌면서 0인 페이지를 만나면 해당 페이지를 교체, 1인 페이지는 0으로 처리
다시 돌아오는 동안에도 페이지가 사용이 되었으면 다시 1이 되어있을 것이기 때문에 LRU처럼 계속해서 쓰이는 페이지는 교체되지 않음
reference bit과 modified bit 함께 사용
reference bit = 1일 경우 최근에 참조된 페이지
modified bit = 1일 경우 최근에 변경된 페이지
각 프로세스마다 얼마만큼의 page frame을 할당할 것인가?
각 프로그램마다 최소로 필요한 메모리 공간(최소한 할당되어야 하는 frame)이 있음 -> 이 최소 공간이 없을 경우 매 루프마다 page fault가 발생할 것임
그렇기 때문에 각 프로세스마다 최소한의 page frame을 적절히 할당해주어야 한다.
Equal allocation : 모든 프로세스에 똑같이 할당
Proportional allocation : 프로세스 크기에 비례하여 할당
Priority allocation : 프로세스의 priority에 따라 다르게 할당
Global
* Replace시 다른 프로세스에 할당된 frame을 빼앗아 올 수 있다(경쟁, 다 뺏을 수도 다 뺏길 수도 있음.)
Local
* 각 프로세스에게 frame을 할당
X축은 메모리에 올라와 있는 프로세스의 개수로 이해하면 됨
Y축은 CPU 이용률, 개수를 늘림에 따라 올라가다가 급격히 떨어지는 구간이 존재 -> page fault로 인해 CPU가 쓰이지 않는 상황 thrashing
프로세스의 원활한 수행에 필요한 최소한의 page frame 수를 할당 받지 못한 경우
메모리에 너무 많은 프로그램이 올라가 있어서 CPU 이용률이 낮은데(page fault로 인해) 운영체제에서는 CPU 이용률이 낮기 때문에 프로세스를 메모리에 더 올리려고 한다. 위 그래프 상으로도 볼 수 있듯이 thrashing 이후 프로세스가 많아짐에 따라 CPU 이용률은 더 떨어지게 된다.
Thrashing을 막기 위한 방법
Locality set : 특정 시간에 집중적으로 참조되는 page들의 집합
프로세스는 특정 시간 동안 일정 장소만을 집중적으로 참조한다
Locality에 기반하여 프로세스가 일정 시간 동안 원활하게 수행되기 위해 한꺼번에 메모리에 올라와 있어야 하는 page들의 집합
만약 메모리가 부족하여 어떤 프로세스의 working set이 메모리에 올라가지 못할 경우 모든 메모리를 반납하고 프로세스를 swap out(suspend)시킨다. swap out된 프로세스는 working set이 보장받을 만큼의 메모리 여유가 생겼을 경우 다시 실행
Working set window를 통해 알아냄(과거를 통해 미래를 알아낸다)
과거에 델타만큼의 범위 내에서 사용된 페이지의 종류를 working set으로 판단
델타 범위를 10이라고 했을 때 두번째 경우에서는 2개의 페이지만 참조됐기 때문에 working set을 2개{3, 4}로 판단
여기서 정해진 working set을 통해서 프로세스를 메모리에 올릴지 말지 판단 -> Thrashing 방지
일정 page-fault를 유지시켜서 thrashing을 방지하는 알고리즘
page-fault rate의 상한값과 하한값을 둔다
page-fault rate이 상한값보다 클 경우 frame을 더 할당
반대의 경우에는 frame을 줄인다
빈 frame이 없을 경우 일부 process를 swap out
전체 메모리(최근엔 32->64비트 주소 체계 사용) 규모가 커지면서 페이지 크기가 더 커지고 있음
page table의 크기가 증가함(논리적인 주소, 페이지 수 가 늘어나기 때문에)
물리적인 메모리를 더 세밀하게 분할해서 사용(이 또한 page table의 증가를 야기함) -> 물리적인 메모리가 사용되면 인접한 위치의 메모리가 같이 사용될 가능성이 매우 높음 -> 정말 필요한 내용만 읽어왔기 때문에 또 다른 기계어를 실행하기위해 또 다른 메모리를 읽어야한다 -> page fault가 자주 발생, Disk transfer의 효율성 감소
필요한 정보만 메모리에 올라와서 메모리 이용 효율이 좋지만 Locality의 측면에서는 좋지 않음(인접한 메모리에 있는 정보까지 같이 읽어지기 때문에)