가상 메모리 배경
- 실행되는 모든 코드를 물리 메모리에 로드하고, 프로그램이 메모리 용량보다 크면 실행할 수 없었음 ⇒ 용량 문제, 페이지를 교체하면서 생기는 성능 이슈 발생
- 페이징, 세그먼트로 메인 메모리에 프로그램이 연속해서 들어갈 필요가 없어짐
- Locality Principle : 특정 값에 관계된 스토리지 위치가 자주 액세스되는 특성
→ 이 특성을 활용해서 모든 부분을 메모리에 올리지 않고, 관련된 부분의 메모리만 로드하면 됨 (불필요한 전체 프로그램을 메모리에 올릴 필요 없음)
⇒ 모든 주소를 가상으로 처리할 수 있게 됨
가상 메모리의 장점
- 물리 메모리 크기에 제약받지 않고 더 많은 프로그램을 동시에 실행할 수 있음 ⇒ 많은 프로그램을 메모리에 올림 ⇒ Ready State인 Precess가 많아짐 ⇒ CPU 이용률, 처리율 높아짐
- Swap에 필요한 입출력이 줄어들기 때문에 프로그램이 더 빠르게 실행됨
가상 메모리란?
- 가상 주소로 메모리를 참조할 수 있다
- 주로 보조기억장치에 위치하다가 필요할 때에만 메인 메모리에 저장 (Demand Paging)
- 실제의 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리함
- 작은 메모리를 가지고도 큰 가상 주소 공간을 프로그래머에게 제공함
가상 주소 공간
- 한 프로세스가 메모리에 저장되는 논리적인 모습을 가상메모리에 구현
- 프로세스가 요구하는 메모리 공간을 가상 메모리에 제공함으로써 현재 직접적으로 필요하지 않은 공간은 실제 물리 메모리에 올리지 않음
- 실행까지 필요한 Stack, Heap, Data, Code를 먼저 물리 메모리에 올리고, 나머지는 필요시에 요구한다
프로세스 간의 페이지 공유
- 가상 메모리에서는 여러 프로세스들 사이에서 시스템 라이브러리가 공유됨
- 각 프로세스는 라이브러리의 물리 메모리 페이지는 모든 프로세스에 공유됨
- 프로세스들은 메모리를 공유하고, 공유 메모리를 통해 통신함
- 프로세스들은 각자 자신의 주소 공간이라고 인식함
- fork() 를 통해 프로세스를 생성하는 과정에서 페이지가 공유되는 과정을 포함함
Demand Paging
- 초기에 필요한 부분만 메모리에 로드하고, 필요할 때에만 디스크에서 가져옴 ⇒ 한 번도 접근되지 않은 페이지는 물리 메모리에 로드되지 않음
- 페이저 : 프로세스 내의 개별 페이지들을 관리하며, 실행에 실제 필요한 페이지들만 메로리로 읽어온다
- 장점
- 사용되지 않을 페이지를 가져오는 시간, 메모리 낭비를 줄일 수 있음
- 반응 속도가 빨라짐
- 더 많은 프로세스 실행 가능
- Page Fault Trap : 페이지를 처음으로 참조할 경우 Page Fault가 발생. OS에게 Trap을 보내 페이지를 로드하도록 한다
페이지 교체
- 프로세스의 동작 시에 필요한 페이지를 요청하는 과정에서 Page Fault 가 발생하면, 원하는 페이지를 보조저장장치에서 가져옴
- 이때 모든 물리 메모리가 사용중이라면 페이지 교체가 필요해진다.
- 메모리 교체 과정
1. 디스크에서 필요한 페이지의 위치를 찾는다
2. 빈 페이지 프레임을 찾는다
1. 페이지 교체 알고리즘을 통해 희생될 페이지를 고른다
2. 희생될 페이지를 디스크에 기록하고, 관련 페이지 테이블을 수정한다
3. 새롭게 비워진 페이지 테이블 내 프레임에 새 페이지를 읽어오고, 프레임 테이블을 수정한다
4. 사용자 프로세스를 재시작한다
페이지 교체 알고리즘
1. FIFO 페이지 교체
- 가장 간단한 페이지 교체 알고리즘
- 가장 먼저 물리 메모리에 들어온 페이지 순서대로 페이지 교체 시점에 나감
- 장점 : 쉽다
- 단점
- 오래된 페이지가 필요한 정보를 포함할 수도 있다
- 처음부터 계속해서 활발하게 쓰이는 페이지를 교체해서 페이지 Fault가 증가할 수 있다
- Belady’s Anomaly (Belady의 모순) : 페이지를 교체함으로써 저장할 수 있는 페이지 프레임의 개수를 늘려도 되려 페이지 Fault가 더 많이 발생하는 현상
2. 최적 페이지 교체 Optimal Algorithm
- 앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체한다
- 뒤에 들어오는 참조 요청들을 통해 결정해야 함 ⇒ 뒤의 요청을 미리 알고있어야 하므로 사실상 불가능함
- 장점 : 알고리즘 중 가장 낮은 페이지 Fault를 보인다
- 단점 : 모든 프로세스의 메모리 참조 계획을 미리 파악할 수 없다
3. LRU 페이지 교체 (Least Recently Used)
- 현재까지 가장 오랫동안 사용되지 않은 페이지를 선택하여 교체한다
- Time stamp (언제 썼었는지) , Page Stack 이 필요함 → 매 접근마다 이 변수들을 갱신해야 하는 Overhead가 있다
- FIFO 보다 우수함
4. LFU 페이지 교체 (Least Frequently Used)
- 참조 횟수가 가장 적은 페이지를 교체하는 방법
- 단점 : 어떤 프로세스가 특정 페이지를 집중적으로 사용하다 다른 기능을 사용하여 더이상 사용하지 않아도 계속 메모리에 머물게 되는 상황 발생할 수 있음
5. MFS 페이지 교체 (Most Frequently Used)
- 참조 횟수가 가장 작은 페이지가 최근에 메모리에 올라왔고, 앞으로도 계속 사용될 것이라는 가정에 기반
참고
https://jwprogramming.tistory.com/18
https://velog.io/@codemcd/운영체제OS-16.-페이지-교체-알고리즘