Algumas coisas precisam ser esclarecidas aqui:
- Não há praticamente nenhuma diferença entre um programa que está no armazenamento físico ou na memória. Se o kernel não encontrar o arquivo já mapeado na memória,
mmap
acontece e a partir de então, o arquivo é acessado pelas páginas da memória, mapeadas na memória virtual de um programa. Note que todo este mecanismo é transparente enquanto muitas coisas acontecem em segundo plano: um arquivo pode já estar em cache do uso anterior, a memória real pode ter sido trocada para o disco se houver falta de espaço, e assim por diante ... - As bibliotecas vinculadas dinamicamente são carregadas uma vez, mesmo que muitos executáveis estejam vinculados a elas. Novamente, as páginas são mapeadas na memória virtual do processo que precisa delas.
- Ter o conteúdo de um executável carregado na memória não tem nada a ver com o código que está sendo executado. Cada vez que um novo processo é criado (através do fork), ele obtém seu próprio layout de memória virtual e não se importa onde as páginas são armazenadas e quem mais as está usando. Quando
exec
é chamado (execve
normalmente), o binário (provavelmenteelf
format) será analisado, diferentes conteúdos serão mapeados para diferentes páginas (código de programa, dados estáticos, pilha será alocada e assim por diante) e o vinculador procura os símbolos não resolvidos no código e os mapeia para os endereços nas bibliotecas dinamicamente vinculáveis, que também são mapeadas no espaço de endereço virtual nesse estágio. A execução é então passada para o ponto de entrada no código no programa executado.
Observe que cada execução de um determinado programa é seu próprio novo processo e não se importa de onde vem o código. É possível que o código já esteja na RAM - ou não, o gerenciamento de memória é muito dinâmico. Também pode ser que a mesma página de memória física que contém o código seja mapeada no espaço de endereço de vários processos, e as bibliotecas vinculadas dinamicamente definitivamente usem as mesmas páginas compartilhadas, mas é isso.
É possível pré-carregar bibliotecas frequentemente usadas no momento da inicialização, para que os processos sejam executados mais rapidamente: mas o que isso significa é que o vinculador já encontra as páginas carregadas na RAM e não precisa lê-las do disco rígido dirigir. Isso é novamente uma maneira de armazenar em cache e é simplesmente um efeito colateral do fato de que o kernel está embaralhando as páginas da maneira que quiser, tudo o que você vê é o espaço de endereço virtual.
Se você está se referindo a uma situação em que a invocação de algum comando está reutilizando um processo existente, isso é algo completamente diferente. Você pode ter algum protocolo de comunicação que procure uma instância existente e informe o que fazer. Ou você pode ter um processo de sono que desperta quando há mais o que fazer. Mas nesses casos, você não está realmente executando um novo processo.
Não sei exatamente qual foi a sua pergunta, mas espero que isso seja respondido pelo menos parcialmente.