Memory Paging 기법을 이용한 기술 논문을 읽다가 문득 Memory Management 에 대해서 무지했던 것을 알고 이번 기회에 정리하려고 한다.

 

Memory Paging

 

리눅스에서 페이징 기법은 메모리 관리를 하기 위한 기술이다.

물리 메모리 주소를 고정된 크기의 블록인 '페이지' 로 나누고(보통 4KB), 가상 메모리 주소를 물리 메모리 주소로 매핑하는 방식이다.

 

먼저 페이징이 왜 도입되었는지 살펴보면 다음과 같다.

  • 메모리 부족 문제
    • 초기 시스템은 물리 메모리가 현재에 비해서 매우 제한된 메모리를 가짐.
    • 가상 메모리를 통해 프로그램이 더 큰 주소공간을 사용할 수 있도록 요구됨.
  • Memory Fragmentation(메모리 단편화)
    • 메모리를 할당하고 해제하는 과정에서 작은 빈 공간들이 여기저기 흩어지는 메모리 단편화가 발생, 이는 메모리 할당 효율을 떨어뜨리고 큰 사이즈의 연속적인 메모리 블록을 할당하는 데 어려움을 초래함.
더보기

메모리 단편화(Memory Fragmentaion)에 대해서 나중에 글을 하나 쓸 예정이다. 

 

쉽게 비유하자면 지하철을 탔을 때 중간에 빈자리를 200Kg, 230cm의 거구가 못 앉는 것과 같은 현상이다.

맨 첫차에서 사람들은 순서대로 빈자리에 앉았다고 하더라도 언제 어디서 내릴지는 모르기 때문에 

중간중간 빈 공간이 생기고 빈 공간에는 브룩 레스너급의 거구는 자리가 좁아 앉지 못하는 것이다.

(비유가 좀 병맛이네)

  • Security(보안)
    • 여러 프로세스가 동시에 실행될 때, 하나의 프로세스가 다른 프로세스의 메모리 영역을 침범하는 문제가 발생할 수 있음.           (C언어에서 자주 괴롭혔던 Segment Fault 에러가 다른 프로세스 메모리 공간을 침범해서 생기는 에러)

 

이러한 문제 때문에 Paging 기법이 도입되었다.

 

프로세스들은 물리 메모리를 공유하기 위해 각자의 페이지 테이블(Page Table)을 가지며, 페이지 테이블 엔트리(Page Table Entry, PTE) 는 매핑된 가상 메모리 주소에 대응하는 물리 메모리 주소를 포함한다.

  • CPU가 프로세스를 실행하면서 접근하는 메모리 주소는 모두 가상 메모리 주소이며, 가상 메모리 주소로 접근할 때 페이지 테이블을 이용하여 물리 메모리 주소로 변환
  • 주소 변환을 쉽게 하기위해, 메모리는 페이지(Page)라는 작은 단위로 나뉘는데 모든 페이지들은 같은 크기 (보통 4KB or 8KB)
  • 각 페이지는 페이지 프레임 번호(Page Frame Number, PFN)로 식별 가능하며, 가상 메모리에서는 가상 페이지 프레임 번호(Virtual PFN, VPFN)라고 한다.
  • 가상 주소는 가상 페이지 프레임 번호와 해당 페이지에서의 오프셋으로 구성되며, 이 오프셋은 물리 페이지에서도 동일
  • 페이지 크기는 2의 제곱수인데, 그 이유는 주소 변환을 할 때 비트 마스킹과 쉬프트 연산으로 쉽게 처리하기 위함

가상 메모리 추상화 모델

 

가상 메모리(Virtual Memory) 물리 메모리의 크기가 제한적인 단점을 극복하기 위해 도입된 방법으로, 메모리를 필요로 하는 프로세스들 사이에 물리 메모리를 공유하도록 하여, 각 프로세스가 실제 물리 메모리보다 큰 메모리를 가질 수 있도록 하는 SW 기법이다.

 

메모리 관리 서브 시스템은 다음과 같은 기능을 제공한다.

  • 넓은 주소공간: 프로세스 마다 할당된 가상 주소공간을 물리 메모리보다 몇 배 더 클 수 있음
  • 보호: 각 프로세스는 독립된 가상 주소공간을 가지기 때문에, 어떤 프로세스도 다른 프로세스에게 영향을 줄 수 없음
  • 메모리 매핑: 실행 이미지와 데이터 파일을 프로세스의 주소공간에 매핑시켜 실제로 필요로 할 때 물리 메모리에 로드

 

주소 변환 과정 

  • CPU가 가상 주소를 메모리 관리 장치(MMU)에게 전달
  • MMU가 가상 주소로 부터 VPFN과 페이지 오프셋을 추출하여 페이지 테이블에서 VPFN으로 인덱싱
  • MMU는 엔트리에서 물리페이지 프레임 번호(PFN)을 얻음
  • PFN와 페이지 크기를 곱하여 물리 메모리에서 베이스 주소를 계산한 뒤, 베이스 주소에서 페이지 오프셋을 더하여 실제 물리 메모리의 위치로 접근

https://movefast.tistory.com/341

 

페이지 테이블은 3가지 정보를 포함한다.

  • 유효 플래그: PTE가 유효한지를 나타내며, 유효하지 않다면 페이지 폴트(Page Fault) 발생
  • 물리 페이지 프레임 번호: VPFN에 대응하는 물리 페이지 인덱스
  • 접근 제어 정보: 해당 페이지가 가지고 있는 Read/Write/Exce 권한

페이지 폴트(Page Fault)는 프로세스가 물리 메모리에 매핑되지 않는 가상 페이지에 접근하는 것

접근 제어(Access Control) PTE는 프로세스가 허용되지 않은 방식으로 물리 메모리에 접근하는 것을 막기 위해 접근 제어 정보를 포함

 

페이지 테이블을 이용하면 가상 메모리는 물리 메모리에서 페이지 단위로 임의의 순서로 배열될 수 있음. 즉, 가상 페이지들은 물리 메모리에서 어떤 특정 순서로 존재할 필요가 없다.

 

대부분 범용 프로세서들은 물리 주소 모드와 가장 주소 모드를 제공하는데, 물리 주소 모드에서는 페이지 테이블이 필요 없기 때문에 주소 변환을 하지 않음. 커널 코드는 물리 모드에서 실행(물리적 주소 공간에 매핑)되도록 링크되어 있다.

 

 

이후 내용은 2번째 글에서 추가로 설명하겠다!

 

Reference

https://movefast.tistory.com/341