본문으로 이동
  • 현재 모든 문서는 작성 중입니다. 보시는 데 불편함이 있더라도 양해 부탁드립니다.

운영체제 기본/가상 메모리

~ldmsys
관리자 (토론 | 기여)님의 2026년 10월 31일 (토) 06:32 판 (주소 변환, 요구 할당, 페이지 폴트, /proc 메모리 지표를 독립 챕터로 분리)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

목차 · 이전: 프로세스와 스레드 · 다음: 파일과 입출력

포인터에 들어 있는 주소를 RAM의 물리적 위치로 생각하면, 서로 다른 프로세스가 같은 주소를 사용하는 상황을 설명하기 어렵다. 이 장에서는 MMU가 있는 일반적인 Linux PC·서버를 기준으로 가상 주소와 물리 메모리를 구분한다.

주소 변환

프로그램이 사용하는 것은 자기 주소 공간의 가상 주소다. 커널은 가상 주소와 물리 페이지의 매핑을 관리하고, CPU의 MMU는 이를 이용해 주소를 변환한다. 주소 변환을 할 때마다 시스템 호출을 하는 것은 아니다.

매핑에는 어느 물리 메모리를 가리키는지뿐 아니라 어떤 접근을 허용할지에 관한 정보도 들어간다. 읽을 수 있는 영역이 반드시 쓸 수 있는 영역은 아니다. 서로 다른 프로세스의 같은 가상 주소가 다른 물리 페이지로 연결될 수 있고, 공유 메모리처럼 같은 물리 페이지에 연결될 수도 있다.

주소 공간을 확보하는 것과 RAM을 쓰는 것

프로그램이 가상 주소 범위를 확보했다고 그 크기만큼 RAM이 즉시 채워지는 것은 아니다. 매핑의 종류와 접근 여부에 따라 필요한 시점에 페이지를 마련할 수 있다. malloc()도 libc의 메모리 할당기이므로, 호출할 때마다 커널에서 새 메모리를 가져오는 것으로 이해하면 안 된다.

페이지 폴트(page fault)는 메모리 접근을 하려는데 현재의 매핑이나 권한만으로 바로 처리할 수 없을 때 발생한다. 그 뒤의 결과는 원인에 따라 다르다. 유효한 매핑에 필요한 페이지를 준비하거나 copy-on-write를 처리한 뒤 실행을 계속할 수 있고, 잘못된 접근이면 프로세스에 신호가 전달될 수 있다. 따라서 페이지 폴트 횟수를 전부 프로그램 오류 횟수나 디스크 읽기 횟수로 해석해서는 안 된다.

스왑은 가상 메모리의 전부가 아니다

스왑은 메모리 관리에서 일부 데이터를 RAM 밖에 보관하는 데 사용하는 수단이다. 스왑을 사용하지 않더라도 가상 주소 공간, 메모리 보호, 공유 매핑은 사용한다.

또한 모든 페이지를 같은 방식으로 회수하지 않는다. 예를 들어 변경되지 않은 파일 기반 페이지는 버린 뒤 필요할 때 파일에서 다시 읽을 수 있다. 반면 파일에서 복구할 수 없는 데이터는 다른 처리가 필요하다. 메모리 부족을 이해하려면 단순한 사용량뿐 아니라 어떤 종류의 페이지가 차지하고 있는지도 봐야 한다.

/proc의 수치를 읽을 때

Bash에서 현재 셸의 정보를 읽어 보자.

cat /proc/$$/status

VmSize는 가상 메모리 크기이고, VmRSS는 RAM에 상주하는 메모리를 살펴보는 지표다. 가상 주소 공간에 잡힌 영역이 모두 RAM을 점유하는 것은 아니므로 두 값은 다를 수 있다.

VmRSS를 “이 프로세스만 독점하는 정확한 RAM 사용량”으로 해석하는 것도 틀리다. 공유 페이지가 포함될 수 있고 이 인터페이스의 계측 자체에도 정확도 제약이 있다. 여러 프로세스의 RSS를 단순히 더하면 공유 메모리를 중복해서 셀 수 있다. 비교할 때에는 먼저 측정값이 무엇을 세는지 확인해야 한다.

참고 문헌