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.