OS

[운영체제(OS)] 10장 가상 메모리

nannara 2023. 8. 7. 18:59

 준비하면서 정리했습니다. 문제가 되면 삭제하겠습니다.

 

1. 물리 메모리의 한계 

 

주소 공간과 물리 메모리 

 

- 32bit CPU가 액세스할 수 있는 물리 메모리의 최대 크기는 2^32 byte = 4GB 

- 1개의 주소가 가리키는 크기는 메모리 한 바이트이다.  

- 대부분의 시스템에서 물리메모리는 비용 때문에 프로세스의 주소 공간보다 작게 설치 된다. 

 

물리 메모리의 크기 한계 

 

Q. 운영체제는 물리 메모리 보다 큰 프로세스를 실행할 수 있는가? 

Q. 운영체제는 여러 프로세스를 합쳐 물리 메모리보다 클 때 이들을 동시에 실행시킬 수 있는가? 

A. “프로세스가 실행 되려면 반드시 프로세스 전체가 물리 메모리에 적재된다” 

   “프로세스는 필요한 모든 메모리를 할당 받은 상태에서 실행된다” 라는 두가지 전제가 있을 경우 대답은 NO 

 

 

2. 상 메모리 개념 

 

가상 메모리 개요 

 

- 가상 메모리는 물리 메모리보다 큰 프로세스나 여러개의 작은 프로세스를 동시에 실행시켜, 사용자나  

 응용프로그램에게 무한대의 메모리가 있다고 느끼도록 하는 메모리 관리 기법 

- 프로세스의 적재 공간을 메모리에서 보조 기억 장치(backing store)의 영역으로 확장한다.(이 장에서는 하드디스크) 

- 가상 메모리는 운영체제마다 구현 방법이 다르다. 

- 가상 메모리 기법의 핵심 

 1) 물리 메모리를 디스크 공간으로 확장 

 2) 스와핑 (swapping) 

 

가상 메모리 기법 

 

1) 물리 메모리의 영역을 하드 디스크 까지 연장 

- 프로세스를 물리 메모리와 하드 디스크에 나누어 저장 

 

2) 프로세스가 실행 될 때, 일부 필요한 코드만 메모리에 적재.  

- 나머지는 하드 디스크에 저장하고, 필요할 때 물리 메모리로 이동시킨다 

 

3) 빈 영역 확보 

- 프로세스를 구분하지 않고 물리 메모리의 일부분을 하드디스크에 옮겨 물리 메모리의 빈 영역 확보 

- 가능한 많은 프로세스 적재하여 다중 프로그래밍 정도를 높인다. 

 

4) 스왑 영역 

- 물리 메모리를 확장하여 사용하는 디스크 영역을 스왑 영역(swap area)라고 부른다. 

- 스왑 아웃(swap- out): 물리 메모리에 빈 영역을 만들기 위해 물리 메모리의 일부를 디스크로 옮기는 작업 

- 스왑(swap-in): 스왑 영역으로부터 물리 메모리로 적재하는 과정  

 

장점 

- 메모리 크기 걱정 X 

- 사용자는 어떤 부분이 어느 위치에 있는지 알지 못한다. 

 

가상 메모리 구현 

 

1) 요구 페이징 (demand paging) 

- 페이징 기법을 토대로 프로세스의 일부 페이지들만 메모리에 적재하고, 나머지는 하드 디스크에 두며, 

 페이지가 필요할 때 메모리를 할당 받고 페이지를 적재시키는 메모리 관리 기법 

- 페이징 + 스와핑 

 

2) 요구 세그먼테이션 (demand segmentatiion) 

 

 

 

 

3. 요구 페이징 (demand paging) 

 

 요구 페이징 개념 

 

- 물리 메모리의 크기 한계를 극복하기 위해 페이징 기법을 기반으로 만들어진 가상 메모리 기법 

- 프로세스를 실행시킬 때 실행에 필요한 첫 페이지만 물리 메모리에 적재하여 실행 

- “요구(demand)”는 페이지가 필요할 때 까지 물리 메모리에 적재하지 않고 두었다가,  

  페이지가 필요할 때 물리 메모리를 할당 받고 디스크에서 읽어 적재 시킨다는 의미 

 

요구 페이징 구성 

1) 디스크의 스왑 영역 

- 메모리에서 쫓겨난 페이지들이 저장되는 영역 

- 리눅스의 경우 디스크 내에 특정 위치를 정해서 사용하거나, 하드 디스크를 포맷할 때 스왑 파티션을 만들어 사용 

- windows의 경우 특정파일(C:\pagefile.sys)스왑 영역으로 사용 

 

2) 페이지 테이블 

- 요구 페이징을 위해 페이지 테이블에 다음 3개의 필드 사용 

1) presence/vaild 비트 - 페이지가 메모리에 적재되어 있는지 나타내는 비트 

- 이 비트가 1이면 페이지가 물리 메모리에 있고, 0이면 디스크에 있다. 

2) modified/dirty 비트 - 페이지가 메모리에 적재된 후 수정되었는지 나타내는 비트 

- 1이면 해당 페이지가 물리 메모리에 적재된 후 수정. 0 이면 수정된 적 X 

3) physical address 필드 

- presence =1 일 경우필드에 물리 프레임의 번호 기록, 0일 경우 디스크 주소(디스크 블록) 기록 

 

3) 페이지 폴트 (page fault) 

- CPU가 가상 주소를 발생시켜 액세스 하려는 페이지가 현재 물리 메모리에 없을 때 페이지 폴트라고 한다. 

- presence 비트 0 인경우 = 물리 메모리에 페이지가 없음. 

이 경우 

1)  페이지 폴트 핸들러(page fault handler) 코드 실행 

2) 물리 메모리에서프레임 할당 받고, 요청된 페이지를 하드디스크에서 읽어 적재하여 페이지 테이블 수정 

4) 물리 메모리에 빈프레임 없는 경우 희생 프레임(victim frame) 선택  

5) (modified=1) 이 페이지를 스왑 영역에 저장. 

 

4) 페이지 히트 (page hit) 

- CPU가 발생한 가상 주소의 페이지가 메모리 프레임에 있을 경우 

 

페이지 폴트 자세히 알기 

 

1) CPU는 입력 값에 대한 가상 주소를 출력한다. 

2) MMU는 페이지 테이블에서 해당 주소를 검색 

3) p=0인 경우 MMU는 페이지 폴트 예외를 발생시킨다. 

4) 페이지 폴트 핸들러 실행 

5) 핸들러 새로운 데이터를 적재할 희생 프레임을 선택 

6) 희생 프레임이 메모리에 있는 경우, 희생 프레임을 스왑 아웃(swap-out) 

7) 새로운 데이터를  스왑 영역에서 찾는다. 만약 없으면 실행 파일에서. 

8) 새로운 데이터를 메모리에 적재 

9) 페이지 테이블 수정 p=1 

 

요구 페이지 시스템에서 프로세스 실행 

 

 

1) 프로세스의 시작 페이지 적재 

- 운영체제는 메모리 프레임 1개를 할당 받고 실행 파일로부터 프로세스의 실행이 시작될 첫 페이지를 적재 후 실행 

 

 

2) 여러 번의 페이지 폴트를 통해 실행 파일로부터 페이지들 적재 

- 코드가 들어있는 페이지는 스왑 아웃 시키지 않으므로 항상 실행 파일로부터 적재한다. 

- n의 초깃값은 10. n=11 실행 할 경우 페이지 수정으로 m=1 

3) 메모리가 부족하면 스왑-아웃/ 스왑-인 

- 이 프로세스가 중단 되고 다른 프로세스로 컨텍스트 스위칭되었다. 

- 메모리가 부족해지자 핸들러는 페이지 100을 디스크로 스왑-아웃 p=0 으로 만든다. 

- 그 자리엔 다른 프로세스가 요청한 페이지가 적재  

 

4) 스왑-아웃된 페이지 100을 다시 스왑-인  

- n++을 실행하려니 페이지 폴트 발생 

- 핸들러는 빈 프레임 할당 받고 다시 실행 

5) 수정된 페이지는 스왑 영역에 쓰기 

- m=1이면 스왑영역에 기록, m=0이면 스왑 영역에 저장할 필요 X 

 

쓰기 시 복사(COW, copy on write) 

 

완전 복사 

int childPid = fork() // 시스템 호출로 현재 프로세스를 복사한 자식 프로세스 생성  

- 부모 프로세스의 메모리를 모두 복사하여 자식 프로세스를 만드는 것. 

 

완전 복사의 비효율성 

 

- 많은 응용프로그램들은 fork()로 자식 프로세스를 생성한 후  

 자식 프로세스가 exclp()을 이용하여 곧 바로 다음 프로그램을 실행 시키도록 작성되기 때문이다. 

쓰기 시 복사(copy on write, COW)로 완전 복사 문제 해결 

 

- 부모 프로세스의 메모리를 복사하지 않고 자식 프로세스가 부모 프로세스의 메모리를 완전히 공유 하도록 하고, 

 둘 다 실행되도록 내버려 둔다. 

- 자식 부모 중 쓰기가 실행 될 경우 쓰기가 발생한 페이지 새 프레임 할당 받아 복사  

- 읽는 경우에는 복사 X 

 

쓰기 복사 장점 

- 프로세스 생성 시간 절약 

- 메모리 절약  

 

페이지 폴트와 스레싱(thrashing) 

 

페이지 폴트와 디스크 I/O 

 

- 페이지 폴트가 발생하면 필연적으로 디스크 입출력 동반. 이를 줄여야함 

 

스래싱 (disk thrashing) 

 

- 페이지 폴트가 계속 발생하여 메모리 프레임에 페이지가 반복적으로 교체되어 

 디스크 입출력이 심각하게 증가하고 CPU 활용률이 대폭 감소하는 현상 

 

스레싱의 원인 

 

1) 다중 프로그래밍 정도가 과도한 경우 

2) 메모리 할당 정책이나 페이지 교체 알고리즘이 잘못되었을 경우 

3) 컴퓨터 시스템에 설치된 메모리가 절대적으로 작은 경우 

4) 우연히도 특정 시간대에 너무 많은 프로세스를 실행한 경우  

 

스레싱 현상 관찰 

 

- 스레싱이 발생했을 때 그대로 두면 CPU의 활용률이 떨어지고 프로세스들의 응답 시간이 떨어지며, 

 시스템 처리율이 심각하게 감소된다.  

- 동시에 실행 되는 프로세스의 개수가 임계점 M을 넘어갈 때 부터 CPU의 활용률이 떨어지는 현상을 볼 수 있다. 

 

해결방법 

 

- 프로세스 강제 종료  

- RAM의 량 늘리거나 하드디스크 대신 SSD 사용 

 

 

 

 

4. 참조의 지역성과 작업 집합 

 

프로그램의 실행 특성 

 

요구 페이징을 왜 계속 쓸까? 

1) 참조의 지역성 

2) 작업 집합 

 

참조의 지역성 

 

- CPU가 프로그램을 실행하는 동안 짧은 시간 범위 내에 일정 구간의 메모리 영역을 반복 참조 

 하는 경향이 있는데 이것이 참조의 지역성(locality of reference)이다.

- 프로세스의 실행 초기에는 페이지를 적재하느라 페이지 폴트가 자주 발생했지만, 일정 시간이 지나면 

 참조의 지역성으로 인해 적재된 페이지를 한 동안 액세스하기 때문에 페이지 폴트가 매우 드물게 발생 

 

참조의 지역성 형태 

1) 시간 지역성 (temporal locality) 

2) 공간 지역성 (spatial locality) 

 

작업 집합과 페이지 폴트 

 

작업 집합 

- 일정 시간 범위 내에 프로세스가 참조한(액세스한) 페이지들의 집합이다. 

 그러므로 작업 집합은 현재 프로세스의 실행에 필요한 페이지들의 집합이다. 

- 프로세스의 실행 중 갑자기 페이지 폴트계속 된다면 그것은 프로세스의 작업 집합 페이지를 

 메모리에 적재하고 있는 과정이라고 생각해도 된다. 

- 페이지 폴트 -> 작업 집합 형성 

 

작업 집합 형성 사례 

 

페이지 2, 100, 5, 20 <- 작업 집합 형성 

 

작업 집합과 시간 범위 

 

- 시간 범위가 클수록 작업 집합의 크기(작업 집합에 포함된 페이지의 개수)도 늘어난다. 

 

작업 집합(working set shift)의 이동 

 

- 프로세스가 실행되는 동안 시간에 따라 참조의 지역성이 다른 메모리 영역에서 나타나 작업 집합이 변해가는 현상 

-  새로운 작업 집합이 형성되는 과정에서 페이지 폴트가 급격히 발생하지만 곧 줄어들어 안정상태가 된다. 

 

* 여러 프로세스들에게서 작업 집합에 포함된 페이지들이 충분히 메모리에 올라와 있지 않는 경우에 스래싱이 발생* 

 

요구 페이징의 필수 알고리즘 

 

1) 프레임 할당 (frame allocation) 

- 프로세스에게 할당할 메모리 프레임의 개수를 결정하는 문제 

 

2) 페이지 교체 (page replacement) 

- 페이지 폴트가 발생했을 때 빈 메모리 프레임이 없는 경우, 희생 프레임 선택하는 문제  

 

 

 

5. 프레임 할당 

  

프레임 할당의 목표 

- 페이지 폴트를 줄이고 스래싱이 발생하지 않도록하기 위해 

 

할당 방법 

 

1) 균등 할당 (equal allocation) 

- 프로세스의 크기와 관계 없이 모든 프로세스에게 동일한 개수의 프레임을 할당하는 방법 

2) 비례 할당 (proportional allocation) 

- 프로세스 크기에 비례하여 프레임 할당 

- 프로세스의 크기를 명확히 알기 어렵다  

 

프로세스에게 할당할 적정 프레임 수  

 

작업 집합 > 프레임 

- 페이지 폴트 빈번. 스레싱 발생 

작업집합 < 프레임 

- 페이지 폴트 발생 X. 메모리 낭비  

 

 

 

6. 페이지 교체 

 

페이지 교체(page replacement)의 정의 

 

- 요청된 페이지가 메모리 프레임에 없고, 페이지를 적재할 빈 프레임도 없는 경우, 메모리 프레임 중 하나를 선택 

 하여 비우고 이곳에 요청된 페이지를 적재하는 과정이다. 

- 희생 프레임 : 비우기로 선택된 프레임 

- 희생 페이지 : 물리 메모리에 저장되어 있다가 쫓겨나는 페이지 

 

페이지 교체의 목표 

 

- 현재 작업 집합에 포함되지 않거나 가까운 미래에 참조 되지 않을 페이지를 희생 페이지로 선택하여  

 페이지 폴트의 횟수를 줄이는 것 

 

희생 프레임의 선택 범위 

 

1) 지역 교체 (local replacement) 

- 페이지 적재를 요청한 프로세스에게 할당된 프레임들 중 희생 프레임을 선택하는 방법(per-process replacement). 

2) 전역 교체 (global replacement) 

- 프로세스에 상관에 없이 전체 메모리 프레임 중에서 희생 프레임을 선택하는 방법. 

- 여러 운영체제들은 전역 교체를 사용하고 있다. (window는 혼합) 

 

페이지 교체 알고리즘 종류 

 

1) 최적 교체 (Optional page Replacement, OPT) 

2) FIFO ( First in First out) 

3) LRU (Least Recently Used) 

 

예시) 페이지들의 참조 순서: 2 4 3 1 5 3 7 100 1 6 1 100 

 

최적 교체 알고리즘(OPT) 

 

- 가까운 미래에 사용될 가능성이 가장 낮은 페이지를 희생 페이지로 선택. 

- 최고의 이상적인 방법이나, 실현 불가능. 미래에 언제 참조되는지 잘 모르기 때문 

FIFO 알고리즘 

 

- 메모리 프레임에 적재된 페이지들 중 가장 오래된 페이지를 희생 페이지로 선택한다. 

- 오래 전에 적재된 페이지들은 작업 집합에서 벗어나 앞으로 참조될 가능성이 낮을 것 

- 각 페이지마다 시간 정보를 저장. 하지만 이것은 부담 

- 프레임들을 적대된 시간 순서로 큐를 만들고, 새 페이지가 적대될 해당 프레임을 큐 끝으로 이동 

- 작업 집합을 고려하지 않아 성능이 낮다. 

LRU 알고리즘 

 

- 참조의 지역성 이용 

- 프레임에 적재된 페이지들 중 가장 오래 전에 참조된 페이지를 희생 페이지로 선택한다. 

- 최근에 참조된 페이지일수록 가까운 미래에 다시 참조  

 

방식 

1) 타임스탬프 이용 

- 모든 프레임에 참조 시간을 기록할 수 있는 비트들을 추가하는 방법 

- CPU가 페이지를 참조할마다 프레임에 현재 시간 기록 

- 비효율적. 오버헤드 발생 

 

2) 하드웨어 이용, 참조 비트 사용 

- 참조시간을 프레임에 기록하는 대신 페이지 테이블의 항목에 참조 비트(reference bit) 추가, 

 참조 비트가 0인 것들 중에서 하나를 선택  

- 커널은 주기적으로 페이지 테이블의 모든 항목에 참조 비트를 0으로 초기화 한다.  

- 성능은 좋지만 구현 복잡도 있음  

 

 

 

 

 

 

 

참고