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

운영체제 기본/가상 메모리: 두 판 사이의 차이

~ldmsys
주소 변환, 요구 할당, 페이지 폴트, /proc 메모리 지표를 독립 챕터로 분리
 
총론 보강: 주소·매핑의 수명, 파일 매핑의 독립 참조와 공유
17번째 줄: 17번째 줄:


또한 모든 페이지를 같은 방식으로 회수하지 않는다. 예를 들어 변경되지 않은 파일 기반 페이지는 버린 뒤 필요할 때 파일에서 다시 읽을 수 있다. 반면 파일에서 복구할 수 없는 데이터는 다른 처리가 필요하다. 메모리 부족을 이해하려면 단순한 사용량뿐 아니라 어떤 종류의 페이지가 차지하고 있는지도 봐야 한다.
또한 모든 페이지를 같은 방식으로 회수하지 않는다. 예를 들어 변경되지 않은 파일 기반 페이지는 버린 뒤 필요할 때 파일에서 다시 읽을 수 있다. 반면 파일에서 복구할 수 없는 데이터는 다른 처리가 필요하다. 메모리 부족을 이해하려면 단순한 사용량뿐 아니라 어떤 종류의 페이지가 차지하고 있는지도 봐야 한다.
== 주소가 아니라 매핑의 수명을 추적한다 ==
가상 주소는 영구적인 물리 메모리의 이름이 아니다. 어느 프로세스의 어느 시점에 그 주소가 무엇과 연결되어 있는지가 중요하다. 주소 값이 같아도 프로세스가 다르면 다른 내용을 가리킬 수 있다. 한 프로세스에서도 매핑을 없앤 뒤 같은 주소에 새 매핑을 만들면 다른 대상을 가리킨다. 포인터의 숫자가 남았다고 접근할 권리까지 남는 것은 아니다.
파일 일부를 메모리에 매핑하면 파일 디스크립터와 매핑이라는 서로 다른 참조가 생긴다. Linux에서는 매핑을 만든 뒤 디스크립터를 닫아도 매핑은 유지된다. “파일을 닫는다”와 “그 내용을 메모리에서 더는 접근하지 않는다”는 같은 사건이 아니다.
사적 파일 매핑의 쓰기는 원래 파일이나 다른 매핑에 자신의 변경을 전달하지 않는다. 공유 파일 매핑은 다른 참여자에게 변경을 전달하는 경로가 되지만, 갱신 순서까지 정해 주지는 않는다. 자료구조를 함께 바꾸려면 동기화가 필요하다. 사적 매핑 역시 원본 파일의 이후 변경까지 차단한 고정 스냅샷을 뜻하지는 않는다.
주소 공간의 논리적 독립성과 실제 물리 페이지의 공유도 양립할 수 있다. 따라서 “매핑된 범위는 얼마나 큰가”, “현재 물리 메모리에 얼마나 올라와 있는가”, “다른 프로세스와 공유하는 부분은 무엇인가”를 구분해야 한다. 이 질문들이 주소 공간, 상주 메모리, 공유 관계를 연결한다.
참고: [https://man7.org/linux/man-pages/man2/mmap.2.html mmap(2)], [https://man7.org/linux/man-pages/man2/fork.2.html fork(2)].


== /proc의 수치를 읽을 때 ==
== /proc의 수치를 읽을 때 ==

2026년 10월 31일 (토) 06:41 판

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

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

주소 변환

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

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

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

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

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

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

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

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

주소가 아니라 매핑의 수명을 추적한다

가상 주소는 영구적인 물리 메모리의 이름이 아니다. 어느 프로세스의 어느 시점에 그 주소가 무엇과 연결되어 있는지가 중요하다. 주소 값이 같아도 프로세스가 다르면 다른 내용을 가리킬 수 있다. 한 프로세스에서도 매핑을 없앤 뒤 같은 주소에 새 매핑을 만들면 다른 대상을 가리킨다. 포인터의 숫자가 남았다고 접근할 권리까지 남는 것은 아니다.

파일 일부를 메모리에 매핑하면 파일 디스크립터와 매핑이라는 서로 다른 참조가 생긴다. Linux에서는 매핑을 만든 뒤 디스크립터를 닫아도 매핑은 유지된다. “파일을 닫는다”와 “그 내용을 메모리에서 더는 접근하지 않는다”는 같은 사건이 아니다.

사적 파일 매핑의 쓰기는 원래 파일이나 다른 매핑에 자신의 변경을 전달하지 않는다. 공유 파일 매핑은 다른 참여자에게 변경을 전달하는 경로가 되지만, 갱신 순서까지 정해 주지는 않는다. 자료구조를 함께 바꾸려면 동기화가 필요하다. 사적 매핑 역시 원본 파일의 이후 변경까지 차단한 고정 스냅샷을 뜻하지는 않는다.

주소 공간의 논리적 독립성과 실제 물리 페이지의 공유도 양립할 수 있다. 따라서 “매핑된 범위는 얼마나 큰가”, “현재 물리 메모리에 얼마나 올라와 있는가”, “다른 프로세스와 공유하는 부분은 무엇인가”를 구분해야 한다. 이 질문들이 주소 공간, 상주 메모리, 공유 관계를 연결한다.

참고: mmap(2), fork(2).

/proc의 수치를 읽을 때

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

cat /proc/$$/status

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

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

참고 문헌