Uma maneira de salvar o estado de execução de um programa [duplicado]

8

Eu tenho um programa que executa um cálculo demorado que pode levar vários dias para ser concluído.

Existe uma maneira de salvar o estado de execução do programa; então poderei desligar o computador e executar o programa a partir de um estado salvo. Ou se o programa falhou por algum motivo eu posso reiniciá-lo a partir de um estado salvo (e não desde o início)?

    
por user62511 18.04.2014 / 11:29

2 respostas

6

Fazer instantâneos reinicializáveis de um processo é muito difícil, porque um processo pode ter todos os tipos de interações com o sistema de arquivos. Como regra geral, não espere que sistemas unix suportem isso. Houve variantes unix com core dumps que podem ser reiniciados, mas eu não acho que este é o caso dos modernos (eles se tornaram muito complexos).

Os sistemas Lisp normalmente possuem um comando dump que cria uma imagem reinicializável. Então você poderia escrever seu programa em um dialeto Lisp que suporta dumping .

Você pode executar seu código em uma máquina virtual e usar o gerenciador de máquinas virtuais (por exemplo, VirtualBox) para criar instantâneos periódicos. Dependendo do que seu programa faz, isso pode ou não prejudicar o desempenho.

A melhor solução é provavelmente você criar um recurso de instantâneo em seu programa. Para programas puramente computacionais, isso geralmente é apenas moderadamente difícil. Em um programa computacional multithread, os pontos de captura instantânea são geralmente pontos de sincronização globais, nos quais todos os threads se comunicam. Tente estruturar seu programa como um pacote de tarefas e torne o ponto de entrada um distribuidor que inicia uma tarefa sempre que um processador estiver livre. Após o recebimento de um sinal, o despachante espera que todas as tarefas atuais sejam concluídas, salva os estados do programa e inicia o despacho de tarefas novamente.

    
por 19.04.2014 / 02:53
3

Eu sugeriria hibernar em vez de desligar seu computador, mas se você realmente não puder evitar isso, existe um sistema de instantâneo / restauração chamado CRIU ( Ponto de Verificação / Restauração no Espaço do Usuário), que pode atender às suas necessidades. Com este framework você pode facilmente “congelar” seus processos (na verdade salvando seu estado em disco) e depois descongelá-los novamente.

Eu não testei isso extensivamente ainda, mas eles parecem ter uma boa documentação, então você pode achar isso útil. Note também que para usar o CRIU você pode ter que habilitar vários recursos de kernel que provavelmente não estão habilitados na maioria das distribuições de estoque ( CONFIG_CHECKPOINT_RESTORE e CONFIG_MEM_SOFT_DIRTY ), então é bom você precisar compilar seu próprio kernel para obter correndo.

Nota: Se o seu programa falhar por um motivo , o congelamento prévio provavelmente não é o caminho a seguir, pois provavelmente o seu programa voltará a funcionar nas mesmas condições ( no caso de não haver motivo externo, como disco cheio ou memória).

    
por 18.04.2014 / 12:26