Como um processo lida com a situação quando não encontra memória para usar?

Como um processo lida com a situação quando não encontra memória para usar?

O que acontece quando um determinado processo descobre que não há memória para usar?

Esse processo matará/reiniciará outro processo para prosseguir com sua tarefa?

Ou o que o processo (que requer mais memória) fará nesta situação?

Se possível, alguém pode fornecer um bom link sobre isso?

Responder1

Em alguns sistemas de memória virtual paginados sob demanda, o sistema operacional se recusa a alocar páginas anônimas (ou seja, páginas contendo dados sem uma fonte de sistema de arquivos, como dados de tempo de execução, pilha de programas, etc.), a menos que haja espaço de troca suficiente para trocar as páginas, a fim de liberar memória física. Essa contabilidade rigorosa tem a vantagem de que cada processo tem acesso garantido à quantidade de memória virtual alocada, mas também significa que a quantidade de memória virtual disponível é essencialmente limitada pelo tamanho do espaço de troca.

A contabilidade de memória no kernel Linux tenta compensar programas que tendem a alocar mais memória do que usam, rastreando a quantidade de memória realmente usada pelos processos, ese compromete demaisa quantidade de memória virtual. Em outras palavras, a quantidade de memória virtual alocada pelo kernel pode exceder a quantidade de memória física e espaço de troca combinados no sistema. Na prática, isso significa que a alocação de memória malloc()nunca falhará. Embora isso leve a uma melhor utilização da memória física e do espaço de troca, a desvantagem é que quando a quantidade de memória em uso excede a quantidade de memória física e espaço de troca disponível, o kernel deve de alguma forma liberar recursos de memória para atender à alocação de memória. compromisso.

O mecanismo do kernel usado para recuperar memória para preencher o comprometimento excessivo é chamado deassassino sem memória(assassino de OOM). Normalmente, o mecanismo começará a eliminar processos "não autorizados" que consomem muita memória para liberar memória para outros processos. O comportamento do algoritmo OOM-killer e de contabilidade de memória pode ser ajustado por meio de sysctlconfigurações ou/proc/sys/vm. Se a vm.panic_on_oomconfiguração for diferente de zero, o kernel entrará em pânico quando o sistema ficar sem memória.

A heurística usada pelo OOM-killer pode ser modificada através da vm.oom_kill_allocating_taskconfiguração. Por padrão, o OOM-killer irá examinar a lista de tarefas e selecionar uma tarefa não autorizada que utiliza muita memória para eliminar. O OOM-killer também pode ser configurado para encerrar a tarefa que acionou a condição de falta de memória.

O algoritmo de contabilidade de memória do kernel pode ser ajustado com a vm.overcommit_memoryconfiguração. O padrão é realizar algumas verificações heurísticas fracas antes da supercomprometimento, mas o algoritmo de contabilidade de memória também pode ser definido para um modo estrito, no qual o limite do espaço de endereço virtual é determinado pelo valor das vm.overcommit_ratioconfigurações de acordo com a seguinte fórmula:

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))

Quando a contabilidade estrita de memória estiver em uso, o kernel não alocará mais páginas anônimas, a menos que tenha memória física livre suficiente ou espaço de troca para armazenar as páginas. Isto significa que é essencial que o sistema sejaconfigurado com espaço de troca suficiente. A menos que haja memória física ou espaço de troca suficiente para satisfazer o compromisso de memória, as chamadas para malloc()poderão falhar. Nestes casos cabe ao próprio programa determinar um curso de ação apropriado. Alguns podem simplesmente desistir e falhar completamente, mas também podem recorrer a um algoritmo mais lento, porém mais eficiente em termos de memória, para executar a ação para a qual precisariam da alocação de memória.

Responder2

Isso depende do que o programa está configurado para fazer. Programas simples simplesmente imprimem uma mensagem de erro e morrem quando não conseguem alocar memória suficiente. Alguns programas tentam liberar memória por conta própria e tentam novamente. Alguns programas realizam alguns salvamentos de estado de emergência antes de sair. Alguns programas continuam funcionando de alguma forma e dispensam a memória extra, talvez após informar ao usuário que algum comando não pôde ser executado.

Embora um processo pudesse, em princípio, matar outro processo, isso seria um comportamento extremamente estranho. O processo não teria como saber quais processos eliminar e nenhuma garantia de que seria capaz de capturar sua memória.

Se ofalta de memória é detectada pelo kernelem vez de pela aplicação, o kernel pode matar alguns processos, com base em heurísticas complexas (como “não matar sshd”).

informação relacionada