
A saída do lsof
meu 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.