가상 메모리(Virtual Memory)

Ilhwanee·2022년 9월 22일
0

CS

목록 보기
20/27
post-custom-banner

Virtual Memory

프로그램의 모든 부분을 메모리에 적재하게 된다면, 메모리의 크기는 한정적이기 때문에 비효율적일 것이다.

실제로는 코드의 일부적인 부분만 프로세스의 실행에 필요할 수 있으며 방어적인 코드와 같이 지금 당장 메모리에 올려도 되지 않는 코드들이 존재하기 때문이다.

따라서 프로세스 실행에 필요한 일부분의 코드만 메모리에 올리고, 나머지 부분은 디스크에 임시적으로 저장하며 필요할 때에 메모리로 올려서 사용하는 기술을 가상 메모리라고 한다.

가상 메모리를 사용하면 결과적으로 더 많은 프로세스를 메모리에 올릴 수 있기 때문에 효율적으로 메모리를 관리할 수 있다.

가상메모리를 구현하기 위해서는 MMU(Memory Management Unit)가 필요한데, 최근 아키텍처에는 CPU 코어안에 탑재된다.

MMU가 수행하는 역할은 다음과 같다.

  • 가상 주소를 실제 메모리 주소(물리 주소)로 변환
  • 메모리 보호를 위한 메모리 접근 제어(사용자, 커널 분리)
  • 캐시 메모리 관리


Demand Paging

요구 페이징이란 프로세스 실행 중 특정 페이지가 실제로 필요할 때 메모리에 올리는 것이다.

구현을 위해서는 페이지 테이블이 필요하다.
페이지 테이블의 인덱스는 페이지 번호를, 배열에 담고있는 숫자가 매핑할 프레임을 나타낸다.

가상 메모리의 일부분만 실제 메모리에 적재되기 때문에 메모리에 해당 페이지가 적재되어 있는지를 알아야 하는데, 이는 페이지 테이블의 vaild-invaild bit를 사용하여 구현한다.

vaild는 현재 메모리에 해당 페이지가 적재되어 있다는 것, invaild는 디스크의 swap 영역에서 메모리에 적재되기 위하여 대기 중이라는 것을 의미한다.

만약 프로세스 실행 중 invalid인 페이지가 필요하면, Page Fault 트랩이 발생한다.
Page Fault 처리 과정은 다음과 같다.

  • invaild 페이지 접근 시 MMU가 OS에 트랩을 건다.
  • 메모리에 비어있는 프레임을 찾는다.
  • 비어있는 프레임에 해당 페이지를 swap 영역에서 가져와 넣는다.
  • 페이지를 valid 상태로 만든다.
  • 트랩 완료를 CPU에 알린다.


profile
블로그 이전 -> https://pppp0722.github.io
post-custom-banner

0개의 댓글