가상 메모리와 페이지
Virtual Memory · 가상 메모리
는 각 의 주소 공간을 실제 메모리와 분리하고 페이지 단위 매핑과 접근 권한으로 관리하는 체계이다. RAM보다 큰 공간을 쓰는 기능에 한정되지 않으며 격리·공유·요청 시 할당을 함께 지원한다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 프로세스별 독립 주소 공간과 접근 권한을 제공한다.
- 가상 페이지를 물리 프레임 또는 파일·Swap 같은 저장 근거에 연결한다.
- 공유 페이지··캐시·회수로 물리 메모리 사용을 관리한다.
02어떤 순서로 동작하나
- 가상 주소 생성
CPU가 명령이나 데이터를 접근할 때 현재 의 가상 주소를 사용한다.
- 매핑 조회
에 유효한 변환이 있으면 사용하고 없으면 페이지 테이블을 통해 매핑과 권한을 확인한다.
- 폴트 처리
필요한 페이지가 없거나 보호 조건에 걸리면 커널이 요청 시 할당·파일 읽기· 복사 등으로 해결할지 잘못된 접근으로 처리할지 결정한다.
- 접근 재개
유효한 매핑을 마련하면 명령을 다시 진행하고, 허용되지 않는 접근이면 에 오류를 전달한다.
03먼저 알아둘 용어와 구성요소
- 언어의 객체 생성이나 malloc 요청이 매번 새 운영체제 매핑을 만드는 것은 아니다. 사용자 공간 가 확보한 메모리를 나눠 재사용할 수 있다.
- 의 주소 범위에는 읽기·쓰기·실행 권한과 파일 연결 여부 같은 속성이 있다. 주소 범위를 예약한 것과 해당 페이지가 RAM에 존재하는 것은 구분한다.
- 페이지 방식에서는 가상 주소 공간과 물리 메모리를 일정 크기의 단위로 다룬다. 4 KiB 페이지를 가정하면 페이지 안의 위치를 나타내는 오프셋은 12비트다. 나머지 주소 부분으로 페이지 테이블의 매핑을 찾고, 얻은 물리 페이지 프레임 번호에 같은 오프셋을 붙인다. 4 KiB는 흔한 기본값의 예시이며 시스템에 따라 다른 페이지 크기와 huge page도 사용한다.
- 주소를 참조할 때마다 긴 페이지 테이블 탐색을 반복하면 비용이 커진다. 는 최근 주소 변환과 관련 권한 정보를 빠르게 재사용하기 위한 CPU의 캐시다. hit이면 캐시된 변환을 활용하고, miss이면 가 정한 방식으로 페이지 테이블을 찾아 변환을 채운다. miss 자체는 디스크를 읽는다는 뜻이 아니다.
- 요청 시점에 처음 사용하는 익명 메모리에는 새 페이지나 초기화된 페이지를 준비할 수 있다. 뒤 부모·자식이 페이지를 읽기 전용으로 공유하다 한쪽이 수정하면 필요한 페이지를 복사하고 매핑을 바꾸는 Copy-on-Write 처리를 할 수 있다. 공유하던 데이터가 실제로 수정될 때 비용을 부담하는 것이다.
- 주소 공간 크기(VSZ)가 크다고 그만큼의 물리 RAM을 독점하고 있는 것은 아니다. RSS는 현재 상주하는 페이지를 보지만 공유 페이지를 여러 에서 중복 집계할 수 있다. PSS는 공유분을 나누어 계산해 기여도를 이해하는 데 도움을 준다. 어느 지표를 더했는지 모르면 시스템 전체와 합계가 다르다는 이유로 오류라고 판단하기 쉽다.
inxi의 메모리·Swap 요약을 커널 통계와 연결하기
설치 용량·커널이 이용할 용량·현재 사용량을 구별하고, Swap 사용량 0이 의미하는 범위를 확인한다.
실습 구성과 전제
- 화면은 게스트의 이며 inxi 3.3.33 출력을 보여 준다.
- inxi 요약 두 장은 서로 다른 시점이다. 작은 사용량 차이를 곧바로 누수나 성능 문제로 판정하지 않는다.
도구의 필드 정의부터 맞춘다
- inxi의 total은 설치된 RAM 규모, available은 예약 영역 등을 뺀 커널 사용 가능 총량이다. free의 available이나 /proc/meminfo의 MemAvailable과 같은 뜻이 아니다.
- 화면의 사용률은 inxi available을 기준으로 한다. 설치 용량 4 GiB를 분모로 임의 계산하면 표시값과 다를 수 있다.
원본 크기로 보기 ↗- Info Memory 행은 total 4 GiB, available 3.54 GiB, used 627.8 MiB (17.3%)다.
- Swap 행에는 type partition, size 3.91 GiB, used 0 KiB와 /dev/dm-1이 보인다.
확인 기준RAM 용량과 Swap 파티션 크기를 서로 다른 자원으로 기록한다.
한 시점의 사용량과 시간에 따른 압력을 분리한다
- 다른 요약은 629.8 MiB/3.54 GiB와 17.4%를 보여 준다. ·캐시·관측 시각이 바뀌면 사용량도 변할 수 있다.
- 누수나 압력 여부는 시간에 따른 추세, 점유, 회수·입출력 지표와 함께 판단한다. 단일 전체 사용률만으로 특정 가 원인이라고 할 수 없다.
bashfree -h vmstat 1 5 cat /proc/meminfo현 환경에서 메모리 가용 추정치와 시간 구간별 활동을 비교하는 조회 예시다.
원본 크기로 보기 ↗- 간략 출력은 Mem 629.8 MiB/3.54 GiB (17.4%)로 표기된다.
- Uptime과 프로세스 수가 상세 화면과 달라 같은 순간의 완전한 반복 측정으로 볼 수 없다.
확인 기준vmstat 첫 줄과 후속 구간의 의미를 구분하고 si·so 및 실행 대기·I/O 지표를 함께 읽는다.
Swap 0과 Swap 비활성을 구별한다
- 사용량 0은 그때 Swap에 사용 중인 양이 없다는 뜻이다. 구성·활성화 여부는 활성 Swap 목록으로 별도 확인한다.
- Swap 사용량이 존재하는 것만으로 현재 심한 스와핑이라고 할 수도 없다. 실제 swap-in/out 활동과 메모리 압력의 동시 관측이 필요하다.
bashswapon --show cat /proc/swaps cat /proc/pressure/memory활성 Swap과 지원되는 커널의 메모리 압력을 읽는다. PSI 경로는 커널 설정에 따라 없을 수 있다.
확인 기준활성 목록, 사용량, 구간별 입출력을 서로 다른 항목으로 기록한다. 캡처에는 Swap 변경·비활성화 결과가 없다.
실습에서 확인한 동작 원리
- 같은 available이라는 이름도 도구에 따라 정의가 다르므로 필드의 분모와 단위를 확인한다.
- ·현재 RAM 점유·Swap 구성·현재 은 구별해서 관측한다.
04예제로 따라가기
- 4KiB 페이지에서 가상 주소 0x1234는 페이지 번호 1과 오프셋 0x234로 나뉘며 매핑된 프레임 번호가 바뀌어도 오프셋은 유지된다.
- 후 부모·자식이 같은 세 페이지를 공유하면 각각 RSS에 보이지만 실제 물리 점유를 단순히 두 배로 계산하면 안 된다.
- 처음 접근한 유효 익명 페이지의 폴트는 정상적인 요청 시 할당일 수 있다. 모든 page fault가 디스크 I/O나 프로그램 버그를 뜻하지는 않는다.
05혼동하기 쉬운 점과 확인 기준
- 객체 참조가 사라지거나 free를 호출해도 가 공간을 보유하면 RSS가 바로 줄지 않을 수 있다. 해제 호출· 재사용·운영체제 반환을 다른 관측으로 본다.
- 메모리 상한에서 필요한 회수에 실패하면 해당 cgroup의 OOM이 발생할 수 있다. 설정값·memory.current·memory.events와 실제 종료 시점을 연결한다.
- 메모리 누수는 필요가 끝난 자원을 계속 유지하여 회수되지 않는 현상이며, 증가 추세와 작업량의 관계를 조사한다. 정상 캐시·배치 작업의 일시적 최대 사용량과 구분해야 한다. OOM은 전체 시스템이나 제한된 cgroup에서 회수가 충분하지 않은 상황과 연결될 수 있다. 종료 시각, 대상 PID·서비스, 제한값, 당시의 부하와 커널 기록을 함께 보존한다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.