가상 메모리 시스템 (Virtual Memory System)
가상 메모리 개념 (Concept of Virtual Memory)
컴퓨터마다 실제 메모리의 크기는 다른데, "가상 메모리(Virtual Memory)" 개념은 크기가 서로 다른 물리 메모리에서 일관되게 프로세스를 실행할 수 있도록 한다.
가상 메모리의 크기는 컴퓨터 시스템이 가진 물리 메모리의 최대 크기로 한정된다. 그러나 이론적으로 가상 메모리의 크기는 무한대인데, 이는 "스왑(Swap)"으로 인해 가능하다. 스왑 영역은 하드디스크에 존재하지만 메모리 관리자가 관리하는 영역으로, 메모리의 일부이며 가상 메모리의 구성 요소 중 하나이다.
메모리 관리자는 프로세스를 실행하는 과정 중에, 물리 메모리가 부족한 상황이 생기면 부족한 부분을 스왑 영역으로 보충한다. 물리 메모리가 꽉 차면 일부 프로세스를 스왑 영역으로 보내고, 몇 개의 프로세스가 작업을 마치면 스왑 영역에 있는 프로세스를 메모리로 가져온다. 결국, 가상 메모리에서 메모리 관리자가 사용할 수 있는 메모리의 전체 크기는 "물리 메모리와 스왑 영역을 합친 크기"이다.
메모리 관리자는 물리 메모리와 스왑 영역을 합쳐서 프로세스가 사용하는 가상 주소를 실제 메모리의 물리 주소로 변환한다. (동적 주소 변환: DAT) 동적 주소 변환 과정을 거치면 프로세스는 아무 제약 없이 사용자 데이터를 물리 메모리에 배치 가능하다.
매핑 테이블 (Mapping Table)
메모리 관리자는 메모리를 관리할 때 가상 주소와 물리 주소를 일대일로 매핑한 "매핑 테이블"을 작성하여 관리한다. 메모리 분할 방식처럼 가상 메모리 시스템도 고정 분할 방식과 가변 분할 방식으로 나뉜다.
- 페이징 기법(Paging): 고정 분할 방식을 이용한 메모리 관리 기법으로, 페이징 기법에서 사용하는 매핑 테이블을 페이징 매핑 테이블이라고 한다.
- 세그먼테이션 기법(Segmentation): 가변 분할 방식을 이용한 메모리 관리 기법으로, 세그먼테이션 기법에서 사용하는 매핑 테이블을 세그먼테이션 매핑 테이블이라고 한다.
페이징 기법 (Paging)
페이징 기법 구현
페이징 기법은 고정 분할 방식을 이용한 가상 메모리 관리 기법으로, 물리 주소 공간을 같은 크기로 나누어 사용한다. 가상 주소의 분할된 각 영역은 "페이지", 물리 메모리의 각 영역은 "프레임"이라고 불린다. 이때, 페이지와 프레임의 크기는 동일하다. 가상 주소의 각 페이지는 물리 메모리의 어딘가에 위치하는데, 페이지와 프레임의 크기가 동일하기에 페이지는 어떤 프레임에도 배치 가능하다. 모든 페이지의 위치 정보는 페이지 테이블에 담겨있다. 페이지 테이블은 하나의 열(column)으로 구성된다.
페이징 기법의 주소 변환
페이징 기법에서 가상 주소를 물리 주소로 변환하는 과정은 다음과 같다. 예시로 가상 주소 공간과 물리 주소 공간을 동일하게 10B로 나누고 한 페이지, 한 프레임이 총 10개의 주소를 가질 때, 프로세스가 30번의 내용을 "읽으려고 할 때(Read)"의 주소 변환 과정을 들겠다.
- 가상 주소 30번이 어느 페이지에 있는지를 찾는다. 30번은 페이지 3의 0번 위치에 있다.
- 페이지 테이블의 페이지 3으로 가서 해당 페이지가 프레임 1에 있다는 것을 알아낸다.
- 최종적으로 물리 메모리 프레임 1의 0번 위치에 접근한다. 이 주소가 가상 주소 30번의 물리 주소이다.
프로세스가 가상 주소 18번에 어떤 값을 "쓰려고 할 때(Write)"의 주소 변환 과정은 다음과 같다.
- 가상 주소 18번이 어느 페이지에 있는지를 찾는다. 18번은 페이지 1의 8번 위치에 있다.
- 페이지 테이블의 페이지 1로 가서 해당 페이지가 프레임 3에 있다는 것을 알아낸다.
- 최종적으로 프로세스가 저장하려는 값을 프레임 3의 8번 위치에 저장한다.
페이징 기법에서 가상 주소는 "VA = <P, D>"로 표현된다. VA는 가상 주소(Virtual Address), P는 페이지, D는 페이지의 처음 위치에서 해당 주소까지의 거리를 의미한다. 물리 주소는 "PA = <F, D>"로 표현된다. PA는 물리 주소(Physical Address), F는 프레임, D는 프레임의 처음 위치에서 해당 주소까지의 거리를 의미한다. 결국 페이징 기법에서 주소 변환은 가상 주소 VA = <P, D>를 물리 주소 PA = <F, D>로 변환하는 것이다.
가상 주소를 <P, D> 형태로 나타내는 방법은 다음과 같다.
P = 나눗셈(가상 주소/한 페이지의 크기)의 몫
D = 나눗셈(가상 주소/한 페이지의 크기)의 나머지
페이지 테이블을 이용하면 가상 주소를 간편하게 물리 주소로 변환할 수 있다. 페이지 테이블에서 페이지 번호를 찾아 해당 프레임 번호를 쫓아가면 된다. 페이지 테이블은 페이지 번호와 프레임 번호로 구성되며, 각각의 한 줄을 페이지 테이블 엔트리(PTE: Page Table Entry)라고 한다.
세그먼테이션 기법 (Segmentation)
세그먼테이션 기법의 구현
세그먼테이션 기법은 가변 분할 방식을 이용한 가상 메모리 관리 기법으로, 물리 메모리를 프로세스 크기에 따라 가변적으로 나누어 사용한다. 세그먼테이션 기법에서도 페이징 기법처럼 테이블을 사용한다. 이때 세그먼테이션 기법에서 사용하는 테이블을 세그먼테이션 테이블이라고 한다.
세그먼테이션 테이블에는 세그먼트의 크기를 나타내는 Limit과 물리 메모리의 시작 주소를 나타내는 Address가 있다. 세그먼테이션 기법에는 프로세스 크기에 따라 메모리를 분할하기에 크기 정보를 포함한다.
세그먼테이션 기법의 주소 변환
세그먼테이션 기법에서는 가상 주소를 "VA = <S, D>"로 표현한다. S는 세그먼트 번호, D는 세그먼트 시작 지점에서 해당 주소까지의 거리를 나타낸다. 세그먼테이션 기법에서 가상 주소를 물리 주소로 변환하는 과정은 다음과 같다. 예시로 프로세스 A는 세그먼트 0, 프로세스 B는 세그먼트 1, 프로세스 C는 세그먼트 2로 분할되어있을 때, 프로세스 A의 32번에 접근할 때의 주소 변환 과정을 들겠다.
- 가상 주소를 구한다. 프로세스 A는 세그먼트 0으로 분할되었기에 S는 0, D는 32다. 따라서 가상주소는 VA = <0, 32>이다.
- 세그먼테이션 테이블에서 세그먼트 0의 시작 주소 120을 알아낸 후 거리 32를 더하여 물리 주소 152번을 구한다. 이때 메모리 관리자는 거리가 세그먼트의 크기보다 큰지 점검한다.
- 크기가 큰 경우 메모리를 벗어나는 것이기에 메모리 오류를 출력하고 해당 프로세스를 강제 종료한다. 크지 않으면 물리 주소를 구한다.
- 물리 주소 152번에 접근하여 원하는 데이터를 읽거나 쓴다.
세그먼테이션 테이블의 Limit은 메모리를 보호하는 역할을 한다. 메모리를 벗어나는 에러를 "트랩(Trap)"이라고 하는데, 트랩이 발생하면 운영체제는 사용자에게 세그먼테이션 오류 메세지를 보낸다. 결국, 가상 주소인 VA = <S, D>에서 D는 메모리 보호의 의미를 가진다.
캐시 매핑 기법 (Cache Mapping)
캐시 매핑 기법은 "캐시 직접 매핑", "캐시 연관 매핑", "캐시 집합-연관 매핑"이 있다.
- 캐시 직접 매핑: 메모리 페이지가 캐시의 같은 위치에 올라오기에 태그만 확인하면 캐시 히트나 캐시 미스를 빠르게 확인할 수 있다. 다만, 페이지가 같은 위치에만 올라오기에 자리다툼이 발생하게 된다.
- 캐시 연관 매핑: 캐시 메모리를 자유롭게 사용할 수 있다. 그러나 캐시 히트인지 캐시 미스인지를 확인하기 위하여 모든 주소를 검색해야 한다. 그래서 캐시 연관 매핑은 캐시 직접 매핑보다 느리다.
- 캐시 집합-연관 매핑: 캐시 직접 매핑과 캐시 연관 매핑의 장점만 취한 방식으로 캐시를 K개 집합으로 나누고 각 집합에 캐시 직접 매핑을 사용하여 캐시 직접 매핑의 자리다툼 문제를 완화시킨다.