Carregamento e execução de programas na memória [closed]

0

Ao comparar entre o carregador de link e o editor de link, encontrei um ponto que no caso de vincular a vinculação e a realocação do carregador ocorre para cada execução do programa (e acontece no momento do carregamento) enquanto no caso do editor de vinculação, a vinculação coloque apenas uma vez e o programa pode ser carregado e usado várias vezes. Isso significa que um programa é carregado na memória principal somente quando o controle de execução é dado a ele (ou o SO decidiu que é o próximo programa a ser executado)? > Especificar o carregamento de um programa na memória principal é uma garantia de slot de execução imediata?

    
por Kir 11.02.2015 / 10:47

2 respostas

2

Algumas coisas precisam ser esclarecidas aqui:

  1. 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 ...
  2. 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.
  3. 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 (provavelmente elf 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.

    
por 11.02.2015 / 12:20
0

Sua pergunta é bem difícil de entender e pode conter alguns equívocos.

Does this mean that a program is loaded into primary memory only when execution control is given to it(or OS has decided that it is the next program to be executed)

No UNIX, o controle é entregue ao próximo programa através da chamada de sistema execve() (e variantes). Essa chamada de sistema leva o nome do arquivo do programa para ser executado como um argumento. Portanto, é como um pedido para carregar e executar o programa. O programa não foi carregado antecipadamente. Então, nesse sentido, a resposta à sua pergunta é "sim".

Ignoraremos o fato de que o código do programa ainda pode residir em cache na memória física, se tiver sido lido ou executado antes. Isso é uma otimização.

A primeira coisa que o kernel faz é carregar o arquivo em questão.

Se for um executável vinculado dinamicamente, ele também carrega um vinculador dinâmico, que é um programa auxiliar que executará vinculação em tempo de execução no programa. Esse ajudante faz o seu trabalho, o que geralmente envolve o carregamento de outras partes do código (bibliotecas compartilhadas).

Uma vez que a vinculação dinâmica é feita (ou se nenhuma vinculação dinâmica é feita porque o programa não está dinamicamente vinculado), o controle é passado para o código do programa.

is loading of a program into primary memory a guarantee of immediate execution slot?

Eu não entendo "slot de execução imediata".

Pode haver muitas razões diferentes para carregar um arquivo (contendo um programa) na memória: para executá-lo, copiá-lo, editá-lo, etc ...

    
por 11.02.2015 / 11:03