Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions 이헌식.8장 - 가상 메모리.10월 24일.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
프로그램이 CPU에서 실행되려면 실행에 당장 필요한 부분이 메모리에 올라와 있어야 한다.
프로그램이 실행되기 위해 그 프로세스의 주소 공간 전체가 메모리에 일라와 있어야 하는것은 아니며, CPU에서 당장 수행해야 할 부분만 메모리에 올려놓고 그렇지 않은부분은 디스크에 스왑영역에 내러 놓았다가 필요해지면 메모리에 올라가 있는 부분과 교체하는 방식을 사용하게 된다. 프로세스마다 각각 0번지 부터의 주소 공간을 가지게 되며, 이들 공간 중 일부는 물리적 메모리에 적재되고 일부는 디스크의 스왑 영역에 존재하는하는 것을 가상 메모리라 한다.

# 1.요구페이징
프로그램 실행시 프로세스를 구성하는 모든 페이지를 한꺼번에 메모리에 올리는 것이 아니라 당장 사용될 페이지만을 올리는 방식을 말한다.
당장 실행할 페이지만을 메모리에 올리게 되므로, 메모리 사용량이 감소하고 입출력 오버헤드도 줄어든다. 프로그렘이 물리적 메모리의 용량 제약을 벗어 날 수 있도록 한다는 점이 매력적인데, 프로그램을 구성하는 페이지 중 일부만을 메모리에 적재하게 되므로 물리적 메모리의 용량보다 큰 프로그램도 실행할수 있데 된다.
CPU가 참조하려는 페이지가 현재 메모리에 올라오 있지 않아서 유효-무효 비트가 무효로 세팅되어 있는 경우를 우리는 페이지부재가 일어났다고 말한다.

**페이지 부재**란 메모리에 적재된 페이지 중 사용 페이지가 없을 때를 의미한다.
시스템의 종류에 따라 약간 다를 수 있으나 대체로 빈 페이지가 하나도 없거나 미리 정한 수보다 적을때 발생한다.페이지 부재가 발생하면 해당 페이지를 가상 메모리에서 찾아야한다.
이때 운영체제가 페이지 부재를 해결하는 과정을 요구 페이징이라고 한다

요구페이징을 수행하는 과정으로는 CPU가 물리메모리를 확인하여 페이지가 없으면 trap을 발생하면,운영체제는 CPU의 동작을 잠시 멈춘다.

> 트랩(Trap)은 어떤 프로세스가 특정 시스템 기능을 사용하려고 할 때 그 기능을 운영체제에게 요청하는 방법을 말한다.

운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는 확인하고 없으면 프로세스를 중단한다. 페이지 폴트이면, 현재 물리 메모리에 비어있는 프레임이 있는지 찾는다.
비어있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화한다.
중단되었던 CPU를 다시 시작한다. 페이지 폴트이면, 현재 물리 메모리에 비어있는 프레임이 있는지 찾는 과정에서 페이지 교체 알고리즘이 사용된다.

- 요구 페이징의 페이지 부재 처리
CPU가 무효 페이지에 접근하면 주소 변환을 담담하는 하드웨어인 MMU(Memory Management Unit)가 페이지 부재 트랩을 발생시키게 되고, CPU의 제어권이 커널모드로 변경되고 운영체제의 페이지 부재 처리 루틴이 호출됩니다.

운영체제가 해당 페이지에 대한 접근하기 위해 주소가 유효한지 확인을 한후 범위를 벗어나는 영역에 속한 페이지 접근이나 접근 권한 위반을 할 경우 프로세스를 종료시킵니다. 그리고 접근이 가능한 경우 물리적 메모리에 비어 있는 프레임을 할당받습니다. 비어 있는 프레임이 없다면 기존에 메모리에 올라와 있는 페이지 중 하나를 디스크로 내보내는 스왑 아웃과정을 거쳐 디스크로부터 메모리 적재는 오랜 시간이 걸리기 때문에 페이지 부재가 발생한 프로세스는 CPU를 반납하고 PCB에 현재상태를 저장 후 봉쇄 상태가 됩니다. 그 후 디스크 입출력이 완료되어 인터럽트가 발생하면, 해당 페이지의 유효-무효 비트를 유효로 수정합니다. 그 후 봉쇄되었던 프로세스를 준비 큐로 이동시킵니다. CPU를 할당 받고 PCB로부터 저장한 값을 복원시켜 중단되었던 명령부터 실행을 이어갑니다.



- 요구 페이징의 성능
요구 페이징 기법의 성능에 가장 큰 영향을 주는 요소는 페이지 부재의 발생 빈도이다. 페이지 부재가 일어나면 요청된 페이지를 메모리로 읽어오는 막대한 오버헤드가 발생하게 되기 때문에 요구 페이징 성능은 요청한 페이지를 참조하는 데 걸리는 유효 접근시간으로 측정한다.
스왑 영역에서 요청된 페이지를 메모리로 다 읽어왔으면 인터럽터를 통해 프로세스가 실행을 재개 할 수 있는 상태로 바꾸어 주고 자신의 차례가 되면 문맥교환을 통해 다시 CPU 제어권을 얻게 된다.


# 2.페이지 교체

요청된 페이지를 디스크에서 메모리로 읽어올 때 물리적 메모리에 빈 프레임이 없을 경우 메모리 페이지 중 하나를 디스크로 쫒아내는 작업이 필요한데 이를 페이지 교체 라고 한다. 어느 프레임에 있는 페이지를 쫒아낼 것인지 결정하는 알고리즘을 교체 알고리즘이라고 하는데 이 알고리즘의 목표는 페이지 부재율을 최소화하는 것이다. 알고리즘의 성능은 주어진 페이지 참조열에 대해 페이지 부재율을 계산함으로써 평가할 수 있다. 페이지 참조열은 참조되는 페이지들의 번호를 시간순으로 나열한 것이다.


1)최적 페이지 교체

빌레디의 최적알고리즘: 페이지 부재율을 최소화하기 위해 페이지 교체시 물리적 메모리에 존재하는 페이지 중 가장 먼 미래에 참조될 페이지를 쫒아 내는 것. 이 알고리즘은 미래에 어떤 페이지가 어떠한 순서로 참조될지 미리 알고있다는 전체하에 사용하므로 실제 시스템에서 온라인으로 사용 할 수 있는 알고리즘은 아니다. 따라서 이러한 알고리즘을 오프라인 알고리즘이라 부르고, 빌레디의 오프라인 최적 알고리즘은 어떠한 알고리즘을 사용할 때보다도 가장 적은 페이지 부재율을 보장하므로 다른 알고리즘 성능에 대한 상한선을 제공한다.

2) 선입선출 알고리즘
페이지 교체 시 물리적 메모리에 가장 먼저 올라온 페이지를 우선적으로 내쫒는다. 페이지의 향후 참조 가능성을 고려하지 않기때문에 비효율적인 상황이 발생할 수 있다. 그림을 참고하면 페이지 프로임이 3개인 경우 9번의 페이지 부재가 발생했으나 페이지 프레임이 4개인 경우 오히려 페이지부재가 10개로 증가했다. FIFO 알고리즘에서 메모리를 증가시켰음에도 페이지 부재가 오히려 늘어난 상황을 FIFO(First In First Out)의 이상 현상이라 부른다.

3) LRU 알고리즘
메모리 페이지의 참조 성향 중 중요한 성질로 시간지역성이라는 것이 있는데, 최근에 참조된 페이지가 가까운미래에 다시 참조될 가능성이 높은 성질을 말한다. LRU 알고리즘은 이 같은 성질을 활용해서 페이지 교체 시 가장 오래전에 참조가 이루어진 페이지를 쫒아낸다. 즉 마지막 참조 시점이 가장 오래된 페이지를 교체한다.

4) LFU 알고리즘

LFU 알고리즘은 페이지의 참조 횟수로 교체시킬 페이지를 결정한다. 물리적 메모리 내의 페이지중 가장 참조 횟수가 적었던 페이지를 쫒아내고 여러개인 경우 임의로 하나를 선정하고 LFU 알고리즘은 참조 횟수를 계산하는 방식에 따라 두가지로 나뉜다. Incache-LFU는 페이지가 물리적 메모리에 올라온 후부터의 참조 횟수를 카운트. 페이지가 메모리에서 쫒겨났다가 돌아온 경우 다시 1부터 시작 Perfect LFU는 메모리에 올라와있는지 여부에 상관없이 모든 참조 횟수를 카운트, Perfect-LFU는 페이지의 참조 횟수를 정확히 반영할 수 있다는 장점이 있지만, 메모리에서 쫒겨난 페이지의 참조기록까지 모두 가지고 있어야 해서 오버헤드가 크다.
LFU는 LRU보다 오랜시간 동안의 참조기록을 반영 할 수 있다는 장점이 있지만 LFU는 시간에 따른 페이지 참조의 변화를 반영하지 못하고 LRU보다 복잡하다는 장점이 있다.


5) 클럭 알고리즘
LRU와 LFU는 페이지의 참조 시각 및 참조 횟수를 소프트웨어적으로 유치하고 비교해야 해서 시간적 오버헤드가 발생. 클럭 알고리즘은 하드웨어적인 지원을 통해 이와 같은 알고리즘의 운영 오버헤드를 줄인 방식. LRU를 근사시킨 알고리즘으로 NUR 또는 NRU 알고리즘으로도 불린다. 클럭 알고리즘은 오랫동안 참조되지 않은 페이지 중 하나를 교체하고 최근에 참조되지 않은 페이지를 교체 대상으로 선정하는 측면에서 LRU와 유사하지만 교체되는 페이지의 참조 시점이 가장 오랟 ㅚ었다는 것을 보장하지 못한다는 점에서 LRU를 근사시킨 알고리즘으로 볼 수 있다. 하지만 이 알고리즘은 하드웨어적인 지원으로 동작하기 때문에 페이지 관리가 훨씬 빠르고 효율적이다. 클럭 알고리즘은 교체할 때 페이지를 선정하기 위해 페이지 프레임들의 참조비트를 순차적으로 조사를 하고 참조비트는 각 프레임마다 하나씩 존재하며 그 프레임 내의 페이지가 참조될때 하드웨어에 의해 1로 자동 세팅된다. 클럭 알고리즘은 참조비트가 1인 페이지는 0으로 바꾼 후 그냥 지나가고 참조비트가 0인 페이지는 교체한다. 모든 페이지 프레임을 다 조사한 경우 첫번째 프레임부터 다시 조사를 한다. 자주 사용되는 페이지라면 시계바늘이 한바퀴 도는 동안 참조비트가 1로 세팅되어 교체되지 않으므로 이 알고리즘은 최근에 참조가 일어나지 않은 페이지를 교체하는 알고리즘이라 할수 있다.



# 3.페이지 프레임의 할당
프로세스 여러 개가 동시에 수행되는 상황에서는 각 프로세스에 얼마칸큼의 메모리 공간을 할당할 것인지 결정해야 한다. 기본적인 할당 알고리즘은 세가지로 나누어 볼수있는데
균등할당 방식, 비례할당 방식,우선순위 할당 방식 중 균등할당 방식은 모든 프로세스에게 페이지 프레임을 균일하게 할당하고 비례할당 방식으로는 프로세스 크기가 다르다는 점에 착안하였고 크기에 비례하여 페이지 프레임에 할당을 한다고 한다 우선순위 할당 방식은 프로세스의 우선순위에 따라 페이지 프레임을 다르게 할당을하고, 프로세스 중 당장 CPU에서 실행도리 프로세스와 그렇지 않은 프로세스를 구분하여 전자에 더 많은 페이지 프레임을 할당을 한다.
할당 알고리즘만으로는 프로세스의 페이지 참조 특성을 반영하지 못할 우려가 있다 수행 중인 프로세스의 수가 지나치게 많을 경우 프로세스당 할당되는 메모리 양이 과도하게 적어질수 있기 때문에 CPU에서 명령을 실행할 떈 프로세스의 주소 공간 중 코드,데이터,스택 등 각기 다른 영역을 참조하기 때문에 여러 페이지를 동시에 참조하게 된다. 따라서 프로세스의 정상 수행을 위해서 적어도 일정 수준 이상의 페이지 프레임을 각 프로세스에 할당 해야함. 또한 반복문을 수행 중인 프로세스의 경우 반복문을 구성하는 페이지들을 한꺼번에 메모리에 올려 놓은 것이 유리하고 반복문을 구성하는 페이지 수보다 적은 양의 프레임을 할당한다면 매 반복마다 적어도 한 번 이상의 페이지 부재가 발생하기 때문이다.


# 4.전역교체와 지역교체

교체할 페이징를 선정할 때, 교체 대상이 도리 프레임의 범위를 정하는 방법 2가지가 있다.
전역교체 방법은 모든 페이지 프레임이 교체 댜상이 되는 것을 말하며, 지역교체 방법은 현재 수행중인 프로세스에게 할당된 프레임 내에서만 교체 대상을 선정하고 지역교체 방법은 프로세스마다 페이지 프레임을 미리 할당하는 것을 전제로 하지만 전역교체 방법은 프로세스마다 메모리를 할당하는 것이 아니라 전체 메모리를 각 프로세스가 공유해서 사용하고 교체 알고리즘에 근거해서 할당되는 메모리 양이 가변적으로 변하는 방법이다.
LRU 알고리즘으로 전역교체를 한다면 물리적 메모리에 올라와 있는 페이지 중 가장 오래전에 참조된 페이지를 교체를 하고 그 페이지가 어떤 프로세스인지 고려를 하지 않는다. 페이지 교체 시 다른 프로세스에 할당된 프레임을 빼앗아 올수 있는 방식이고 프로세스별 프레임 할당량을 조절하는 또 다른 방법이 될 수 있다.
LRU,LFU,쿨럭 등의 알고리즘을 물리적 메모리 내에 존재하는 전체 페이지 프레임들을 대상으로 적용하는 경우가 전역교체 방법이 된다. LRU, LFU등의 알고리즘을 프로세스별로 독자적으로 운영할 때에는 지역 교체 방법이 된다.

# 5.스레싱
프로세스가 원할히 수행되기 위해선 일정 수준 이상의 페이지 프레임을 할당받아야 함 집중적으로 참조되는 페이지들의 집합을 메모리에 한꺼번에 적재하지 못하면 페이지 부재율이 크게 상승해 CPU 이용률이 급격히 떨어지게 되는데 이 현상을 스레싱이라고 한다.

스레싱이 발생하는 시나리오는 OS는 CPU 이용률이 낮을 경우 메모리에 올라와 있는 프로세스의 수가 적다고 판단하여 준비 큐에 프로세스가 하나라도 있다면 CPU는 그걸 실행함로 쉬지 않고 일하게 됩니다. 그러나 CPU 이용률이 낮다는건 준비 큐가 비는 경우가 발생한다는 뜻이며 메모리에 올라와있는 프로세스 수가 너무 적어 이들 모두 입출력 작업을 함 으로써 준비 큐가 비는 경우가 발생했다는 뜻이므로 CPU 이용률이 낮으면 운영체제는 메모리에 올라가는 프로세스 수를 늘리게 된다. 메모리에 동시에 올라가 있는 프로세스의 수를 다중 프로그래밍의 정도 (MPD) 라고 부르고 쉽게 말하자면 CPU 이용률이 낮을 경우 운영체제는 MPD를 높이게 되는데 MPD가 과도하게 높아지면 각 프로세스에 할당되는 메모리양이 지나치게 감소하므로 원할한 수행이 방해된다. 최소한의 페이지 ㅍ레임도 할당받지 못하는 상태가 되어 페이지 부재가 빈번히 발생하고 페이지 부재가 발생하면 디스크 입출력 작업을 수반하므로 문맥교환을 통해 다른 프로세스에게 CPU가 이양된다. 이때 다른 프로세스 역시 할당받은 메모리 양이 지나치게 적으면 페이지 부재가 발생하고 그럼 또 다른 프로세스에게 CPU가 할당된다. 결국 준비 큐에 있는 모든 프로세스에게 CPU가 한차례씩 할당되었는데도 모든 프로세스가 페이지 부재를 발생시켜 시스템은 페이지 부재를 처리하느라 분주해지고 그에 따라 CPU 이용률을 급격히 떨어지게된다. 운영체제는 메모리에 올라와 있는 프로세스 수가 적다고 판단하고 MPD를 높이기 위해 또 다른 프로세스를 메모리에 추가를 하고 이로 인해 프로세스당 할당된 프레임 수가 더 적어져 페이지 부재는 더 빈번히 발생하게 되고 프로세스들은 서로의 페이지를 교체하며 스왑 인과 스왑 아웃을 지속적으로 발생시키고 CPU는 대부분의 시간에 일을 하지 않게 된다. 이를 스레싱이라 부르고 MPD와 CPU 이용률 의 상관관계를 살펴보면 어느 정도까진 비례하다 한계치를 넘어서면 CPU 이용률이 급격히 떨어지게 된다.
따라서 스레싱의 발생을 막으면서 CPU 이용률을 최대한 높일 수 있도록 MPD를 조절하는 것이 중요하며 워킹셋 알고르즘과 페이지 부재 빈도 알고르즘이 존재를한다.


1)워킹셋 (Working-Set) 알고리즘
프로세스는 특정 시간동안 일정 장소만을 집중적으로 참조하는 경향이 있는데 이때 참조 되는 페이지들의 집합을 지역셋(locality set)이라고 한다.
워킹셋 알고르짐에서는 프로세스가 원할히 수행되기 위해 한꺼번에 메모리에 올라와 있어야 하는 페이지들의 집합을 워킹셋이라 정의하고, 프로세스의 워킹셋을 구성하는 페이지들이 한꺼번에 메모리에 올라 갈 수 있을 경우에만 그 프로세스에게 메모리를 할당하고 그렇지 않을 경우에는 프로세스에게 할당된 페이지 프레임들을 모두 반납시킨 후 그 프로세스의 주소 공간 전체를 디스크로 스왑 아웃시킨다. 워킹셋 알고리즘은 메모리에 올라와 있는 프로세스들의 워킹셋 크기의 합이 프레임 수보다 클 경우 일부 프로세스를 스왑 아웃시켜서 남은 프로세스의 워킹셋이 메모리에 모두 올라가는 것을 보장을 하고 MPD를 줄이는 효과를 발생하는데 프로세스들의 워킹셋을 모두 할당한 후에도 프레임이 남을 경우 스왑 아웃되었던 프로세스를 다시 메모리에 올려서 워킹셋을 할당함으로써 MPD를 증가하게 되고 이러한 방식으로 MPD를 적절히 조절하여 스레싱을 방지한다. 윈도우의 크기가 너무 작으면 지역성 집합을 모두 수용하지 못할 우려가 있고 너무 크면 여러 지역성 집합을 수용할 수 있는반면 MPD가 감소해 CPU 이용률이 낮아질 유려가 있다.


2) 페이지 부재 빈도 알고리즘
프로세스의 페이지 부재율을 주기적으로 조사, 이 값에 근거해 각 프로세스에 할당할 메모리 양을 동적으로 조절을 하고 어떤 프로세스의 페이지 부재율이 시스템이 미리 정해놓은 상한값을 넘게 되면 이 프로세스에 할당된 프레임 수가 부족하다고 판단, 프로세스에게 프레임을 추가돌 할당한다. 이 때 할당할 빈 프레임이 없다면 일부 프로세스를 스왑 아웃시켜 메모리에 올라가 있는 프로세스 수를 조절하고 페이지 부재율이 하한값 이하로 떨어지면 프로세스에게 필요 이상의 많은 프레임이 할당 된 것으로 간주를 하고 할당된 프로세스의 수를 줄인다. 메모리내에 존재하는 모든 프로세스에 필요한 프레임을 다 할당한 후에도 프레임이 남는 경우 스왑 아웃되었던 프로세스에게 프레임을 할당함으로써 MPD를 높인다. 이러한 원리로 MPD를 조저하며 CPU 이용률을 높이는 동시에 스레싱을 방지한다.