그러면 이것은 어떻게 이루어지나요?

그러면 이것은 어떻게 이루어지나요?

내 RHEL7의 출력에 따르면 lsof파일 설명자가 있는 하나의 파일이 mem40개의 프로세스에서 사용되는 것으로 나타났습니다. 이는 이 파일이 메모리에 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;

실제 메모리에 있는 파일의 여러 복사본은 비공유 모드로 매핑되고 프로세스가 가상 메모리에 쓰는 경우에만 필요합니다. 그렇지 않고 쓰기가 발생하지 않으면(내 생각에는 그렇지 않습니다) 프로세스가 메모리를 읽기 전에 데이터가 물리적 메모리를 차지할 필요조차 없습니다.

관련 정보