봉황대 in CS

[Chapter 9. 가상 메모리] 프레임의 할당 본문

Computer Science & Engineering/Operating System

[Chapter 9. 가상 메모리] 프레임의 할당

등 긁는 봉황대 2022. 8. 4. 22:19

* 본 글은 '운영체제(Operating System: Concepts) 9th edition'의 내용과 2021학년도 1학기에 수강한 '운영체제' 과목 강의 내용을 함께 정리하여 작성하였습니다.

 

프레임의 할당


여러 개의 프로세스들에게 가용 메모리 몇 프레임씩을 할당해야 하는지도 중요한 논의 사항이다.

 

프로세스 당 필요한 최소 프레임 수는 명령어 집합 아키텍처(instruction set architecture)에 의해서 결정되는데,

각 프로세스에게는 이 최소한의 프레임 수만큼은 할당되어야 한다.

만약 명령어 수행이 완료되기 전에 페이지 부재가 발생하면 그 명령어는 재실행되어야 하기 때문이다.

 

따라서 하나의 명령어가 참조하는 모든 페이지가 동시에 메모리에 올라와 있어야 해당 명령어의 수행이 끝날 수 있게 된다.

 

 

(예시)

명령어에서 간접 주소 사용이 가능하다면, 최소한 3개의 프레임을 필요로 하게 된다.

1. 명령어가 담긴 페이지

2. 명령어 상의 주소가 참조하는 페이지

3. 그 참조된 주소의 내용이 가리키는 페이지

 

만약 2개의 페이지만 갖고 있다면 페이지 부재율이 매우 높아지게 된다.

 

프레임의 개수와 페이지 부재율

프레임의 개수와 페이지 부재율은 역비례 관계에 있다.

페이지 크기가 고정되어 있을 때 프로세스가 사용할 수 있는 프레임 개수가 많을수록 일반적으로 페이지 부재율은 낮아진다.

 

단, 페이지 대치 알고리즘에 따라 일시적으로 Belady's Anomaly(벨러디 변이) 현상이 일어날 수 있다.

ex. FIFO

 

 

프레임 할당 알고리즘

여러 프로세스가 존재하는 경우 각 프로세스에 얼마나 많은 프레임을 할당해야 할지 결정하는 정책이 필요하다.

 

1. 균등 할당(equal allocation) 방식

모든 프로세스에게 똑같은 양의 프레임을 할당하는 방법이다.

할당 후 남은 프레임들은 가용 프레임 버퍼 저장소(free frame buffer pool)로 사용된다.

 

2. 비례 할당(Proportional Allocation) 방식

가용 메모리를 각 프로세스의 크기 비율에 맞추어 할당하는 방법이다.

 

프로세스 pi의 크기를 si라고 하고 Si의 합을 S라고 하자.

가용 프레임의 전체 개수를 m이라고 했을 때

프로세스 pi에게 할당되는 프레임 개수 ai는 다음과 같이 근사된다.

* ai는 최소 할당 수보다는 큰 정수로, 총 합은 m을 넘지 않도록 조정할 필요가 있음

 

3. 우선 순위 할당 방식

균등 할당과 비례 할당 방식은 모두 높은 우선순위와 낮은 우선순위 프로세스를 동등하게 취급하고 있으며,

프로그램의 크기에 따라 프레임을 할당해주고 있다.

 

우선순위 할당 방식은 비례 할당 방식을 사용하면서

프레임 비율을 프로그램의 크기가 아닌, 우선순위에 따라 프레임을 할당해주는 방식이다.

 

페이지 교체의 범주

1. 전역 교체 (global replacement)

프로세스가 교체할 프레임을 다른 프로세스에 속한 프레임을 포함한 모든 프레임을 대상으로 찾는 경우이다.

 

2. 지역 교체 (local replacement)

각 프로세스가 자기에게 할당된 프레임들 중에서만 교체될 희생자를 선택할 수 있는 경우이다.

프로세스에 할당된 프레임의 수는 변하지 않게 되며, 잘 안 쓰는 페이지 프레임이 있더라도 그것을 그대로 낭비하게 된다.

 

 

전역 교체의 경우 외부적 환경에 따라 프로세스가 매번 다르게 실행될 수 있다.

즉, 한 프로세스의 페이지 부재율은 그 프로세스가 어떠한 프로세스들과 함께 실행되느냐에 영향을 받게 된다는 것이다.

 

하지만 전역교체 알고리즘이 지역 교체 알고리즘보다 더 좋은 시스템 성능을 나타내기 때문에 더 많이 사용되고 있다.

 

비균등 메모리 접근 (Non-Uniform Memory Access, NUMA)

지금까지 우리는 모든 주 메모리는 동등하게 또는 적어도 동일하게 접근된다는 것을 가정해왔지만,

실제 많은 컴퓨터 시스템에서는 그렇지 않다.

 

 

비균등 메모리 접근 시스템(NUMA)은 복수의 CPU를 가진 시스템(다중 처리기 시스템)으로,

특정 보드 상의 CPU는 같은 보드의 메모리를 다른 보드의 메모리보다 더 빠르게 접근할 수 있다.

 

따라서 어느 페이지를 어느 프레임에 할당하느냐에 따라 성능에 커다란 영향을 미치게 된다.

프로세스가 현재 실행 중인 CPU에 가능한 가장 가까운 메모리 프레임이 할당되도록 하기 위해서 스케줄링 시스템도 수정이 필요하다.

 

* 가장 가까운 = 최소 지연 시간을 가진 = 최대한 CPU와 같은 보드에 장착된 메모리로 스케줄링되기를 원함

 

 

또한, 스케줄러가 프로세스가 마지막으로 실행된 CPU를 추적할 수 있게끔 수정할 수 있다면

각 프로세스를 직전에 실행된 CPU에 스케줄하고, 메모리 관리 시스템은 스케줄 된 CPU와 가까운 프레임 할당할 수 있게 될 것이다.

 

이를 통해 캐시 적중률은 상승하고 메모리 접근 시간은 감소할 것이다.

 

Copy-on-Write (쓰기 시 복사)

앞서 fork() 시스템 호출을 통해 부모 프로세스와 똑같은 자식 프로세스 생성할 수 있음을 보았다.

* 참고 : 2022.07.09 - [Computer Science/Operating System] - [Chapter 3. 프로세스] 프로세스 생성과 종료

 

fork() 시 자식 프로세스를 위해 부모 프로세스의 프레임들을 복제해주어야 하는데,

대부분의 자식들은 바로 exec() 시스템 호출을 하기 때문에 부모로부터 복사한 페이지들은 쓸모가 없어진다.

 

 

따라서 부모 페이지를 전부 복사해오는 대신, 쓰기 시 복사 방식을 사용하여 낭비를 줄이게 된다.

 

Copy-on-Write (쓰기 시 복사)

1. 자식 프로세스 시작 시 부모의 페이지를 공유하여 당분간 함께 사용하도록 한다.

이 페이지는 copy-on-write 페이지로 마크를 한다.

 

 

2. 만약 둘 중 한 프로세스가 공유 중인 페이지에 쓰기를 했을 경우, 그때 새로운 프레임을 생성하여 그 페이지의 복사본이 만들어진다.

 

 


* 페이지 복사본을 만들 때 빈 페이지는 어떻게 할당될까?

 

빈 페이지가 프로세스에게 할당되는 경우는 아래의 2가지가 존재한다.

1. Copy-on-write을 진행할 때

2. 스택, 힙 공간을 확장해야할 때

 

이때 미리 마련된 빈 페이지 집합(pool)에서 할당 가능한 페이지를 찾아 zero-fill-on-demand 기법으로 할당해주게 된다.

* zero-fill-on-demand 기법 : 페이지의 내용을 다 0으로 채워 이전 내용을 지움 (초기화)

 

 

반응형
Comments