티스토리 뷰

운영체제

[운영체제] 가상 메모리

Hani_Levenshtein 2021. 1. 23. 03:11

프로그램이 실행되기 위해선 반드시 RAM에 프로그램이 적재되어야 합니다.

그런데 사용하려는 프로그램들의 용량 합이 RAM의 용량보다 크다면 해당 프로그램들을 동시에 돌릴 수 없게 됩니다.

 

이런 문제점을 해결하기 위해 Backing Store에 프로세스의 사용하지 않는 부분을 저장시켜놓고 사용하는 부분만 RAM에 올려서 사용한다면 마치 SSD의 일부를 RAM과 같이 사용하는 것과 비슷한 효과를 낼 수 있습니다.

 

이렇게 SSD를 사용하면 마치 가상의 커다란 RAM을 사용하는 것과 같은데, 이를 가상 메모리라고 합니다.


Demand Paging

 

프로그램은 여러 개의 Instruction으로 이루어져 있지만 사용자가 프로그램의 모든 기능을 한 번에 사용하지는 않습니다.

이런 점을 고려했을 때, SSD에서 사용할 프로그램의 일부 주소들만 메모리에 할당해서 사용하면 좋을 것 같습니다.

 

지난 포스팅에서 프로세스를 Page나 Segment으로 나누는 것을 알았습니다.

그 중에서 현대의 OS는 대부분 프로세스를 Page로 나누는 방식을 취합니다.

사용자가 요구한 프로세스만 Page로 나눠서 적재시키고 사용하는 것을 Demand Paging이라고 합니다.

 

Page Table에는 Frame Number가 있어서 MMU가 Page Number와 Offset을 통해 물리 주소를 얻을 수 있었습니다.

여기서 Page Table에 해당 Frame에 Page가 있는지 없는지 확인하는 비트를 추가하면 메모리 참조가 용이해집니다.

 

비트 값을 확인해서 해당 Frame에 Page가 없으면 Backing Store에 존재하는 Page를 가져오면 됩니다.

마치 Page Table이 캐시처럼 작동하며, 지역성의 원리 덕분에 해당 Frame에 Page가 없을 확률은 낮습니다.


Page Fault

메모리에 찾으려는 Page가 없는 경우를 Page Fault라고 합니다.

Page Fault가 발생하면 Backing Store에서 해당 Page를 꺼내와야 하니 Page Table에서 꺼내올 때보다 느려지게 됩니다.

성능을 위해선 Page Fault가 가능하면 발생하지 않도록 만들어야합니다.

 

Pure Demanding Paging

처음 프로그램을 실행시키기 전에는 메모리엔 어떤 Page도 존재하지 않습니다.

때문에 첫 프로그램을 실행시킬 때는 반드시 Page Fault가 발생합니다.

Pure Demanding Paging는 항상 요구된 Page만 메모리에 올리는 방식으로, 메모리를 효율적으로 사용할 수 있습니다.

 

Prepaging

처음에 Page Fault가 반드시 발생하는 Pure Demanding Paging의 단점을 막기위한 방식입니다.

첫 프로그램이 실행되기 전에 요구될 것이라 예측되는 Page를 미리 메모리에 올림으로 Page Fault를 예방합니다.

단, 애써 올려놓은 Page가 실행되지 않을 경우 메모리가 낭비되는 단점이 발생합니다.


Page Replacement

Page가 메모리에 쌓여 더 이상 Page를 올릴 수 없는 경우, 기존 Page를 없애고 새 Page를 올려야합니다. 

여기서 어느 Page를 내려야 하는가에 대한 고민을 해야합니다.

 

쓰기 연산을 하지 않는 Page를 내릴수도 있고, 메모리에 있는 Page 중 가장 먼저 메모리에 적재된 것 또는 최근에 가장 쓰이지 않았던 Page를 내리는 방법도 있습니다.

'운영체제' 카테고리의 다른 글

[운영체제] 프레임 할당  (0) 2021.01.23
[운영체제] 세그멘테이션  (0) 2021.01.15
[운영체제] 메모리와 페이징  (0) 2021.01.01
[운영체제] 교착상태  (0) 2020.12.26
[운영체제] 프로세스 동기화  (0) 2020.12.24
댓글