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 significa arquivos mapeados em memória? Isso significa que 40 vezes na minha memória?
# lsof /usr/lib/locale/locale-archive COMANDO PID USUÁRIO FD TIPO TAMANHO DO DISPOSITIVO/DESLIGADO NOME DO NÓ 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 sintonizado 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
Sim, pelo manual de
lsof
:É apenas 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 nenhuma gravação ocorrer (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.
Veja a 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 é quando você pede ao sistema operacional para mapear um arquivo na memória. Ele não carrega o arquivo até que você comece 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 as mesmas: Isso é troca e arquivos são os mesmos; e ram e cache de arquivo são os mesmos. Portanto, 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 do arquivo (a exceção (falha de segmentação) é tratada pelo sistema operacional, portanto não é repassada 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.