Então, como isso é feito?

Então, como isso é feito?

A saída do lsofmeu RHEL7 mostra que um arquivo com descritor de arquivo memé usado por 40 processos. Isso significa que este arquivo é mapeado na memória 40 vezes ou o quê? Alguém poderia explicar o que significam arquivos mapeados na memória? Isso significa que 40 vezes na minha memória?

# lsof /usr/lib/locale/locale-archive
COMANDO PID USUÁRIO TIPO FD TAMANHO DO DISPOSITIVO/DESLIGADO NOME DO NÓ
vmtoolsd 605 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
agetty 656 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
mem raiz 963 sintonizado 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 raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
snmpd 4704 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
dormir 5461 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
cmsubagt 6487 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
dormir 6649 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc1 6803 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc2 6835 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc3 6836 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc4 6856 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc5 6884 mem raiz 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 raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc8 7943 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
crond 8001 mem raiz 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 raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc9 20648 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc10 20649 mem raiz 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 raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc12 21354 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc13 21355 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc14 21356 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc15 21357 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc16 21358 mem raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc17 21554 mem raiz 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 raiz REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc22 22017 mem raiz 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

Responder1

Dê uma olhada na diferença entre memória virtual e física.

Muitos processos podem mapear a mesma memória física. Se 10 processos mapearem o mesmo arquivo, no máximo uma cópia será armazenada em cache na RAM.

Se a memória não for compartilhada, se um processo a alterar, essa página (com a alteração) será duplicada antes de confirmar a gravação. (Portanto, nem toda a memória é copiada. Isso é chamado de cópia na gravação ou COW).

Um arquivo mapeado na memória ocorre quando você solicita ao sistema operacional para mapear um arquivo na memória. Ele não carrega o arquivo até você começar a ler/escrever e somente o que for necessário. O mapeamento de memória é apenas uma interface diferente para leitura/gravação/busca/etc. Você também pode acessar a memória por meio de leitura/gravação/busca.

Então, como isso é feito?

Isso é feito percebendo que algumas coisas são iguais: isso é troca e os arquivos são iguais; e memória RAM e cache de arquivo são iguais. Então, quando você abre um arquivo, ele é mapeado como swap (não se preocupe, ele não será usado para trocar outras coisas). Quando você começa a ler, uma falha de segmentação é gerada e o sistema operacional a troca a partir do arquivo (a exceção (falha de segmentação) é tratada pelo sistema operacional e não é repassada a um processo) (na verdade, não é uma falha de segmentação , é uma falha de página). Não importa qual interface você usa memória ou arquivo. Eles são apenas interfaces com a mesma funcionalidade.

Responder2

Sim, pelo manual de 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;

Somente se estiver mapeado no modo não compartilhado e qualquer processo gravar na memória virtual que exija mais de uma cópia do arquivo na memória física. Caso contrário, se não ocorrer nenhuma gravação (o que eu não acho), os dados nem precisarão ocupar a memória física antes que qualquer processo leia a memória.

informação relacionada