O que acontece quando você substitui um executável mapeado na memória?

Após os comentários de uma das minhas perguntas, fico intrigado em saber o que acontece quando alguém substitui um executável. Eu preciso verificar meu entendimento sobre o assunto.

Diga que eu tenho/usr/bin/myprog. Eu corro e assim o sistema operacional carrega/usr/bin/myprog, provavelmente viahttp://en.wikipedia.org/wiki/Memory-mapped_file#Common_uses.

Por qualquer motivo, esse processo permanece na memória e eu decido que corrigi um bug e sobrescrevi/usr/bin/myprog.

Então, tanto quanto eu entendo:

Se uma instância demyprog já está carregado e substituo o arquivo do qualmyprog já estava carregado, a instância demyprog não é modificado.Se eu executar uma nova instância demyprog ele usará o novo código.

Estou correcto?

No entanto, de acordo com o artigo sobre arquivos mapeados na memória, essa técnica permite que um desenvolvedor trate partes de um arquivo como se fossem memória física.

Então, vejo uma contradição na maneira como entendi as coisas. Se as páginas forem realmente carregadas apenas sob demanda, assumindomyprog não é 100% paginado, este artigo da wikipedia implica que novas páginas serão carregadas do arquivo no disco, que foi alterado desde que a imagem original foi carregada.

No entanto, tenho certeza de que minhas duas imagens compiladas não seriam as mesmas e que os deslocamentos de endereço relevantes para cada arquivo não são idênticos. Então, supondo que isso aconteça, o ponteiro de instruções ficará muito perdido ... Estou certo de que um sistema operacional não carrega partes de duas imagens diferentes na memória como parte do mesmo processo.

Então, como a combinação de mapeamento de memória / paginação por demanda funciona para a execução de programas, por favor? A substituição desse arquivo acionaria uma falha de página em cada uma das páginas dos executáveis para garantir que ele fosse carregado no processo em execução no momento?

Eu fiz um experimento rápido com isso:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    printf("Program resident...");
    while(1)
    {
        printf("??? Just notifying you I'm still here...\n");
        usleep(1000000);
    }

    return 0;
}

E com certeza eu poderia a) substituir este executável enquanto estava em execução eb) sua saída não foi alterada.

Então, o que está acontecendo? Eu particularmente aprecio qualquer sugestão de coisas que eu possa fazer para ver o que acontece (Linux ou Windows).

Obrigado a todos.

Edit: pergunta à qual eu estava me referindo que provocou esta pergunta:Atualizações sem reinicialização - que tipos de problemas ocorrem na prática?

Além disso, sei que isso não se refere especificamente à programação, mas ao resultado da atualização de um executável. Ainda estou interessado, no entanto, e não consigo pensar em um lugar melhor para perguntar.

questionAnswers(5)

yourAnswerToTheQuestion