Memory Management
Allocating Kernel Memory
- 커널 메모리 할당 방법
- 프리 메모리 풀로부터 할당
- 커널은 동적 사이즈 구조를 위한 메모리 요청
- 커널 메모리는 연속적이어야 함(memory mapped I/O. 연속적 메모리 공간을 디바이스가 사용할 수 있도록 할당함. 기존의 페이지 할당 기법과는 달라야 하는 까닭)
Buddy System
- 쌍을 지어 관리하는 방법
- 2의 지수 단위 메모리 블럭을 할당
- 물리적으로 연속된 메모리 공간을 쉽게 분할/병합 가능
- Fragmentation 발생 → 남는 메모리 공간은 낭비될 단점
Slab Allocator
- Buddy System 단점 극복
- 슬랩은 물리적으로 연속된 페이지
- 캐시 = 여러 개의 슬랩 = 여러 개의 페이지
- 하나의 커널 자료 구조에 대한 메모리 크기가 필요한 경우 슬랩 할당에 필요한 데이터 블럭인 캐시 공간을 할당
- 캐시 생성 시 프리 상태의 오브젝트로 채우기
- 구조 저장 시 사용 상태로 오브젝트 표시하기
- 슬랩이 사용된 오브젝트로 가득 찰 때, 빈 슬랩에 오브젝트 할당 또는 새로운 슬랩 생성
- Fragmentation이 없으며 빠른 메모리 요청 피드백 속도
Linux Slab Allocator
Task_Struct
: 리눅스에서의 프로세스 별 구조체. 생성마다 생기는 구조
- 새로운 캐시 할당하기: 슬랩의 상태 체크 - (1). Full: 빈 곳도 없다면 새로운 슬랩을 할당, (2). Empty: partial이 없을 때 빈 곳부터 채우기, (3). Partial: 가장 먼저 사용되는 슬랩. fragmentation을 최소화하기 위함
- SLOB Allocator: 슬랩 단점 보완. 작은 메모리 효율적으로 사용하기에 적절한 방법. 오브젝트를 서로 다른 사이즈로 나누어서 서로 다른 블럭에 저장함
- SLUB Allocator: 슬랩의 단점 보완한 구조. 슬랩 할당 속도의 병목 현상을 방지하기 위해 성능 개선된 할당 방식
Memory-Mapped Files
- 파일 오픈 - 파일 읽기(Demand Paging) - 파일 읽기/쓰기가 일반적 메모리 읽기/쓰기(주기적 저장 또는
close
를 통해 최신 정보 반영)처럼 작동
- 여러 개의 프로세스가 하나의 파일 공유 가능
- 공유 메모리를 통해 서로 다른 프로세스에서 하나의 파일을 공유하는 것처럼 접근 가능