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 sysctl
configurações ou/proc/sys/vm
. Se a vm.panic_on_oom
configuraçã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_task
configuraçã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_memory
configuraçã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_ratio
configuraçõ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
”).