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

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

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

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

관련 정보