답변:
한마디로 :
가상 크기 : 프로세스가 관리하는 주소 공간의 양입니다. 가상 주소 공간에는 프로세스가 포인터 (메모리 주소 참조)를 통해 액세스 할 수있는 모든 것이 포함됩니다. 예를 들어, 프로그램이 비디오 카드의 프레임 버퍼에 액세스하면 해당 메모리는 프로세스 가상 공간에 매핑되고 포인터에 저장된 주소를받습니다. 메모리 매핑 된 파일과 익명 매핑도 가상 주소 공간 크기에 반영됩니다. 거의 모든 것이 가상 크기입니다. 에 나열된 모든 주소 범위의 크기를 합하면 /proc/<pid>/maps
대략 동일한 가상 크기 값을 반환해야합니다.
상주 크기 : 현재 메모리에 상주하는 프로세스에 특별히 속하는 메모리의 양입니다. 이는 스왑에없는 메모리의 양을 의미합니다. 프로세스가 실행 중일 때도 프로세스의 일부가 스왑 메모리에있을 수 있습니다. 운영 체제는 프로세스가 액세스하려고 할 때 이러한 영역을 스왑에서 가져옵니다. 여기에는 힙, 모든 스레드의 스택 및 기타 개인 매핑이 포함되어야합니다. 당신이 보는 경우 /proc/<pid>/maps
는 [stack]
, [heap]
다른 익명의 매핑 (파일 경로가없는 사람들은) 중 교환 또는 주민 크기 회계 처리하고 있습니다.
공유 크기 : 여러 프로세스에 속할 수있는 메모리 양입니다. 예를 들어, 동일한 응용 프로그램의 인스턴스가 4 개 메모리에로드 된 경우 힙의 인스턴스 4 개와 각 프로세스마다 하나씩 4 개 이상의 스택 (상주 메모리 임)이 있지만 인스턴스는 하나만 있습니다. 프로그램과 라이브러리의 이진 코드. 이것은 공유 공간입니다. 프로그램 바이너리 코드와 라이브러리뿐만 아니라 현지화 파일, 읽기 전용 프로그램 데이터, SysV 및 POSIX 공유 메모리 세그먼트, 세마포어 등도 포함 /proc/<pid>/maps
됩니다. 공유했습니다.
VIRT에는 RSS와 SHR의 결합이 포함되며 항상 그 중 하나보다 큽니다. RSS와 SHR 모두로 설명되는 영역이있을 수 있습니다.
줄리아노에서 대답 :
RSS + SHR <= VIRT, 항상.
이것은 단지 거짓입니다. SHR에는 다른 프로세스와 공유 할 수있는 모든 가상 메모리가 포함되며 RSS에는 프로세스에서 사용하는 RAM에 물리적으로 모든 메모리가 포함됩니다.
따라서 현재 RAM에있는 모든 공유 메모리는 SHR과 RSS 모두에서 카운트되므로 SHR + RSS는 중복 카운트를 포함 할 수 있으므로 의미가 없습니다.
RSS + SHR> VIRT로 프로세스를 구성하려면 큰 파일 (1GB)을 mmap 한 다음 완전히 읽으십시오. mmaped 파일은 RAM에로드되고 VIRT, SHR 및 RSS는 각각 1GB보다 크게 커지므로 SHR + RSS> VIRT.