arquivos mapeados na memória Linux

1

A saída de lsof no meu RHEL7 mostra que um arquivo com o descritor de arquivo mem é usado por 40 processos. Isso significa que esse arquivo é mapeado na memória 40 vezes ou o que? Alguém poderia explicar o que significa arquivos mapeados na memória? Isso significa que 40 vezes na minha memória?

# lsof /usr/lib/locale/locale-archive
COMMAND     PID     USER  FD   TYPE DEVICE  SIZE/OFF     NODE NAME
vmtoolsd    605     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
agetty      656     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
tuned       963     root 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     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
snmpd      4704     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
sleep      5461     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
cmsubagt   6487     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
sleep      6649     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc1      6803     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc2      6835     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc3      6836     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc4      6856     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc5      6884     root 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     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc8      7943     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
crond      8001     root 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     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc9     20648     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc10    20649     root 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     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc12    21354     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc13    21355     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc14    21356     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc15    21357     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc16    21358     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc17    21554     root 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     root mem    REG    8,5 106070960 50808629 /usr/lib/locale/locale-archive
proc22    22017     root 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
    
por sys463 31.05.2018 / 14:11

2 respostas

1

Veja a diferença entre a 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 copiar na gravação ou COW).

Um arquivo de memória mapeada é quando você pede ao SO para mapear um arquivo na memória. Ele não carrega o arquivo até que você comece a ler / escrever e, em seguida, apenas o que é 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 através de leitura / gravação / busca.

Então, como isso é feito?

Isso é feito percebendo que algumas coisas são as mesmas: isso é swap e os arquivos são os mesmos; e o cache de ram e de arquivo são os mesmos. 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, um seg-fault é gerado e o SO o troca, a partir do arquivo (A exceção (seg-fault) é manipulada pelo sistema operacional, portanto, não é passada para 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 sobre a mesma funcionalidade.

    
por 31.05.2018 / 16:38
2

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 exigiria mais de uma cópia do arquivo na memória física. Caso contrário, se não houver escrita (o que eu não acho), os dados nem precisam ocupar a memória física antes que qualquer processo leia a memória.

    
por 31.05.2018 / 15:52