[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/운영체제

[운영체제] 가상메모리 기법

inu 2020. 5. 25. 17:40
반응형

 

  • 한 프로그램이 수행되기 위해 정말 프로그램 '전체'가 메인메모리에 탑재되어야 할까?
  • 프로그램 일부만 탑재되어도 수행 가능하도록 하는 방법이 있다.
  • 이러한 생각을 바탕으로 구현된 메모리 경영기법이 가상메모리 기법이다.

가상 메모리 기법의 개요

  • 분할방법과 페이징은 전체 프로그램을 적재해야 하지만, 가상 메모리 기법은 일부만 적재하고도 프로그램 수행이 가능하다.
  • 사상 단위는 페이지테이블을 사용하는 페이징 기법과 똑같이 페이지이다.
  • 프로그램의 일부만 적재되는 만큼 논리공간의 크기보다 실제 필요 물리공간의 크기가 작다.
  • 프로그램은 적은 수의 프레임을 번갈아가면서 이용하기 때문에 '프로그램 오버레이'가 가능해지고, 메모리 활용도도 증대된다.

가상 메모리 기법의 개념

  • 각 페이지가 메인메모리의 프레임 중 적절한 곳에 탑재된 후, 해당 프레임 번호가 페이지 테이블에 기록되는 것은 페이징 기법과 동일하다.
  • 페이지 테이블에는 프레임 번호뿐만 아니라, 유효/무효(vaild/indvalid) 등의 정보도 기록될 수 있다. 가상메모리 기법에서는 해당 유무효 표시 비트의 역할이 매우 중요하다.
  • 메인메모리에 프로그램의 일부를 실을텐데, 이러한 유무효 표시 비트를 활용해 메인메모리에 탑재되는 페이지만 유효표시를 해두는 것이다.
  • 이러한 유무효 표시비트를 전환해가면서 필요한 부분을 불러오는 조치를 취하는 것이 가상 메모리 기법의 핵심이다. 

요구 페이징(Demand Paging)

  • 일부 페이지만 가지고 프로그램 수행을 하다보면 분명 다른 페이지가 필요한 순간이 생긴다. 해당 순간은 페이지 테이블의 유무효 비트를 통해 판단된다. 이렇듯 현재 탑재되지 않은 페이지가 발생하는 것을 페이지 부재(Page fault)라고 부른다.
  • 즉, page fault가 발생하면 그 때 해당 페이지를 탑재한다. 이를 요구 페이징(demand paging)이라 부른다.
  • demand paging은 page fault를 일종의 오류로 보고 트랩으로 처리된다. 해당 트랩이 발생하면서 page fault 트랩을 담당하는 루틴이 가동되는 것이다.
  • 예를 들어 load M이라는 명령어를 수행하다 page fault가 발생하면 page fault 트랩을 처리하기 위해 루틴이 가동되고, 하드디스크 상에서 해당 페이지를 찾아 물리메모리상에 탑재한다. 그리고 페이지테이블에서 표기된 유무효 표시비트도 v(valid, 유효)로 바꾸고 원래 수행하던 load M 명령어를 재실행한다.

페이지 대치

  • demand paging을 수행 중 해당 페이지를 하드디스크에서 메인 메모리에 탑재하려할 때, free frame이 하나도 없는 경우가 있다.
  • 일반적으로 프로세스마다 해당 프로세스가 사용할 수 있는 프레임의 개수가 제한되어 있기 때문에 이런 경우가 더 자주 발생한다. (메인 메모리 전체에는 free frame이 있더라도 사용불가능)
  • 이 경우 페이지 하나를 하드디스크로 다시 내보내고, 현재 fault된 페이지를 탑재해야 한다. 이 과정을 페이지 대치(page replacement)라고 한다.
  • 희생될 페이지를 내보내고, 해당 페이지의 유무효 비트를 페이지 테이블에서 i(invalid, 무효)로 변경한다. 그리고 원하는 페이지를 가지오고, 해당 페이지의 유무효 비트를 페이지 테이블에서 v(valid, 유효)로 변경한다.
  • 여기서 핵심은 '어떤 페이지가 희생될 것이냐' 이다. 해당 작업에 사용되는 알고리즘들이 있는데, 이에 대해서는 추후 알아볼 것이다.
  • cf. 만약 페이지에서 read만 일어나고 write는 일어나지 않았다면 굳이 해당 페이지를 하드디스크로 write back 해줄 필요가 없다. 따라서 이를 판단하기 위해 페이지 테이블에 dirty bit 혹은 modify bit를 둔다. 한 바이트라도 write가 일어나면 해당 비트값이 1이되어 확인이 가능하다.
  • 종합적으로 볼 때 가상메모리의 페이지 테이블에서는 '유효무효 비트'와 '오염비트(dirty bit or modify bit)'가 추가적으로 필요함을 알 수 있다.

프로그램 부분 적재의 타당성

  • 이러한 demand paging이 가능한 이유는 프로그램 구동 시 보통 전체보단 일부를 필요로 하기 때문이다.
  • 이러한 현상을 참조의 지역성(locality of reference)라고 한다.
  • 따라서 page fault는 생각보다 자주 일어나지 않고, 그 때마다 페이지를 로딩해도 수행상에 큰 문제가 없게 되는 것이다.
  • 이러한 부분적재법은 프로그램 크기가 물리메모리 용량에 무관해짐에 따라 더 많은 프로그램이 메모리에 탑재될 수 있게된다. 그에 따라 cpu사용률과 처리율이 향상된다. 또한 자연스럽게 주소 결속을 실행 시간에 할 수 있게 되면서 프로그램의 일부 수정 배포가 실행시간 중에도 가능해진다.
  • 이러한 부분적재는 page fault 발생빈도(page faul rate)를 낮추는 것이 핵심이다. 이와 관련된 이슈에는 페이지 대치 알고리즘, 프레임 개수, 페이지 크기, 쓰레싱 등이 있는데, 앞으로 하나씩 알아보게 될 것이다.

 

반응형

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

[운영체제] 프레임 개수  (0) 2020.05.31
[운영체제] 대치 알고리즘  (0) 2020.05.25
[운영체제] 세그먼테이션  (0) 2020.05.21
[운영체제] 페이지 테이블  (0) 2020.05.19
[운영체제] 페이징  (0) 2020.05.16