이번 포스팅에서는 Page table에 대해 좀 더 구체적으로 살펴보겠습니다.
1. Memory Protection
이전 포스팅에서 Page Table에는 Entry와 물리적 주소 정보로 구성된다고 했습니다. 그런데 이 두 가지뿐 아니라 Valid-Invalid bit와 Protection bit이라는 부가적인 bit가 페이지 테이블의 Entry마다 존재합니다.
(1) Valid - Invalid Bit in a Page Table
Valid-Invalid bit은 정말 엔트리가 사용되는지 여부를 나타내기 위한 것입니다. 테이블이라는 자료 구조상 인덱스로 접근하기 때문에 프로그램에 주소 공간이 가질 수 있는 최대 크기만큼 페이지 테이블 Entry가 있어야 합니다.
위 그림에서는 논리적 메모리가 Page 5번까지 존재하고, 6, 7은 사용되지 않는 페이지임에도 페이지 테이블에 6번과 7번 엔트리가 존재하는 것을 볼 수 있습니다. 엔트리는 존재하지만, 6번과 7번 페이지는 없기 때문에 사용되지 않는다는 의미인 Valid-Invalid bit가 Invalid로 표시됩니다.
쉽게 말해 컴퓨터 입장에서는 Frame Number의 0이 숫자로만 인식되어 0번 frame으로 인지하기 때문에, 이것을 의미가 있는 0인지 아닌지를 구분하기 위해 사용되는 것입니다.
(2) Protection bit
여기서의 Protection의 의미는 페이지 테이블에서의 어떤 연산(read/write/read-only)에 대한 접근 권한을 의미합니다. 메모리 영역의 code, data, stack이 페이지에 저장되는데 code가 저장된 페이지는 CPU에서 인스트럭션을 실행하는 용도이기 때문에 중간에 내용이 바뀌어서는 안 됩니다. 그래서 Read only로 해놓고, Data, stack과 같은 페이지는 Read/Write 권한을 주게 됩니다.
2. Inverted Page Table
Inverted page table은 페이지 테이블의 엔트리가 많아지며 생기는 메모리 공간 낭비를 줄이기 위한 방법입니다. 이름에서 유추할 수 있듯이, 원래의 페이지 테이블을 통한 주소 변환을 역발상으로 뒤집어놓은 방법입니다.
기존의 페이지 테이블은 각 프로세스마다 별도로 존재했지만, Inverted Page Table은 시스템 내에 단 하나의 페이지 테이블만 존재합니다. 이 페이지 테이블의 엔트리 개수는 물리적 메모리 프레임의 개수에 따라 결정됩니다.
또 기존에서는 주소 변환을 할 때에 페이지 번호를 기준으로 페이지 테이블 엔트리를 찾았지만, Inverted Page Table은 물리적 메모리 프레임 번호를 기준으로 엔트리를 찾습니다. 각 엔트리에는 해당 프레임에 들어가는 페이지의 논리적 주소가 저장됩니다.
다시 말해, 주소 변환을 위해 페이지 번호를 찾아가는 것이 아니라, 물리적 프레임 번호를 통해 논리적 주소를 찾아가는 것입니다. 따라서 논리적 주소를 통해 물리적 주소를 알아내려면 전체 페이지 테이블을 검색해야합니다. 이를 위해서 페이지 번호와 함께 해당 페이지가 어떤 프로세스 것인지를 나타내는 프로세스 ID(pid)도 함께 저장됩니다.
Inverted Page Table은 검색 시간을 줄이기 위해 Assciative Register를 사용해 페이지 테이블 엔트리를 병렬로 검색할 수 있습니다. CPU가 논리적 주소를 제공하면 해당 주소를 찾기 위해 페이지 테이블에서 프로세스 ID와 페이지 번호를 검색하고, 그 결과로 얻은 프레임 번호를 물리적 주소로 변환하여 주소 변환을 하는 것입니다.
3. Shared page
만약 서로 다른 프로세스 1,2,3이 동일한 코드를 실행한다면, 이 코드 부분을 공유하는 것이 가능합니다. 이렇게 동일한 코드 부분을 공유하는 개념을 Shared code라고 합니다. Shared code를 통해 같은 코드를 여러 개의 프로세스가 동시에 실행하며 생기는 메모리 낭비를 줄일 수 있습니다.
Shared code는 두 가지 조건을 만족해야하는데 한 가지는 Read Only 설정입니다. 공유되는 코드 영역은 읽기 전용으로 수정할 수 없도록 설정하여 데이터 무결성을 유지해야 합니다.
나머지 한 가지는 동일한 논리적 주소에 위치해야합니다. 각 프로세스가 같은 코드에 접근해야 하므로 코드가 메모리에 로드될 때마다 같은 논리적 주소를 갖게 됩니다. 컴파일되어 있는 코드 안에 논리적 주소가 적혀있는데, 그 주소를 바꿀 수 없기 때문입니다.
참고자료
[KOCW 이화여대 반효경 교수님 - Memory Management 3]
https://core.ewha.ac.kr/publicview/C0101020140502151452123728?vmode=f
[ Operating System Concepts - Abraham Silberschatz ]
https://www.yes24.com/Product/Goods/89496122
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 9. 가상 메모리 : Demand Paging (Virtual Memory1) (0) | 2024.01.22 |
---|---|
[운영체제] 8. 메모리 관리 : Segmentation 기법 (Memory Management 4) (1) | 2024.01.22 |
[운영체제] 8. 메모리 관리 : 불연속 할당, Paging 기법 (Memory Management 2) (0) | 2024.01.19 |
[운영체제] 8. 메모리 관리 : 연속 할당 (Memory Management 1) (0) | 2024.01.19 |
[운영체제] 8. 메모리 관리 : 동적 로딩, 스와핑, 동적 Linking (Memory Management 1) (0) | 2024.01.18 |