AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 539502
Accepted
Gregg Leventhal
Gregg Leventhal
Asked: 2019-09-08 05:27:22 +0800 CST2019-09-08 05:27:22 +0800 CST 2019-09-08 05:27:22 +0800 CST

O que acontece quando um arquivo 100% paginado no cache da página é modificado por outro processo

  • 772

Eu sei que quando uma página de cache de página é modificada, ela é marcada como suja e requer um write-back, mas o que acontece quando:

Cenário: O arquivo /apps/EXE, que é um arquivo executável, é paginado completamente no cache da página (todas suas páginas estão em cache/memória) e sendo executado pelo processo P

A liberação contínua substitui /apps/EXE por um novo executável.

Suposição 1: suponho que o processo P (e qualquer outra pessoa com um descritor de arquivo referenciando o executável antigo) continuará usando o antigo, na memória /apps/EXE sem problemas, e qualquer novo processo que tentar executar esse caminho obterá o novo executável.

Suposição 2: Presumo que, se nem todas as páginas do arquivo forem mapeadas na memória, tudo ficará bem até que haja uma falha de página exigindo páginas do arquivo que foram substituídas e provavelmente ocorrerá uma falha de segmentação?

Pergunta 1: Se você bloquear todas as páginas do arquivo com algo como vmtouch, isso altera o cenário?

Pergunta 2: Se /apps/EXE estiver em um NFS remoto, isso faria alguma diferença? (presumo que não)

Por favor, corrija ou valide minhas 2 suposições e responda minhas 2 perguntas.

Vamos supor que esta é uma caixa CentOS 7.6 com algum tipo de kernel 3.10.0-957.el7

Atualização: Pensando mais sobre isso, gostaria de saber se esse cenário não é diferente de qualquer outro cenário de página suja.

Suponho que o processo que escreve o novo binário fará uma leitura e obterá todas as páginas de cache, pois todas as páginas serão paginadas e, em seguida, todas essas páginas serão marcadas como sujas. Se eles estiverem bloqueados, eles serão apenas páginas inúteis ocupando a memória central depois que a contagem de referências chegar a zero.

Eu suspeito que quando os programas atualmente em execução terminarem, qualquer outra coisa usará o novo binário. Supondo que tudo esteja correto, acho que só é interessante quando apenas parte do arquivo é paginado.

linux
  • 3 3 respostas
  • 1694 Views

3 respostas

  • Voted
  1. Best Answer
    filbranden
    2019-09-08T07:17:29+08:002019-09-08T07:17:29+08:00

    A liberação contínua substitui /apps/EXE por um novo executável.

    Essa é a parte importante.

    A forma como um novo arquivo é lançado é criando um novo arquivo (por exemplo /apps/EXE.tmp.20190907080000), escrevendo o conteúdo, configurando permissões e propriedade e finalmente renomeando(2) para o nome final /apps/EXE, substituindo o arquivo antigo.

    O resultado é que o novo arquivo tem um novo número de inode (o que significa, na verdade, é um arquivo diferente).

    E o arquivo antigo tinha seu próprio número de inode, que na verdade ainda existe , mesmo que o nome do arquivo não esteja mais apontando para ele (ou não há mais nomes de arquivo apontando para esse inode).

    Então, a chave aqui é que quando falamos sobre "arquivos" no Linux, na maioria das vezes estamos falando sobre "inodes", já que uma vez que um arquivo é aberto, o inode é a referência que mantemos para o arquivo.

    Suposição 1 : suponho que o processo P (e qualquer outro com um descritor de arquivo referenciando o executável antigo) continuará usando o antigo, na memória /apps/EXE sem problemas, e qualquer novo processo que tentar executar esse caminho obterá o novo executável.

    Correto.

    Suposição 2 : Presumo que, se nem todas as páginas do arquivo estiverem mapeadas na memória, tudo ficará bem até que haja uma falha de página exigindo páginas do arquivo que foram substituídas e provavelmente ocorrerá uma falha de segmentação?

    Incorreta. O inode antigo ainda está disponível, portanto, as falhas de página do processo usando o binário antigo ainda poderão encontrar essas páginas no disco.

    Você pode ver alguns efeitos disso observando o /proc/${pid}/exelink simbólico (ou, equivalentemente, lsofa saída) do processo executando o binário antigo, que mostrará /app/EXE (deleted)para indicar que o nome não está mais lá, mas o inode ainda está por aí.

    Você também pode ver que o espaço em disco usado pelo binário só será liberado depois que o processo morrer (assumindo que é o único processo com esse inode aberto.) Verifique a saída de dfantes e depois de matar o processo, você o verá cair pelo tamanho daquele velho binário que você achava que não existia mais.

    BTW, isso não é apenas com binários, mas com qualquer arquivo aberto. Se você abrir um arquivo em um processo e remover o arquivo, o arquivo será mantido no disco até que o processo feche o arquivo (ou morra). o driver do sistema de arquivos (no kernel do Linux) mantém um contador de quantas referências existem para aquele inode na memória e só liberará o inode do disco quando todas as referências do sistema em execução também forem liberadas.

    Pergunta 1 : Se você bloquear todas as páginas do arquivo com algo como vmtouch, isso altera o cenário

    Esta questão é baseada na suposição incorreta 2 de que não bloquear as páginas causará falhas de segmentação. Não vai.

    Pergunta 2 : Se /apps/EXE estiver em um NFS remoto, isso faria alguma diferença? (presumo que não)

    Ele deve funcionar da mesma maneira e na maioria das vezes funciona, mas existem algumas "pegadinhas" com o NFS.

    Às vezes, você pode ver os artefatos de excluir um arquivo que ainda está aberto no NFS (aparece como um arquivo oculto nesse diretório).

    Você também tem alguma maneira de atribuir números de dispositivo às exportações NFS, para garantir que eles não sejam "reorganizados" quando o servidor NFS for reinicializado.

    Mas a ideia principal é a mesma. O driver do cliente NFS ainda usa inodes e tentará manter os arquivos (no servidor) enquanto o inode ainda for referenciado.

    • 13
  2. mosvy
    2019-09-08T09:13:36+08:002019-09-08T09:13:36+08:00

    Suposição 2: Presumo que, se nem todas as páginas do arquivo forem mapeadas na memória, tudo ficará bem até que haja uma falha de página exigindo páginas do arquivo que foram substituídas e provavelmente ocorrerá uma falha de segmentação?

    Não, isso não acontecerá, porque o kernel não permitirá que você abra para escrever ou substituir qualquer coisa dentro de um arquivo que esteja atualmente em execução. Tal ação falhará com ETXTBSY[1] :

    cp /bin/sleep sleep; ./sleep 3600 & echo none > ./sleep
    [9] 5332
    bash: ./sleep: Text file busy
    

    Quando o dpkg, etc atualiza um binário, ele não o substitui, mas usa rename(2)o que simplesmente aponta a entrada do diretório para um arquivo completamente diferente, e quaisquer processos que ainda tenham mapeamentos ou alças abertas para o arquivo antigo continuarão a usá-lo sem problemas .

    [1] a ETXBUSYproteção não se estende a outros arquivos que também podem ser considerados "texto" (= live code/executável): bibliotecas compartilhadas, classes java, etc; modificar tal arquivo enquanto mapeado por outro processo fará com que o processo falhe. No linux, o vinculador dinâmico obedientemente passa o MAP_DENYWRITEsinalizador para mmap(2), mas não se engane - não tem nenhum efeito. Exemplo:

    $ cc -xc - <<<'void lib(){}' -shared -o lib.so
    $ cc -Wl,-rpath=. lib.so -include unistd.h -xc - <<<'
       extern void lib();
       int main(){ truncate("lib.so", 0); lib(); }
    '
    ./a.out
    Bus error
    
    • 8
  3. R.. GitHub STOP HELPING ICE
    2019-09-08T13:40:25+08:002019-09-08T13:40:25+08:00

    A resposta de filbranden está correta, supondo que o processo de liberação contínua faça a substituição atômica adequada de arquivos via rename. Se não, mas modifica o arquivo no local, as coisas são diferentes. No entanto, seu modelo mental ainda está equivocado.

    Não há possibilidade de as coisas serem modificadas no disco e serem inconsistentes com o cache da página, porque o cache da página é a versão canônica e a que foi modificada. Quaisquer gravações em um arquivo ocorrem por meio do cache de página. Se já estiver presente, as páginas existentes serão modificadas. Se ainda não estiver presente, as tentativas de modificar uma página parcial farão com que toda a página seja armazenada em cache, seguida pela modificação como se já estivesse armazenada em cache. Escritas que abrangem uma página inteira ou mais podem (e quase certamente o fazem) otimizar a etapa de leitura paginando-as. .

    (*) Eu menti um pouco. Para NFS e outros sistemas de arquivos remotos, pode haver mais de um, e eles normalmente (dependendo de qual e de quais opções de montagem e do lado do servidor são usadas) não implementam corretamente a atomicidade e a semântica de ordenação para gravações. É por isso que muitos de nós os consideramos fundamentalmente quebrados e nos recusamos a usá-los para situações em que haverá gravações simultâneas ao uso.

    • 4

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve