Paging (Part. 1)

박병욱·2024년 5월 30일

운영체제

목록 보기
6/8

앞서 살펴봤듯이 Segmentation은 한계가 명확하다. 바로 "External Fragmentation(외부 단편화)" 가 발생한다는 것이다. 가변 길이로 메모리 공간을 할당/해제하다 보면, 잔여 공간은 존재하나 연속적이지 않아 사용할 수 없는 자투리 영역이 발생하는데 이 문제를 해결하기 위해서 Compaction 등의 추가 연산이 필요하며 이는 고비용의 작업이라는 것이다.

 

🔥Paging (페이징)

운영체제에서 거의 모든 공간 관리 문제를 해결하는 한 가지 방법이 더 있는데, 공간을 가변 길이가 아닌 고정 길이(fixed-length)의 메모리 영역을 분할하여 테이블로 관리하는 방식인 "페이징(Paging)" 이다. 이 각각의 가상 메모리의 고정 크기의 메모리 할당 단위를 "페이지(Page)" 라고 부른다. 이에 상응하여 물리 메모리의 고정 크기 메모리 할당 단위를 "페이지 프레임(Page Frame)" 이라고 한다.

주소 공간의 각 가상 페이지에 대한 물리 메모리 위치 기록을 위하여 운영체제는 프로세스마다 "페이지 테이블(Page Table)" 이라는 자료 구조를 유지한다. 페이지 테이블의 주요 역할은 주소 공간의 가상 페이지 주소 변환 정보를 저장하는 것이다. 다시 말해, 각 페이지가 저장된 물리 메모리의 위치가 어디인지 알려준다는 것이다.

위 그림처럼 (가상 페이지 0 -> 물리 프레임 2), (VP 1 -> PF 5), (VP 2 -> PF 8)처럼 매핑이 가능하다. 페이지 테이블은 프로세스마다 존재한다는 점을 잊어서는 안된다. 만약 다른 프로세스를 실행해야 한다면 OS는 그 프로세스를 위한 다른 페이지 테이블이 필요하다. 새 프로세스의 가상 페이지는 다른 물리 페이지에 존재하기 때문이다(공유 중인 페이지가 없다면 말이다).

 

👉 Addressing in Paging

메모리 주소를 통해 메모리 내 특정 위치를 참조하는 과정. Paging에서 CPU가 인지하는 가상 주소는 두 부분으로 나뉘게 된다.

  • 페이지 번호 (Page Number) : 각 프로세스가 가진 페이지 각각의 부여된 번호로 Virtual page number(VPN)으로 식별한다.

  • 페이지 내 오프셋 (Offset) : 각 페이지의 내부 주소를 가리킨다.

 

이제 주소 변환을 위해 작은 주소 공간(64바이트)을 가지면서 4개의 16바이트 페이지로 구성된(가상 페이지 0, 1, 2, 3) 프로세스가 메모리 접근을 수행한다고 가정해보자. 가상 주소 공간의 크기가 64바이트이기 때문에 가상 주소는 6비트가 필요하다. 페이지 크기가 16바이트이므로 4페이지를 선택할 수 있어야 하고 따라서 주소의 최상위 2비트가 그 역할을 한다. 2비트 가상 페이지 번호(VPN)를 가지게 된다는 것이다. 나머지 비트는 페이지 내에서 원하는 바이트의 위치를 나타낸다. 이것을 Offset이라고 한 것이다.

프로세스가 가상 주소를 생성하면 OS와 하드웨어가 의미있는 물리 주소로 변환한다. 예를 들어, 위의 탑재 명령어의 가상 주소가 21이라고 가정하면 21의 이진 형식 010101을 얻고 이 가상 주소를 검사하고 가상 페이지 번호와 오프셋으로 나눈다. 따라서 가상 주소 21은 가상 페이지 "01(또는 1)"의 5번째("0101"번째) 바이트이다. 이 가상 페이지 번호를 가지고 페이지 테이블의 인덱스로 사용하여 가상 페이지 1이 어느 물리 프레임에 저장되어 있는지 찾을 수 있다.

예를 들어, 가상 페이지 1이 물리 프레임 번호(PFN) 7을 가리킨다고 하면 이진수로는 111을 가리킨다. VPN을 PFN으로 교체하여 가상 주소를 변환할 수 있다. 그리고 물리 메모리에 탑재 명령어를 실행한다. 여기서 Offset은 동일하다. Offset은 페이지 내에서의 내가 원하는 위치를 알려 주기 때문이다. 결국 페이징에서의 주소 변환은 페이지 번호(VPN)을 페이지 프레임 번호(PFN)로 변환하는 과정이다. 최종적으로 계산된 물리 주소는 1110101(십진수 117)이며, 이곳이 탑재할 데이터가 저장된 정확한 위치이다.

 

❓ 페이지 테이블(Page table)

페이지 테이블은 각 프로세스의 페이지 정보를 저장한다. 프로세스마다 하나의 페이지 테이블을 가진다. 페이지 번호는 페이지 테이블의 인덱스(index) 로 사용되며, 해당 인덱스에 저장된 엔트리 가 물리적 페이지 프레임 번호를 제공한다. 엔트리에 포함된 주요 내용은 해당 페이지에 할당된 물리 메모리(프레임)의 시작 주소다. 이 시작 주소와 페이지 주소를 결합해서 원하는 데이터가 있는 물리 메모리 주소를 알 수 있다.

👉 페이지 테이블의 구현

페이지 테이블은 물리 메모리에 위치하고 페이지 테이블 베이스 레지스터(PTBR) 가 물리 메모리 내의 페이지 테이블을 가리킨다. 그리고 페이지 테이블 길이 레지스터(PTLR) 가 페이지 테이블의 사이즈를 나타낸다.

 

🔥 Page Table Entry (PTE)

PTE는 페이지 테이블을 구성하는 각각의 엔트리를 말한다.

👉 PTE의 주요 필드

  • Page frame number : 해당 페이지에 할당된 프레임 번호로, 이를 통해 물리 메모리에 접근할 수 있다.

  • Accessed bit : 페이지에 대한 접근(참조)이 있었는지를 나타낸다.

  • Dirty bit : 페이지 내용의 변경이 있었는지를 나타낸다.

  • Present/Absent bit : 현재 페이지에 할당된 페이지 프레임이 있는지 나타낸다. 다른 말로, 해당 페이지가 현재 물리적 메모리에 로드되어 있는지 여부를 나타낸다.

  • Protection bit : 읽기/쓰기에 대한 권한을 표시한다.

 

profile
도메인을 이해하는 백엔드 개발자(feat. OOP)

0개의 댓글