티스토리 뷰
페이지 매핑 테이블의 주소 매핑
각 프레임(또는 페이지)은 여러 주소를 포함하고 있다.
예를 들어, 2번 프레임의 경우 시작주소가 22번지이고 23, 24, 25 ... 여러 주소를 포함하고 있다.
페이징을 사용하는 시스템에서는 <페이지 번호, 변위> 형식으로 논리 주소에 접근한다.
- 페이지 번호: 접근하고자 하는 페이지 번호
- 변위: 페이지가 적재된 프레임의 시작 번지로부터 떨어진 주소
페이지 매핑 테이블을 통해 <페이지 번호, 변위>에서 <프레임 번호, 변위>로 변경된다.
Ex) <2, 5>
CPU는 2번 페이지가 적재된 5번 프레임의 시작 번지 67에서 2만큼 떨어진 69번지에 접근한다.
페이징 매핑 테이블이 갖는 4가지 비트
- 유효 비트
- 페이지가 메모리에 적재되어 있는지 구분하는 비트
- 프로세스 단위가 아닌, 페이지 단위로도 스와핑이 가능하다. 단, 불연속적인 메모리 할당 기법에서만 적용된다.
- 비트 1 : 페이지가 메모리에 존재
- 비트 0 : 페이지가 보조기억장치에 존재
- 페이지가 메모리에 적재되어 있는지 구분하는 비트
- 보호 비트
- 페이지를 보호하기 위한 비트
- 비트 1 : 일기/쓰기 모두 가능한 페이지
- 비트 0 : 읽기만 가능한 페이지
- Ex) 프로세스의 코드 영역은 읽기 전용 페이지이다.
- 참조 비트
- 페이지가 메모리에 적재된 후에, CPU에 의해 참조된 적 있는지 구분하는 비트
- 비트 1 : 메모리에 적재된 후에, CPU에 의해 접근된 적 있는 페이지
- 비트 0 : 메모리에 적재된 후에, CPU에 의해 접근된 적 없는 페이지
- 수정 비트
- 페이지에 쓰기 작업이 발생했는지 구분하는 비트
- 구분하는 이유 : 메모리에 적재된 페이지 내용과 보조기억장치에 존재하는 페이지 내용이 일치하는지 확인하는 용도
- 메모리에 적재횐 후 한 번도 수정되지 않은 페이지라면 그대로 스왑 아웃
- 수정된 적 있는 페이지라면 변경된 값을 보조기억장치에 수정 후 스왑 아웃
- 비트 1 : 쓰기 작업이 발생한 페이지
- 비트 0 : 쓰기 작업이 발생하지 않은 페이지
- 페이지에 쓰기 작업이 발생했는지 구분하는 비트
Ex) 메모리에 적재된 값이 9999 -> 8888로 수정되었다면, 스왑 아웃 시에 보조 기억장치의 값도 8888로 수정해야 한다.
COW (Copy on Write)
프로세스를 Fork를 하면 동일한 프로세스가 복제된다. 복제의 의미는 기존 프로세스의 모든 자원이 복제되어 메모리에 적재된다.
이는 메모리에 중복 저장하지 않으면서 프로세스끼리 자원을 공유하지 않는다.
이것의 문제점은 복제된 프로세스가 기존의 프로세스와 동일한 데이터영역을 사용함에도 굳이 동일한 데이터를 생성하여 메모리에 적재한다는 것이다. 이 복사 작업은 프로세스의 생성 시간을 늦출 뿐만 아니라 불필요한 메모리를 낭비하게 된다.
반면 COW를 사용하면 Fork를 통해 생성된 프로세스가 동일한 프레임을 사용한다.
굳이 부모 프로세스의 동일한 데이터를 복사할 필요 없이 사용할 수 있다.
부모 프로세스 or 자식 프로세스에서 페이지에 쓰기 작업이 발생한다면 해당 페이지를 복사하여 메모리에 할당한다.
계층적 페이징
각 프로세스마다 페이지 매핑 테이블을 갖는다. 프로세스의 페이지 개수가 많아질수록 페이지 매핑 테이블의 크기 또한 커진다.
페이지 매핑 테이블은 메모리에 저장된다. 따라서 프로세스의 모든 페이지 정보를 담고 있는 페이지 매핑 테이블을 메모리에 저장하는 것은 메모리 낭비이다.
이를 해결하기 위해서 페이지 매핑 테이블을 여러 개의 테이블로 나누는 것이다.
즉, 각 테이블에 페이지를 나눠서 저장한다.
기존에는 페이지 매핑 테이블을 사용하여 주소를 매핑하기 위해서는 <페이지 번호, 변위>를 통해 접근한다.
페이지 매핑 테이블을 여러 개로 나누어 사용할 경우 <바깥 페이지 번호, 안쪽 페이지 번호, 변위>로 접근한다.
ex. <0, 2, 2>