Une façon de sauvegarder l'état de fonctionnement d'un programme

J'ai un programme qui va effectuer un long calcul qui peut prendre plusieurs jours pour être complété.

Existe-t-il un moyen de sauvegarder l'état de fonctionnement du programme? afin que je puisse éteindre l'ordinateur et exécuter le programme à partir d'un état enregistré. Ou si le programme s'est écrasé pour une raison quelconque, je peux le redémarrer à partir d'un état sauvegardé (et non pas du début)?

Faire des instantanés réitérables d'un process est très difficile, car un process peut avoir toutes sortes d'interactions avec le système de files. En règle générale, ne vous attendez pas à ce que les systèmes unix prennent en charge cela. Il y a eu des variantes unix avec des sauvegardes de base réinitialisables, mais je ne pense pas que ce soit le cas sur les versions modernes (elles sont devenues trop complexes).

Les systèmes Lisp ont généralement une command de vidage qui crée une image réinitialisable. Vous pouvez donc écrire votre programme dans un dialecte Lisp qui prend en charge le dumping .

Vous pouvez exécuter votre code sur une machine virtuelle et utiliser le gestionnaire de machine virtuelle (par exemple VirtualBox) pour créer des instantanés périodiques. En fonction de votre programme, cela peut nuire aux performances.

La meilleure solution est probablement pour vous de build une fonction de capture instantanée dans votre programme. Pour les programmes purement computationnels, cela n'est souvent que modérément difficile. Dans un programme de calcul multithread, les points de snapshot sont généralement des points de synchronisation globaux, où tous les threads communiquent. Essayez de structurer votre programme en un set de tâches et de faire du point d'input un répartiteur qui démarre une tâche chaque fois qu'un processeur est libre. Dès réception d'un signal, le répartiteur attend que toutes les tâches en cours se terminent, enregistre les états du programme et recommence l'envoi des tâches.

Je suggère d'hibernate au lieu d'éteindre votre ordinateur, mais si vous ne pouvez vraiment pas éviter cela, il existe un système de capture instantanée / restauration appelé CRIU (Checkpoint / Restore in Userspace), qui pourrait répondre à vos besoins. Avec ce framework, vous pouvez facilement «figer» vos process (en sauvegardant leur état sur le disque) et les dégivrer ultérieurement.

Je n'ai pas encore beaucoup testé cela, mais ils semblent avoir une assez bonne documentation, donc vous pourriez find cela utile. Notez également que pour utiliser CRIU, vous devrez peut-être activer plusieurs fonctionnalités du kernel qui ne sont probablement pas activées sur la plupart des dissortingbutions de stock ( CONFIG_CHECKPOINT_RESTORE et CONFIG_MEM_SOFT_DIRTY ). Vous aurez donc besoin de comstackr votre propre kernel pour le faire fonctionner.

Remarque: Si votre programme se bloque pour une raison quelconque, il est probable que votre programme ne fonctionnera plus dans les mêmes conditions (au cas où il n'y aurait pas de raison externe comme le disque ou la memory).