내 RHEL7의 출력에 따르면 lsof
파일 설명자가 있는 하나의 파일이 mem
40개의 프로세스에서 사용되는 것으로 나타났습니다. 이는 이 파일이 메모리에 40번 정도 매핑되었다는 의미입니까? 메모리 매핑 파일이 무엇을 의미하는지 설명할 수 있는 사람이 있습니까? 내 기억에 40번이 있다는 뜻인가요?
# lsof /usr/lib/locale/locale-archive 명령 PID 사용자 FD 유형 장치 크기/종료 노드 이름 vmtoolsd 605 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive Agetty 656 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 963 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 조정 iostat 1199 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive chkMtaMem 1205 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive snmpd 4704 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 절전 5461 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmsubagt 6487 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 절전 6649 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc1 6803 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc2 6835 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc3 6836 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc4 6856 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc5 6884 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc6 6889 usr 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc7 6893 usr1 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmfpagt 7704 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc8 7943 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 8001 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive sh 8005 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 8014 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 20427 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20648 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20649 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20760 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20777 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc11 21353 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc12 21354 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc13 21355 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc14 21356 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc15 21357 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc16 21358 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc17 21554 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc18 21569 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc19 21590 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc20 21647 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc21 22016 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc22 22017 루트 메모리 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc23 22104 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc24 22122 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
답변1
가상 메모리와 실제 메모리의 차이점을 살펴보세요.
많은 프로세스가 동일한 물리적 메모리를 매핑할 수 있습니다. 10개의 프로세스가 동일한 파일을 매핑하는 경우 최대 하나의 복사본이 RAM에 캐시됩니다.
메모리가 공유되지 않는 경우 한 프로세스에서 메모리를 변경하면 쓰기가 커밋되기 전에 이 페이지(변경 사항 포함)가 복사됩니다. (따라서 모든 메모리가 복사되는 것은 아닙니다. 이를 COW(기록 중 복사)라고 합니다.)
메모리 매핑 파일은 운영 체제에 파일을 메모리에 매핑하도록 요청하는 경우입니다. 읽기/쓰기를 시작할 때까지 파일을 로드하지 않고, 그 다음에는 필요한 것만 로드합니다. 메모리 매핑은 읽기/쓰기/탐색 등을 위한 다른 인터페이스일 뿐입니다. 읽기/쓰기/탐색을 통해 메모리에 액세스할 수도 있습니다.
그러면 이것은 어떻게 이루어지나요?
이는 일부 사항이 동일하다는 것을 인식함으로써 수행됩니다. 즉, 스왑과 파일은 동일하며, 파일 캐시도 동일합니다. 따라서 파일을 열면 스왑으로 매핑됩니다(다른 것을 스왑하는 데 사용되지는 않으니 걱정하지 마세요). 읽기 시작하면 segfault가 생성되고 OS가 이를 파일에서 스왑합니다(예외(segfault)는 OS에서 처리하므로 프로세스로 전달되지 않습니다)(실제로는 분할 오류가 아니라 페이지 오류). 어떤 인터페이스가 메모리나 파일을 사용하는지는 중요하지 않습니다. 그것들은 동일한 기능을 가진 인터페이스일 뿐입니다.
답변2
예, 아래 설명서를 따르십시오 lsof
.
FD is the File Descriptor number of the file or:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
실제 메모리에 있는 파일의 여러 복사본은 비공유 모드로 매핑되고 프로세스가 가상 메모리에 쓰는 경우에만 필요합니다. 그렇지 않고 쓰기가 발생하지 않으면(내 생각에는 그렇지 않습니다) 프로세스가 메모리를 읽기 전에 데이터가 물리적 메모리를 차지할 필요조차 없습니다.