오늘은 메모리 관리 기술 중 대표적으로 쓰이고있는 기술인 Paging 기법에 대해서 다뤄봅니다.
Paging
예전에 배웠던 Memory Partitioning 기법에 대해서 떠올려봅시다.
간혹 이런 메모리 파티셔닝에서 발생하는 fragmentation 문제는 아래와 같은 아이디어로 해결해볼 수 있을 것입니다.
fragmentation 부분만큼 프로세스를 쪼개갠 후에 해당 구역에 나눠서 배정하는 것은 어떨까??
말을 좀 어렵게 한건데, 쉽게 말해서 여러 fragmentation에 프로세스를 나눠서 분배한다는 아이디어입니다.
이 아이디어에서 나온 기법이 Paging입니다.
여기서 메모리를 조각냈을 때의 1 조각을 frame이라고 하고,
프로세스를 메모리 조각에 맞춰서 나눈 것을 page라고 합니다.
Paging에서는 frame size = page size = disk block size로 만들어서 메모리 관리를 더욱 효율적이게 합니다.
즉, Paging은 프로세스를 page 단위로 나눠서 Fixed Partitioning 기법에 적용하는 것이죠.
위는 페이징기법을 나타내줍니다. 세번째 그림에서 볼 수 있듯이, 기존에는 프로세스 D를 수용할 수 없지만 페이지 단위로 쪼개서 메모리에 저장하기에 다음과 같은 배치가 가능한 것입니다.
페이징 기법에서는 메모리를 프레임 단위로 쪼갭니다. 이 단위는 통상 2^n 형태로 쪼갭니다. 여기서 internal fragmentation이 존재하겠지만 이전 메모리 파티셔닝 글에서 다룬 버디 시스템의 이유와 동일하게 2^n 형태로 남겨진 조각 부분은 나머지 프로세스도 할당될 확률이 적은 작은 공간일 확률이 크므로 무시합니다.
Page Table
우리는 하나의 프로세스를 여러개에 프레임에 페이지 단위로 저장하였습니다. 그렇다면 우리는 프로세스가 어느 프레임에 어느 페이지가 존재하는지를 저장하고 있어야합니다. 그래야 프로세스의 원하는 부분을 빠르게 읽을 수 있기 때문이죠.
따라서 우리는 page table을 이용합니다. 단순히 페이지를 저장하는 자료구조로서 배열과 동일한 형태로 보입니다.
page table은 각 프로세스마다 존재하며, PCB에는 page table이 저장되어 있는 주소를 가리킵니다. 위의 그림에서의 페이지 테이블을 확인해봅시다.
페이지 테이블의 인덱스는 페이지의 번호이고 테이블 내의 값은 메모리 상의 프레임 번호를 의미합니다. 그래서 우리는 어떤 페이지가 어느 프레임에 있는지를 확인할 수 있습니다.
특이한 경우로, 프로세스 B를 확인해보면 N으로 되어있는 것을 알 수 있습니다. 이는, 아직 프로세스가 메모리 상에 위치해 있지 않은 상태인 suspended, terminated 상태라고 확인할 수 있습니다. suspended와 terminated와 같은 자세한 프로세스의 상태도에 대한 내용은 아래를 참고해주세요.
2023.09.11 - [Computer Science/운영체제] - [운영체제] 2-3. 프로세스 상태도
Page Number and Offset
우리는 지금까지 Logical Address를 이용하면 프로세스의 시작으로부터 얼마나 떨어져있는 지가 표시되어있는 것이라고 배웠습니다. 하지만 이러한 것은 프로세스 전체가 쪼개지지 않고 하나로 메모리에 로드될 때만 유효합니다. 그런데 우리는 paging 기법을 사용하면서 위 방식을 이용할 수 없게 되었습니다.
즉, 우리는 Logical Address에 해당 instruction이 프로세스의 어느 page에 위치하며, 그 페이지에서 어느 offset만큼 떨어져있는 지를 표기하는 것이 좋아보입니다. 그래서 우리는 page number와 offset을 이용합니다.
우선 간단한 설명을 위해 페이지 하나의 크기가 1K라고 해봅시다.(현재는 4K나 8K로 쓰입니다) 그러면 우리는 하나의 페이지에 총 1024개의 instruction을 저장할 수 있습니다. 1024=2^10이므로 하나의 페이지에서 어느 위치에 속하는 지를 나타내는 offset은 10비트가 필요함을 알 수 있겠네요.
16비트 컴퓨터라고 가정해봅시다. 주소를 나타내는 데 총 16개의 비트가 쓰이며, 10비트를 offset을 표기하는 데 썻으니 6비트를 페이지를 표시하는 용도로 사용할 수 있겠습니다.
16비트 컴퓨터에 위와 같은 주소가 쓰여져있다고 가정해봅시다. 편의를 위해 page number를 가리키는 앞부분과 offset을 가리키는 부분은 구분해놓았습니다.
이러한 Logical Address를 Physical Address로 변환하기 위해서는 페이지 테이블의 인덱스를 계산해야 합니다. 위 주소는 페이지 테이블의 1번째 인덱스(0번째부터 시작) 위치의 주소를 읽어, 메모리의 어느 위치에 해당 페이지가 로드되었는 지를 알게 되고, offset을 이용하여 해당 페이지의 시작을 기준으로 얼마나 떨어져있 지를 얻게 됩니다.
조금 더 쉬운 예시로 8비트 컴퓨터를 예시로 들어보죠. 페이지 사이즈는 16바이트라고 가정하면 offset이 총 4개가 필요합니다. 따라서 page number 4비트, offset 4비트로 구성되어 있을 것입니다.
하단의 그림을 통해, 직접 Logical Address를 Physical Address로 변환해보면서 이해도를 확인해봅시다.
해당 과정을 진행하면서 알 수 있는 것이 하나 있습니다. 바로 offset은 실제 메모리 주소공간에서 얼마나 떨어져있는 지를 의미하는 것이라는 겁니다. 즉, 우리는 page number를 가리키는 부분에 해당하는 인덱스의 값을 읽어와서 해당 메모리 주소를 시작으로 offset만큼 움직이면 실제 instruction의 address를 얻을 수 있게 됩니다.
하단의 그림은 우리가 paging을 이용하면 어떻게 정확한 instruction의 위치를 찾을 수 있는 지를 보여줍니다.
위 그림은 페이지 사이즈가 1K라고 가정하고 있기 때문에 offset은 10자리가 필요합니다. 따라서 Page number는 6비트를 차지하게 됩니다.
지금까지 paging 기법에 대해서 배웠습니다. 해당 기법을 조금 변형하여 현재 리눅스 운영체제에서도 사용 중이며 굉장히 중요한 OS의 부분 중 하나라고 생각합니다. 위 부분을 잘! 이해하시면 너무너무 좋겠습니다. 감사합니다.
'CS > OS' 카테고리의 다른 글
[운영체제] Demand Paging (2) | 2023.12.08 |
---|---|
[운영체제] Virtual Memory (1) | 2023.12.08 |
[운영체제] Address Binding (0) | 2023.11.28 |
[운영체제] 메모리 관리 - Memory Partitioning (4) | 2023.11.27 |
[운영체제] RAID (1) | 2023.11.27 |