1. 물리 메모리 구성요소
페이지 프레임 디스크립터
- 페이지 프레임 디스크립터는 물리 메모리의 페이지 프레임에 대한 정보를 저장하는 구조체
- 페이지의 상태, 참조 카운트, 메모리 할당 정보 등을 포함
- 커널이 메모리 할당 및 해제를 관리하는 역할
존
물리 메모리를 여러 개의 존으로 나누어 관리합니다. 서로 다른 메모리 요구 사항을 가진 프로세스에 맞춰 최적화되어 있습니다.
- ZONE_DMA
- DMA(Direct Memory Access) 장치가 접근할 수 있는 메모리 영역
- 16MB 이하의 메모리로 제한
- ZONE_NORMAL
- 프로세스가 사용할 수 있는 메모리 영역
- 물리 메모리의 대부분을 차지
- ZONE_HIGHMEM
- 32비트 시스템에서 사용되는 고메모리 영역(커널이 직접 접근할 수 없는 메모리)
- 유저 프로세스에 의해 사용

노드
- NUMA 아키텍처를 지원하기 위해 노드 개념을 도입
- 노드는 프로세서와 물리 메모리의 집합으로 구성
- 독립적으로 메모리에 접근
- 메모리 접근 지연을 줄이고 성능을 향상
디스크립터 관계
- 페이지 프레임 디스크립터는 페이지 프레임과 관련된 정보를 저장하고 메모리 관리

노드 데이터 구조
- pg_data_t 배열
- node_zones
- DMA, NORMAL, HIGH-MEM 메모리 영역을 관리
- free lists를 통해 스와핑 관리
페이지 상태 관리
- UNEVICTABLE부터 ACTIVE-FILE까지 페이지 상태를 관리
- ACTIVE/INACTIVE 통해 메모리 회수 정책을 결정
- struct page 포인터를 통해 스와핑을 처리
Buddy 시스템과 페이지셋
- Order 0-10까지의 free page lists로 메모리 할당을 관리
- per migrate-type으로 페이지 이동 처리
- CPU별 페이지셋으로 동시성을 관리
HIGHMEM
- 32비트 시스템에서 896MB 이상의 물리 메모리를 관리하기 위한 특별한 메모리 영역
- 커널이 직접 접근할 수 없는 메모리 영역을 효율적으로 관리하기 위해 설계
- Reserved 영역(128MB)을 통해 임시적으로 매핑하여 접근
- 커널은 ZONE_HIGHMEM 영역에 직접 접근 불가

- 가상 메모리 구조
- 전체 4GB 크기의 주소 공간
- 최상단 Reserved 영역 (128MB)
- 중간 Kernel 영역 (3GB~4GB)
- 하단 User 영역 (0~3GB)
- 물리적 메모리 구성
- ZONE_HIGHMEM
- ZONE_NORMAL
- 점선으로 표시된 매핑 관계는 가상 메모리와 물리 메모리 간의 변환을 나타냄
- 매핑 관계
- User 영역은 ZONE_NORMAL과 ZONE_HIGHMEM 모두에 매핑 가능
- Kernel 영역은 주로 ZONE_NORMAL에 직접 매핑
- Reserved 영역은 ZONE_HIGHMEM 접근을 위한 임시 매핑 공간으로 활용
2. TLB(Translation Lookaside Buffer)
- 주소 변환을 빠르게 수행하기 위한 캐시
- 최근에 사용된 페이지 테이블 엔트리를 저장하여 페이지 테이블에 접근하는 시간 감소
- TLB의 크기는 보통 16~256개의 엔트리를 가지며 LRU(Least Recently Used) 알고리즘을 사용하여 교체 정책을 결정
3. 페이지 테이블 구조
- 페이지 테이블은 가상 주소를 물리 주소로 변환하는 데 사용되는 데이터 구조
- 프로세스에 대해 독립적으로 유지
- 페이지 테이블 엔트리는 해당 페이지의 물리 주소와 상태 정보를 포함
- 메모리 사용을 최적화하고 페이지 테이블의 크기를 줄이는 데 기여
4. 가상/물리 메모리 맵
- 가상 메모리와 물리 메모리 간의 매핑을 관리
- 가상 메모리는 프로세스가 사용하는 논리적 주소 공간이며 물리 메모리는 실제 하드웨어 메모리
- 페이지 테이블을 사용하여 가상 주소를 물리 주소로 변환
- 매핑은 페이지 폴트가 발생할 때마다 업데이트

주소 공간 분할
- 0-3GB
- 3GB-4GB
- PAGE_OFFSET을 기준으로 유저/커널 영역 구분
커널 영역 구성
- ZONE_DMA
- ZONE_NORMAL
- vmalloc area
- kmap space
- Fixed addr mapping
메모리 매핑 방식
- 유저 페이지 테이블
- 커널 영역
- 선형 매핑(linear addr - PAGE_OFFSET)
- ZONE_NORMAL
- kmap/kmap_atomic
5. 메모리 압축 및 투명한 대형 페이지
메모리 압축
- 메모리 압축은 사용 가능한 메모리 용량을 늘리기 위해 메모리 페이지를 압축하는 기술
- 메모리 사용량을 줄이고 페이지 교체를 최소화하여 성능을 향상
- zswap과 같은 메모리 압축 기능을 제공하여 페이지를 압축하여 스왑 공간에 저장
투명한 대형 페이지 (Transparent Huge Pages)
- 일반 페이지 대신 큰 페이지를 사용하여 페이지 테이블의 크기를 줄이고 페이지 폴트 발생 빈도를 낮추어 성능을 향상시키는 기술
- 일반적으로 2MB 또는 1GB 크기
- 데이터베이스와 같은 메모리 집약적인 애플리케이션에서 유용하게 사용
6. 시스템 호출
- mmap
-
파일이나 장치를 메모리에 매핑하는 데 사용
-
메모리 매핑을 통해 파일의 내용을 메모리에서 직접 접근
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_RDONLY);
size_t length = 4096;
char *map = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);
if (map == MAP_FAILED) {
perror("mmap");
return 1;
}
munmap(map, length);
close(fd);
return 0;
}
- brk 및 sbrk
7. 메모리 관리 방법
-
메모리 누수
- 할당된 메모리를 해제하지 않으면 메모리 누수가 발생
- 모든 동적 메모리 할당 후에는 반드시 해제를 수행 필요
-
페이지 폴트
- 페이지 폴트가 자주 발생하면 성능이 저하
- 메모리 접근 패턴을 최적화하거나 대규모 페이지를 사용하는 것이 좋음
-
디버깅 팁
- valgrind
- 메모리 누수를 검사하고, 메모리 오류를 찾는 데 유용한 도구
- /proc/PID/maps
- 특정 프로세스의 메모리 맵을 확인하여 메모리 사용 현황을 파악
8. 결론
물리 메모리 구성 및 가상 주소 관리는 운영 체제의 성능과 안정성에 중요한 기능을 합니다. 페이지 프레임 디스크립터, 존, 노드, HIGHMEM, TLB, 페이지 테이블 구조, 메모리 압축, 투명한 대형 페이지, 메모리 관리 개선 사항 등 다양한 구성 요소를 통해 메모리 관리의 효율성을 높일 수 있습니다.