-
[memory management] page 알아보기System 2023. 9. 22. 17:28728x90반응형
- 목차
* 소개
page 는 메모리를 구성하는 단위입니다.
하나의 프로그램이 메모리로 로딩이 될 때
프로그램을 구성하는 데이터들은 page 라는 단위로 나뉘어져서 메모리에 로딩이 됩니다.
보통 프로그램은 code segment 로 표현되는 코드 영역과 data segment 라고 불리는 데이터 영역으로 나뉘는데요.
이러한 segment 들이 page 라는 단위로 메모리에 존재합니다.
page 는 디스크와 메모리 사이로 전달되는 전송의 단위이자 저장되는 단위입니다.
그리고 page 의 단위는 보통 4KB 인 경우가 많은데,
프로그램 하나의 크기가 page 의 사이즈와 일치하는 경우는 거의 없을 겁니다.
그래서 하나의 프로그램으로부터 생성된 많은 page 들은 메모리 상에서 흩어져서 존재하게 되는데요.
이러한 page 를 효율적으로 사용하기 위한 내용들을 앞으로 알아보고자 합니다.
* virtual address 란
virtual address 는 프로세스가 사용하는 메모리 주소입니다.
실제 메모리의 주소를 뜻하지는 않습니다. ( 실제 메모리 주소는 physical address 라고 함. )
CPU가 실행해야 할 물리적인 실제 주소를 감추고 프로세스는 virtual address 를 사용합니다.
virtual address 를 사용함으로써 운영체제는 프로세스에게 충분한 메모리와 연속된 메모리가 있는 것처럼 속일 수 있습니다.
* page 란
페이지는 메모리에서 관리되는 저장 단위입니다.
디스크에 저장된 특정 파일이 메모리로 로딩되면 파일의 데이터들이 Page 라는 단위로 생성됩니다.
시스템상 정확한 정보는 아니지만 대략적인 감을 잡기 위해서 예시를 하나 들어보겠습니다.
HDD 에서 하나의 섹터가 수용하는 용량이 12KB 이고, Page 의 단위가 4KB 라고 할 때,
하나의 섹터로부터 데이터를 읽어들이면 총 3개의 Page 가 생성됩니다.
이런 느낌으로 디스크에 저장된 데이터는 메모리로 로드되면 Page 라는 단위로 다루어집니다.
Page 는 Page Header 와 Data Area 로 구성됩니다.
Page Header 는 Page 에 대한 메타 데이터가 작성됩니다.
Page Header 의 정보는 아래와 같습니다.
** Page Header
*** Page Frame Number
하나의 파일은 보통 여러개의 Page 를 생성합니다.
프로그램은 코드의 순서대로 실행되도록 보장받아야하기 때문에 Page 들의 순서가 정렬되어 있어야합니다.
예를 들어,
page 1 : var a = 1; var b = 2; page 2 : var b = 3; page 3 : var c = a + b; page 4 : print(c);
1 ) page 1 -> page 2 -> page 3 -> page 4 ==> 4 가 출력됨.
2 ) page 2 -> page 1 -> page 3 -> page 4 ==> 3 이 출력됨.
위 Page 1, 2, 3, 4 가 뒤섞여서 실행되면 동일 결과를 보장받을 수 없습니다.
그래서 Page 는 Page Header 에 Page 의 순서를 의미하는 Page Frame Number 를 가집니다.
** Data Area
Page 의 Data Area 는 프로그램의 Code Segment, Data Segment 들이 저장되는 영역입니다.
즉, Page 의 Data Area 는 실제 코드와 데이터가 저장되는 영역입니다.
*** heap and stack
프로세스가 생성될 때, stack 과 heap 영역을 위한 Page 또한 생성됩니다.
stack 구조를 위한 Page 는 프로세스의 생성과 더불어 Main Thread 와 함께 생성되구요.
그 외 추가적인 Thead 가 생성될때마다 stack 을 위한 page 가 생성됩니다.
heap 은 malloc, new 와 같은 키워드로 memory space 가 요청될 때마다
heap 을 위한 Page 가 생성됩니다.
이는 전적으로 운영체제의 관리 하에 이루어집니다.
* paging in & out
page in 과 page out 은 메모리와 디스크 사이에서 데이터가 전송되는 과정을 의미합니다.
page in 은 메모리에 존재하지 않는 Page 를 디스크에서 읽어들여 메모리에 로드하는 과정이고,
page out 은 여러 시스템 상의 이유로 Page 가 메모리에서 디스크로 방출되는 상황입니다.
여기서 주목할 점은 page out 된 Page 는 디스크에서도 Page 의 구조를 유지한 채로 저장됩니다.
page header 와 data area 의 형태가 유지되죠.
그래서 page out 이 된 상태에는 원본 데이터와 copy된 paged-out 된 Page 가 모두 존재하게 됩니다.
예를 들어, A file 을 열어서 A file 의 Page 들이 메모리에 생성되었다고 가정하겠습니다.
A file 의 사이즈가 매우 커서 여러 개의 Page 들이 생성된 상태입니다.
그 Page 들 중 하난가 paged-out 되어 디스크로 옮겨졌을 경우,
원본 파일인 A file 과 paged-out 된 Page 가 공존하게 됩니다.
추후에 Page 를 사용하는 프로세스가 paged-out 된 Page 가 필요해질 경우에 다시 page in 할 수 있습니다.
* page 의 사이즈는 어떻게 결정될까 ?
대개 운영체제에 의해서 4KB 또는 4MB 로 설정된다고 합니다.
제가 맥북을 사용해서 macOS 에서 page size 를 한번 체크해보았습니다.
getconf PAGE_SIZE | awk '{print $1/1024 " KB"}' 16 KB
16 KB 이군요.
리눅스에서도 한번 체크해보겠습니다.
4 KB 로 나옵니다.
운영체제에 따라서 page size 가 결정되는 것 같습니다.
* page table
virtual address 와 physical address 를 매칭하여 서로의 주소를 변환시키는 역할을 합니다.
모든 프로세스는 각각 하나의 page table 을 가집니다.
page table 은 Page 들의 정보가 기록있으며,
메모리 상에서 흩어져있는 Page 들의 physical address 를 가집니다.
프로세스는 page table 을 통해서 메모리에 접근할 수 있게 됩니다.
추후에 추가할 내용들.* process 는 page 를 어떻게 다룰까 ? * MMU * Page Faults * Memory Protection * demanding page * segment
반응형'System' 카테고리의 다른 글
IPC Signal 알아보기 (0) 2023.10.07 Shared memory communication 알아보기 (0) 2023.10.07 Call Stack 이해하기 (0) 2023.09.21 리눅스 프로세스 (0) 2023.01.24 Thread 알아보기 (0) 2022.12.13