운영체제에서 가상 메모리는 Vm라고 알려준 메인 메모리의 추상화를 제공하는 기술을 의미한다.
물리 및 가상주소 방식
메인 메모리는 M개의 연속적인 바이트 크기 셀의 배열로 구성된다.
각 바이트는 고유의 물리주소(PA)를 가진다. 첫번째 바이트는 주소 0, 다음 바이트 주소는 1..... 이런식으로 진행되고,
이와 같은 간단한 구조가 주어졌을때, CPU가 메모리에 접근하는 가장 자연스러운 방식은 물리주소를 사용하는 것.
이러한 접근법을 물리 주소 방식이라고 한다.
CPU는 가장주소지정으로 가상주소(VA)를 생성해서 메인 메모리에 접근하며, 이것은 메모미로 보내지기 전에 적절한 물리 주소로 변환된다.
가상주소를 물리 주소로 변환하는 작업은 주소번역 이라고 하며, 예외 처리처럼 주소 번역은 CPU 하드웨어와 운영체제 간에 긴밀한 협력을 필요로 한다.
CPU 칩 내에 메모리 관리 유닛(MMU)이라고 부르는 전용 하드웨어는 메인 메모리에 저장된 참조 테이블을 사용해서 실행 중에 가상주소를 번역하며 이 테이블 내용은 운영체제가 관리한다.
주소공간
주소공간은 비음수 정수 주소의 정렬된 집합이다.
주소공간의 정수가 연속적이라면, 이 공간은 선형 주소공간이라고 한다.
언제나 선형 주소공간이라고 가정하고 생각을 해보면, CPU는 가상 주소공간이라고 불리는 N = 2^n 주소의 주소공간에서 가상의 주소를 생성한다.
현대 시스템은 전형적으로 64비트 가상 주소공간을 지원한다.
또한 컴퓨터 시스템은 이 시스템 내의 M바이트의 물리메모리로 대응되는 물리주소공간을 갖는다.
M은 2 제곱일 필요는 없지만 단순하게 생각하기 위해 M = 2^m이라고 가정하겠다.
주소공간의 개념은 중요한데, 이 개념이 데이터 객체와 그들의 특성들 간에 명확한 구별을 해주기 때문이다.
구별을 인지함녀 일반화할 수 있고, 각 데이터 객체가 다중 독립 주소를 가질 수 있도록 하고, 각각의 주소는 서로 다른 주소공간에서 선택되었다. 이것은 가상메모리의 기본 아이디어이다.
캐싱 도구로서의 VM
가상메모리는 디스크에 저장된 N개의 바이트 크기의 셀 배열로 구성된다.
각 바이트는 특정한 가상주소를 가지며, 배열의 인덱스로 작용한다.
디스크 안의 배열정보는 메인 메모리의 캐시된다.
메모리 계층 구조안에 있는 캐시는 블록 단위로 분할되며, 디스크와 메인 메모리 사이에 징검다리 역할을 한다.
VM system은 가상 메모리를 규정된 사이즈 블록단위로 분할하여 관리한다.
분할된 블록들은 가상페이지라고 불리며 ,비슷하게 물리 메모리도 물리페이지로 분할되어 사용된다.
시간상의 어느 시점에서도 가상페이지의 집합은 세 개의 중첩되지 않는 부분집합으로 나뉜다.
Unallocated : VM 시스템에 의해 아직까지 할당죄 않은 페이지들을 의미한다. 비할당된 블록들은 이들과 관련된 데이터를 하나도 가지고 있지않고, 따라서 디스크 상에 어떤 공간도 차지하지 않는다.
Cached : 현재 물리 메모리에 캐시되어 할당된 페이지들
Uncached : 물리 메모리에 캐시되지 않은 할당된 페이지들
페이지 테이블
모든 캐시에서처럼 VM시스템은 가상페이지가 DRAM 어딘가에 캐시 되어있는지 결정하기 위한 방법을 갖고 있어야 한다.
그렇다면, 이 시스템은 어떤 물리페이지를 캐시했는지 결정해야한다.
만일 미스가 존재 한다면 시스템은 디스크 어디에 가상 페이지가 저장되어있는지 결정해야하고 물리 메모리 주에서 희생자 페이지를 선택해야하고, 가상페이지를 디스크에서 DRAM으로 복사해서 희생자 페이지를 교체한다.
이러한 역량은 운영체제 소프트웨어와 MMU 내의 주소 번역 하드웨어, 가상페이지를 물리페이지로 매핑하는 페이지 테이블이라고 알려진 물리 메모리에 저장된 자료구조의 조합으로 제공된다.
주소 번역 하드웨어는 이들이 가상주소를 물리주소로 변환할 때 마다 페이지 테이블을 읽는다.
운영체제는 페이지 테이블의 콘텐츠 관리와 페이지들을 디스크와 DRAM 사이에서 왔다 갔다 하는 것을 관장한다.
페이지 테이블은 페이지테이블 엔트리(PTE)의 배열이다.
가상 주소공간의 각 페이지는 페이지 테이블에 고정된 오프셋 위치에 PTE를 갖는다.
편의상 각 PTE가 한 개의 유효비트, n비트의 주소 필드로 구성된다고 가정하면, 유효비트는 가상페이지가 현재 DRAM에 캐시되어 있는지를 나타낸다.
유효비트가 세팅되어있으면, 주소 필드는 가상페이지가 캐시되어 대응되는 DRAM의 물리페이지의 시작을 나타낸다.
만일 유효비트가 세팅되어 있지 않다면,NULL 주소는 가상페이지가 아직 할당되지 않았음을 나타낸다.
그렇지 않은 경우에 주소는 디스크 상의 가상페이지의 시작 부분을 가리킨다.
위 그림은 8개의 가상페이지와 4개의 물리페이지를 갖는 시스템을 위한 페이지 테이블을 보여준다.
4개의 가상 페이지 VP1, VP2, VP4, VP7은 현재 DRAM에 캐시되어 있고, 두개의 페이지 VP0 VP5는 할당이 안되었다.
나머지 VP3, VP6는 할당되었지만 현재 캐시되지 않은 상태이다.
위 그림은 DRAM 캐시가 완전 결합성 이므로 물리페이지가 모든 가상 페이지를 포함할 수 있다.
페이지 적중
CPU가 DRAM에 캐시되어 있는 가상메모리의 VP 2 워드 한 개를 읽을 때의 흐름을 봐보자
주소 번역 하드웨어 에서는 PTE 2를 찾기 위해 인덱스로 가상주소를 사용하고, 이것을 메모리에서 읽는다.
유효비트가 세트되어 있기 때문에 주소 번역 하드웨어는 VP 2가 메모리에 캐시된것을 알아차리고,
PTE내의 물리 메모리 주소를 사용해서 해당 워드의 물리 주소를 구성한다.
페이지 오류
가상메모리 용어에서 DRAM 캐시 미스는 페이지 오류(page fault)라고 한다.
CPU는 DRAM에 캐시되어 있지 않은 VP 3 내의 워드를 참조하였다. 주소 번역 하드웨어는 메모리에서 PTE3를 읽으며,
VP 3가 캐시되어 있지 않는다는 것을 유효비트로부터 유추해서 페이지 오류를 유발시킨다.
페이지 오류 예외는 커널 내에 페이지 오류 예외 핸들러를 호출해서 희생자 페이지인 PP 3에 저장된 VP 4를 선택한다. VP 4가 변경되었다면 커널은 이것을 다시 디스크에 복사한다.
어느 경우든지 커널은 VP 4에 대한 페이지 테이블 엔트리를 수정해서 VP4가 메인 메모리에 캐시되지 않았다는 사실을 반영하고,
커널은 VP 3를 디스크에서 메모리 내의 PP 3로 복사하고, PTE3를 갱신하고 그 후에 리턴한다.
핸들러가 리턴할 때 오류 인스트럭션을 재시작하고 이것은 오류 가상주소를 주소 번역 하드웨어로 재전송한다.
그러나 VP 3가 메인 메모리에 캐시되어 있으며, 페이지 적중은 정상적으로 주소 번역 하드웨어에 의해서 처리된다.
가상메모리에서 블록은 페이지라고 알려져 있고 디스크와 메모리 사이에 페이지를 전송하는 동작은 스와핑 또는 페이징이라고 한다.
미스가 발생할 때, 하나의 페이지로 스와핑되어 마지막 순간까지 기다리는 전략은 요구 페이징(demand paging)이라고 한다.
현대의 모든 시스템은 요구 페이징 방식을 쓴다.
페이지 할당
운영체제가 가상메모리의 새로운 페이지를 할당할 때, 예를 들어 malloc을 호출한 결과로 예제 페이지 테이블 상의 효과를 보여준다.
VP 5는 디스크 상에 공간을 만들고, PTE 5를 디스크에 새롭게 만든 페이지를 가리키도록 할당 받는다.
지역성
문득 보면 가상 메모리는 비효율적이게 보일 수 있지만 실제로 가상 메모리는 잘동작한다. 바로 지역성 때문에
비록 프로그램이 전체 실행하는 동안에 참조하는 서로 다른 페이지의 수가 전체 물리 메모리의 크기보다 더클지라도 지역성의 원리는 시간상의 어느 시점에서라도 이돌의 동작집합(working set) 또는 거주 집합(resident set)이라고 알려진 보다 작은 활성화된 페이지 집합에서 동작하는 경향이 보일 것이라는 점을 약속해준다.
우리의 프로그램이 좋은 시간 지역성을 가지고 있으면, 가상메모리 시스템은 상당히 잘 동작할 것이다.
만약 동작 집합 크기가 물리 메모리보다 더 크면 프로그램은 Thrashing이 나타날 것이다. 이 경우 페이지들이 연속적으로 스왑해서 들어오고 나가기를 반복한다. 가상메모리가 대개는 효율적일지라도 프로그램의 성능이 기어갈 정도로 느려지면 쓰레싱을 생각해 볼수 있다.
'정글' 카테고리의 다른 글
(TIL26일차) 동시성 프로그래밍 (1) | 2023.05.20 |
---|---|
WIL(6주차) Malloc-lab 구현 (1) | 2023.05.20 |
TIL(24일차) 프로세스 (0) | 2023.05.18 |
(TIL23일차) 캐시 (0) | 2023.05.18 |
(TIL22일차) 저장장치 (0) | 2023.05.17 |