Ⅷ 가상 메모리의 기초
Part 03 메모리 관리
Chapter 08 가상 메모리의 기초
1. 가상 메모리의 개요
① 가상 메모리 시스템
컴퓨터마다 물리 메모리, 즉 실제 메모리의 크기가 다르다. 가상 메모리 Virtual Memory 는 크기가 다른 물리 메모리에서 일관되게 프로세스를 실행할 수 있는 기술이다. 이 절에서는 가상 메모리가 무엇이며 어떻게 구현되는지를 살펴본다.
- 가상 메모리 : 물리 메모리의 크기와 상관없이 프로세스에 커다란 메모리 공간을 제공하는 기술
가상 메모리는 어떻게 실제 사용할 수 있는 물리 메모리의 크기를 넘어서 무한대로 메모리를 사용하게 할까? 그 비밀은 스왑에 있다.
② 가상 메모리의 크기와 주소
우리가 가진 메모리는 [물리 메모리 + 스왑]의 형태로 구성된다. 메모리 관리자는 물리 메모리의 부족한 부분을 스왑 영역으로 보충한다.
- 가상 메모리의 크기[메모리 관리자가 사용할 수 있는 메모리의 전체 크기] : 물리 메모리(실제 메모리)와 스왑 영역을 합한 크기
- 동적 주소 변환 DAT(Dynamic Address Translation) : 가상 메모리 시스템에서 메모리 관리자가 물리 메모리와 스왑 영역을 합쳐서 프로세스가 사용하는 가상 주소를 실제 메모리의 물리 주소로 변환하는 작업
③ 메모리 매핑 테이블
가상 메모리 시스템에서 가상 주소는 실제로 물리 주소나 스왑 영역 중 한 곳에 위치한다. 메모리 관리자는 가상 주소와 물리 주소를 일대일로 매핑한 테이블로 관리한다.
④ 지역성
- 지역성 Locality : 기억장치에 접근하는 패턴이 메모리 전체에 고루 분포되는 것이 아니라 특정 영역에 집중되는 성질을 나타낸다.
- 공간의 지역성 Spatial Locality : 현재 위체에서 가까운 데이터에 접근할 확률이 먼 거리에 있는 데이터에 접근할 확률보다 높다.
- 시간의 지역성 Temporal Locality : 현재를 기준으로 가장 rkRkdns 시간에 접근한 데이터가 가장 먼 시간에 접근한 데이터보다 사용될 확률이 높다.
- 순차적 지역성 Sequential Locality : 작업이 순서대로 진행되는 것을 의미한다.
2. 페이징 기법
① 페이징 기법의 구현
- 페이징 기법 : 고정 분할 방식으로 메모리를 관리하는 기법.
가상 주소 공간과 물리 주소 공간을 같은 크기로 나누어 사용한다. 가상 주소 공간에서 분할된 각 영역을 페이지, 물리 주소 공간의 각 영역을 프레임이라 부른다.
② 페이징 기법의 주소 변환
페이징 기법의 주소 변환 과정은 다음과 같다.
VA = <P, D> → PA = <F, D>
③ 페이지 테이블 관리
페이지 테이블에 빠르게 접근하기 위해 레지스터가 존재한다. 각 프로세스가 메모리에 접근하려고 할 때 메모리 관리자는 페이지 테이블의 위치를 재빨리 파악할 필요가 있다. 그래서 각 페이지 테이블의 시작 주소를 페이지 테이블 기준 레지스터 PTBR: Page Table Base Register 에 보관한다. 페이지 테이블 기준 레지스터는 각 프로세스의 프로세스 제어 블록에 저장되는 데이터로, 물리 메모리 내에 페이지 테이블의 시작 주소를 가지고 있다.
메모리 관리는 굉장히 복잡하다. 결과적으로 운영체제의 핵심은 메모리 관리다. 운영체제의 일부영역은 각 페이지 테이블을 관리한다. PTBR을 통해서 자신의 페이지 테이블 시작 주소로 바로 접근 가능하다.
④ 쓰기 시점 복사 Copy on Write
메모리 안에는 굉장히 많은 프로세스가 있고, 메모리는 왔다갔다 굉장히 많은 접근이 일어나는 공간이다. 쓰기 시점 복사를 통해 내용이 달라지는 영역만 복사하여 따로 사용할 수 있다. 복사 후 사용하지 않으면 낭비가 된다. fork 후 A가 사용하던 영역을 B가 그대로 가져다 사용한다. 하지만 같은 코드를 공유하지 않으며, 다른 코드로 사용한다. 내용물이 달라지는 시점, 그 정각에 Copy를 일으키는 방식이다.
- 쓰기 시점 복사 Copy on Write : 데이터 변화가 있을 때까지 복사를 미루는 방식
[Write 시점에 복사가 일어나도록 기능]
결과적으로 Copy on Write 방식으로 메모리를 절약하고 효율적으로 사용할 수 있다.
⑤ 변환 색인 버퍼 TLB
가상 주소를 물리 주소로 변환하는 작업은 CPU 안에 있는 메모리 관리 유닛 MMU가 담당한다. 가상 주소를 물리 주소로 변환하려면 메모리에 두 번 접근해야 한다. 메모리 관리 유닛 MMU는 가상 주소를 물리 주소로 변환하는 역할을 수행한다.
- 변환 색인 버퍼 TLB(Translation Look-ahead Buffer) : 현재 사용 중이거나 사용이 예상되는 페이지 테이블의 일부를 CPU 안쪽에 가져오는 기능 수행
⑥ 역 페이지 테이블
역 페이지 테이블 방식은 기존 페이징 방식과는 반대로 페이지 테이블을 구성한다. 이 방식의 장점은 페이지 테이블이 전체 시스템에 1개만 존재하면 된다는 점이다. 이 방식에서는 프로세스의 수와 상관없이 테이블이 하나만 존재한다. 하지만 테이블의 크기가 작지만 프로세스가 물리 메모리에 접근할 때 프로세스 아이디와 페이지 번호를 모두 찾아야 하는 것이 단점이다. 역 페이지 테이블에서 프로세스 1번의 10번 페이지가 메모리에 있는지 확인하려면 <PID 1, 페이지 10>을 ahems 테이블에서 찾아야만 결과를 알 수 있다. 다 찾아본 뒤, 없으면 헛수고이므로 잘 사용하지 않는다.
⑦ 다단계 페이지 테이블
다단계 페이지 테이블은 집합 연관 맵핑 혹은 디렉터리 매핑이라고 부른다. 여러 테이블을 연결하는 1차 테이블을 집합 테이블 혹은 디렉터리 테이블이라고 한다. 2단계 페이지 테이블의 경우, 페이지 테이블을 5개씩 잘라 2차 페이지 테이블을 만들고 이를 관리하는 1차 페이지 테이블을 하나 더 생성한다. 3단계나 4단계 페이지 테이블 방식도 마찬가지다. 페이지 테이블의 주소는 계속 세분화된다. 이러한 특징 때문에 다단계 페이지 테이블 방식을 멀티페이지 매핑이라고 부른다. 다단계 페이지 테이블 방식의 장점은 크기가 큰 페이지 테이블을 같은 크기의 묶음으로 나누어서 효율적으로 관리할 수 있다는 것이다. 페이지 테이블 전체를 한꺼번에 만들지 않고 필요할 때마다 생성하고 관리함으로써 물리 메모리의 공간을 효율적으로 관리할 수 있다.
3. 세그먼테이션 기법
세그먼 테이션 기법은 가변 분할 방식을 이용한 가상 메모리 관리 기법으로, 물리 메모리를 프로세스 크기에 따라 가변적으로 나누어 사용한다. 세그먼테이션 기법에서 가장 중요한 이슈는 각각의 페이지의 크기는 다 다르다는 점이다.
① 세그먼테이션 기법의 구현
세그먼테이션에서는 하나의 연속된 공간을 세그먼트라고 한다. 세그먼테이션 테이블에는 물리 메모리의 시작 주소를 나타내는 address와 세그먼트의 크기를 나타내는 limit가 있다. 물리 메모리에 접근할 때마다 거리 D의 크기가 limit보다 작은지 매번 확인한다.
각 세그먼트가 자신에게 주어진 메모리 영역을 넘어가면 안 되기 때문에 세그먼트의 크기 정보에는 크기를 뜻하는 size 대신 제한을 뜻하는 limit을 사용한다.
세그먼테이션 기법은 가변 분할 방식이 기본이므로 가변 분할 방식의 장점과 단점을 모두 가진다. 장점은 메모리를 프로세스 단위로 관리하기 때문에 세그먼테이션 테이블이 작고 단순하다는 것이고, 단점은 물리 메모리의 외부 단편화로 인해 관리가 복잡하다는 것이다.
② 세그먼테이션 기법의 주소 변환
세그먼테이션 테이블의 limit은 메모리를 보호하는 역할을 한다. 만약 280B를 사용하겠다고 선언한 프로세스 A의 크기보다 더 큰 주소에 사용자가 접근하려 하면 메모리 관리자는 해당 프로세스를 강제 종료한다. 이때 발생하는 오류를 트랩 Trap 이라고 하는데 자신의 영역을 벗어나는 주소에 접근하거나 숫자를 0으로 나누는 것과 같이 사용자가 의도치 않게 일으키는 인터럽트를 말한다. 트랩이 발생하면 운영체제는 사용자에게 세그먼테이션 오류 메시지를 보낸다. 결과적으로 가상 주소인 VA = <S, D>에서 D는 메모리 보호의 의미를 담고 있다.
- 트랩 Trap : 사용자가 선언한 프로세의 크기보다 더 큰 주소에 접근하려고 할 때 발생하는 오류
- 세그먼테이션 오류 Segmentation Fault : 트랩이 발생했을 때 OS가 사용자에게 보내는 오류 메시지
Page Error 가 아닌, Segmentation Fault 라는 점을 유의해서 기억하도록 하자. 메모리 관리자 입장에서는 page 관리에 해당하지만, 프로세스 입장에서는 Segmentation을 처리하는 것으로 본다.
4. 캐시 매핑 기법
① 캐시 직접 매핑
메모리 페이지가 캐시의 같은 위치에 올라오기 때문에 태그만 확인하면 캐시 히트나 캐시 미스를 빠르게 확인할 수 있다. 그러나 페이지가 같은 위치에만 올라오기 때문에 자리다툼이 발생한다.
② 캐시 연관 매핑
캐시 메모리를 자유롭게 사용할 수 있는 것이 장점이다. 그러나 캐시 히트인지 캐시 미스인지 확인하기 위해 캐시의 모든 주소를 검색해야 한다는 단점도 있다. 따라서 캐시 연관 매핑은 캐시 직접 매핑보다 느리다.
③ 캐시 집합-연관 매핑
캐시 직접 매핑과 캐시 연관 매핑의 장점만 취한 방식이다. 캐시를 K개 집합으로 나누고 각 집합에 캐시 직접 매핑을 사용하여 캐시 직접 매핑의 자리다툼 문제가 완화된다.