가상 메모리(Virtual Memory)
가상 메모리란?
가상 메모리란?
원래는 실행되는 코드의 전부를 물리 메모리에 적재시켜야 하고, 메모리 용량보다 큰 프로그램을 실행시킬 수 없을 뿐 아니라 여러 프로그램을 동시에 메모리에 올리기에는 용량의 한계, 페이지 교체등 성능 이슈가 발생한다. 하지만 가상 메모리는 프로세스 전체가 메모리에 올라 오지 않더라도 실행이 가능하게 하는 기법이고 프로그램이 물리 메모리보다 커도 상관없다.
가상 메모리 역활
가상 메모리는 작은 메모리를 가지고도 얼마든 큰 가상주소 공간을 프로그래머에게 제공한다. 가상 주소 공간은 한 프로세스가 메모리에 저장되는 논리적인 모습을 가상메모리에 구현한 공간이다. 실제로 필요한 부분만 물리 메모리에 올리고 필요하지 않은 부분은 물리 메모리에 올리지 않는 것이다.
예를 들어, 한 프로그램이 실행되며 200KB를 요구하는데 실행까지 필요한 메모리 공간이 50KB이면, 실제 물리 메모리에는 50KB만 올라가고 나머지 150KB는 나중에 필요시에 요구하게 된다.
프로세스간의 페이지 공유
가상 메모리는 프로세스들이 메모리를 공유하는 것을 가능하게 해주고, 프로세스들은 공유 메모리를 통해 통신할 수 있다. Demanding-paging 기법을 사용하여 다른 프로세스의 각각의 페이지가 같은 프레임을 가르키도록 하면 공유 메모리를 사용할 수 있다.
Demand Paging
프로그램 실행 시작 시에 프로그램 전체를 물리 메모리에 적재하는게 아니라 초기에 필요한 것들만 적재하는 전략이며 가상 메모리 시스템에서 많이 사용된다. 가상 메모리는 대개 페이지로 관리되고, 프로세스 내의 개별 페이지들은 페이저(pager)에 의해 관리된다. 페이저는 프로세스 실행에 실제로 필요한 페이지들만 메모리로 가져오기 때문에 시간 낭비와 메모리 낭비를 줄일 수 있다.
페이지 교체
위에서 필요할 때 요구한다고 했는데 프로세스 동작에 필요한 페이지를 요청하는 과정에서 페이지 부재가 발생하게 되면, 원하는 페이지를 보조저장장치에서 가져오게 되는데 이 때 물리 메모리가 모두 사용중인 상황이라면 페이지 교체가 필요하다. 이때, 페이지 교체 알고리즘에 의해 희생될 페이지가 정해진다.
*페이지 부재: 메모리에 적재된 페이지중에 필요한 페이지가 없는 경우
페이지 교체 알고리즘
FIFO 페이지 교체(FIFO Page Replacement)
First In First Out으로 들어온 페이지 순서대로 페이지 교체 시점에 먼저 나가게 된다.
- 장점: 가장 간단한 방법으로 직관적이고 쉽다.
- 단점: 처음부터 활발하게 사용되는 페이즈를 교체해서 페이지 부재율을 높이는 부작용 초래 할 수도 있고 Belady Anomaly 현상이 발생할 수도 있다.
*Belady Anomaly: 페이지를 저장할 수 있는 페이지 프레임의 갯수를 늘려도 오히려 페이지 부재가 더 많이 발생하는 이상 현상
최적 페이지 교체(Optimal Page Replacement)
Belady Anomaly현상이 일어나지 않으며 앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체하는 알고리즘, 실제로 사용하기 보다 연구 목적을 위해 사용
- 장점: 알고리즘 중 가장 낮은 페이지 부재율
- 단점: 구현의 어려움 (어떻게 미리 파악할까?)
LRU 페이지 교체(Least Recently Used Page Replacement)
가장 오랫동안 사용되지 않은 페이지를 선택하여 교체하는 알고리즘으로 성능이 좋으며 많은 운영체제가 채택하고 있는 알고리즘이다.
LFU 페이지 교체(Least Frequently Used)
참조 횟수가 가장 적은 페이지를 교체하는 알고리즘
MFU 페이지 교체 (Most Frequently Used)
참조 횟수가 가장 많은 페이지를 교체하는 알고리즘
참고: https://github.com/JaeYeopHan/Interview_Question_for_Beginner
*틀린 부분이 있으면 언제든지 말씀해 주시면 공부해서 수정하겠습니다.