
lsof
내 RHEL7 의 출력에 따르면 파일 설명자가 있는 하나의 파일이 mem
40개의 프로세스에서 사용되는 것으로 나타났습니다. 이 파일이 메모리에 40번 매핑되었다는 뜻인가요? 누군가 메모리 매핑 파일이 무엇을 의미하는지 설명해 주시겠습니까? 내 기억 속에 40번이나 있다는 뜻인가요?
# lsof /usr/lib/locale/locale-archive 명령 PID 사용자 FD 유형 장치 크기/OFF 노드 이름 vmtoolsd 605 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive agetty 656 루트 mem 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 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive snmpd 4704 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 수면 5461 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmsubagt 6487 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 수면 6649 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc1 6803 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc2 6835 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc3 6836 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc4 6856 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc5 6884 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc6 6889 usr mem 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 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc8 7943 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 8001 루트 mem 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 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20648 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20649 루트 mem 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 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc12 21354 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc13 21355 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc14 21356 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc15 21357 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc16 21358 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc17 21554 루트 mem 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 루트 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc22 22017 루트 mem 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라고 합니다.)
메모리 매핑 파일은 OS에 파일을 메모리에 매핑하도록 요청하는 경우입니다. 읽기/쓰기를 시작할 때까지 파일을 로드하지 않고 필요한 것만 로드합니다. 메모리 매핑은 읽기/쓰기/탐색 등과는 다른 인터페이스일 뿐입니다. 읽기/쓰기/탐색을 통해 메모리에 액세스할 수도 있습니다.
그러면 이것은 어떻게 이루어지나요?
이는 일부 사항이 동일하다는 사실을 인식함으로써 이루어집니다. 즉, 스왑과 파일은 동일합니다. RAM과 파일 캐시는 동일합니다. 따라서 파일을 열면 스왑으로 매핑됩니다(다른 항목을 스왑하는 데 사용되지 않으므로 걱정하지 마세요). 읽기 시작하면 세그먼트 오류가 생성되고 OS가 파일에서 이를 교체합니다. (예외(세그 오류)는 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;
비공유 모드로 매핑되고 프로세스가 실제 메모리에 두 개 이상의 파일 복사본이 필요한 가상 메모리에 쓰는 경우에만 해당됩니다. 그렇지 않으면 쓰기가 발생하지 않는 경우(내 생각에는 그렇지 않음) 프로세스가 메모리를 읽기 전에 데이터가 물리적 메모리를 차지할 필요조차 없습니다.