제가 보기 strace
에는 거의 모든 프로세스가 열려 있고 메모리에 매핑되어 있는 것 같습니다 ld.so.cache
. libc.so.6
적어도 제가 시도한 프로세스에서는 그렇습니다. 이는 이러한 프로세스가 프로세스 메모리에 여러 번 매핑된다는 의미가 아닙니까?
물론, 이러한 파일은 매우 작지만 메모리 낭비가 아닌가?
strace 출력에서는 이러한 항목이 MAP_PRIVATE
세트를 사용하여 mmapped되어 쓰기 중 복사가 가능하지만 여전히 프로세스별로 새로운 맵이 있는 것으로 보입니다.
내 질문:
- 무슨 일이 일어나고 있는지 올바르게 이해하고 있습니까? 즉, 실제로 해당 파일을 필요로 하는 모든 프로세스(모든 프로세스인 것으로 보임)의 메모리에 매핑된 이러한 파일의 새 복사본이 있습니까?
- 어떤 유형의 메모리 공유가 있습니까? 즉, 매핑이 쓰기 중 복사이므로 많은 프로세스가 동일한 물리적 메모리 위치를 보고 있습니까?
답변1
예, 각 프로세스에는 필수 라이브러리에 대한 자체 매핑이 있습니다.
예, 대부분의 데이터는 공유되므로 각 파일의 동일한 버전이 공유된다는 가정하에 각 프로세스는 동일한 물리적 메모리(다른 선형 주소)를 "인식"합니다.
다음과 같이 maps
각 프로세스 디렉터리 /proc/
의 파일을 보면 다양한 매핑을 볼 수 있습니다 .libc
7f1014062000-7f10141f7000 r-xp 00000000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f10141f7000-7f10143f7000 ---p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f10143f7000-7f10143fb000 r--p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f10143fb000-7f10143fd000 rw-p 00199000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
또는
7f4d7a8ec000-7f4d7aa81000 r-xp 00000000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7aa81000-7f4d7ac81000 ---p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7ac81000-7f4d7ac85000 r--p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7ac85000-7f4d7ac87000 rw-p 00199000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
읽기 전용 및 실행 가능 매핑은 라이브러리의 공유 실행 가능 코드에 해당합니다. 읽기 전용 매핑은 라이브러리의 공유 읽기 전용 데이터에 액세스할 수 있습니다. 위에서 볼 수 있듯이 선형 주소는 다릅니다(주소 공간 레이아웃 무작위화 및 다른 로드 순서로 인해). 일단 공유 부분이 메모리에 로드되면 기본 물리적 주소는 동일합니다(맵이 기본 파일을 매핑하기 때문입니다). 공유 메모리를 직접 매핑하는 것보다).