O que acontece no UNIX / Linux quando um programa é maior que o tamanho da memória?

6

Eu queria saber como sistemas embarcados são capazes de executar programas maiores que o tamanho da memória. Se eu tivesse 1 GB de memória e o programa fosse de 1,5 GB, o programa carregaria? Existem sistemas que usam apenas a memória disponível?

    
por MAXGEN 27.02.2014 / 06:10

3 respostas

6

1. Memória virtual
O sistema garantirá que os processos receberão a quantidade solicitada de memória, apesar de serem maiores que a memória física. Dessa forma, o kernel aloca um espaço de memória virtual do tamanho máximo de memória física que ele pode manipular. Por exemplo. em uma máquina de 32 bits, o kernel alocará um total de 2 ^ 32, ou seja, 4 GB de endereços virtuais para cada processo por padrão.
2. Supercomprometimento
Existe também algo chamado overcommit no Linux, em que o kernel responde a solicitações de alocação de memória muito maiores que a memória física disponível. A supercomprometimento fará com que o kernel aloque memória virtual sem qualquer garantia de alocação de memória física correspondente.
3. Trocar espaço
Como o processo requer que grande parte da memória comece realmente usando essa quantidade de memória, o kernel inicia a varredura de páginas de memória não utilizadas, assim como páginas de memória de processos com menor prioridade ou que não estão atualmente em execução. Ele transfere esses dados para o espaço de troca no dispositivo de armazenamento secundário e libera essas páginas para o processo. Isso é chamado de roubo de páginas.

Repetindo continuamente o passo 3, isto é, trocando páginas para dentro e fora, o kernel consegue mostrar ao processo uma ilusão da memória que ele solicitou, que pode ser maior do que a memória fisicamente disponível. Agora, como você mencionou um sistema embarcado, temos que considerar se o swap está ativado no sistema ou não. Se sim, os 3 pontos acima se aplicam. Se não, os 3 pontos acima ainda se aplicam, mas a única coisa é que seu processo provavelmente falhará ou poderá ser eliminado pelo assassino OOM (Out-of-Memory). Existe também a possibilidade de que o kernel use OOM killer para eliminar outros processos para liberar mais páginas para seus processos, se acharem adequado. No entanto, isso acontecerá somente se não houver espaço de troca.

    
por 27.02.2014 / 12:11
3

Nada em particular acontecerá, da mesma maneira que com qualquer processo.

Apesar da crença popular, um código de programa e dados não são carregados como um todo quando o programa é iniciado. Apenas um pequeno subconjunto, essencialmente seu ponto de entrada (tabela elf, função principal, pilha inicial) é carregado, e todo o resto é carregado sob demanda, isto é, paginado. Isto acontecerá quando o código ou dados a serem acessados não estiverem em uma página atualmente. na memória física.

Da mesma forma, quando há uma pressão na RAM, menos páginas usadas são trocadas para o disco para liberar espaço.

Se o tamanho da RAM disponível mais o tamanho da área de troca for muito pequeno para todas as páginas dos programas em execução, o comportamento depende do sistema operacional:

  • O Linux e outros sistemas operacionais que supercomprometem a memória virtual matam mais ou menos aleatoriamente alguns processos para liberar espaço.

  • Sistemas operacionais não supercomprometidos como o Solaris não permitirão que novos processos sejam iniciados e recusarão nova reserva de memória (malloc) de processos existentes.

por 27.02.2014 / 13:47
0

Não. A maioria de suas páginas não usadas irá trocar. Se não houver swap (ou não o suficiente), ele será eliminado e você receberá um aviso de kernel.

    
por 27.02.2014 / 06:17

Tags