Comment "hiberner" un processus sous Linux en stockant sa mémoire sur le disque et en le restaurant plus tard?



Answers

Les réponses mentionnant ctrl-z parlent vraiment d'arrêter le processus avec un signal, dans ce cas SIGTSTP . Vous pouvez émettre un signal d'arrêt avec kill :

kill -STOP <pid>

Cela va suspendre l'exécution du processus. Il ne libérera pas immédiatement la mémoire utilisée par lui, mais comme la mémoire est requise pour d'autres processus, la mémoire utilisée par le processus arrêté sera progressivement permise.

Lorsque vous voulez le réveiller, utilisez

kill -CONT <pid>

Les solutions plus compliquées, comme CryoPID, ne sont vraiment nécessaires que si vous voulez que le processus arrêté puisse survivre à un arrêt / redémarrage du système - il ne semble pas que vous en ayez besoin.

Question

Est-il possible d'hiberner un processus sous linux? Tout comme "hiberner" dans un ordinateur portable, je voudrais écrire toute la mémoire utilisée par un processus sur le disque, libérer de la RAM. Et puis plus tard, je peux «reprendre le processus», c'est-à-dire lire toutes les données de la mémoire et les remettre dans la RAM et continuer mon processus?




Il y a eu quelques recherches sur checkpoint / restore pour Linux en 2.2 et 2.4 jours, mais ça n'a jamais dépassé le prototype. Il est possible (avec les mises en garde décrites dans les autres réponses) pour certaines valeurs de possible - je peux écrire un module noyau pour le faire, c'est possible. Mais pour la valeur commune de possible (je peux le faire depuis le shell sur une distribution Linux commerciale), ce n'est pas encore possible.




Il y a ctrl+z dans linux, mais je ne suis pas sûr qu'il offre les fonctionnalités que vous avez spécifiées. Je suppose que vous avez posé cette question, car elle ne le fait pas







Le problème consiste à restaurer les flux (fichiers et sockets) que le programme a ouverts.

Lorsque l'ensemble de votre système d'exploitation hiberne, les fichiers locaux et autres peuvent évidemment être restaurés. Les connexions réseau ne le font pas, mais le code qui accède à Internet est généralement plus de vérification d'erreurs et ainsi de suite et survit aux conditions d'erreur (ou devrait).

Si vous faisiez un hibernation par programme (sans support d'application), comment géreriez-vous les fichiers ouverts? Que se passe-t-il si un autre processus accède à ces fichiers entre-temps? etc?

Maintenir l'état lorsque le programme n'est pas chargé va être difficile.

Le simple fait de suspendre les threads et de les laisser passer sur le disque aurait plus ou moins le même effet?

Ou exécutez le programme dans une machine virtuelle et laissez la VM gérer la suspension.




J'ai étendu Cryopid en produisant un paquet appelé Cryopid2 disponible auprès de SourceForge. Cela peut migrer un processus et l'hiberner (avec tous les fichiers et sockets ouverts - les données des sockets / pipes sont aspirées dans le processus en hibernation et recrachées dans celles-ci lorsque le processus est redémarré).

La raison pour laquelle je n'ai pas été actif avec ce projet est que je ne suis pas un développeur de noyau - les deux (et / ou le cryopid original) ont besoin de quelqu'un qui puisse les faire fonctionner avec les derniers noyaux (par exemple Linux 3.x) .

La méthode Cryopid fonctionne - et c'est probablement la meilleure solution pour l'hibernation / migration des processus généraux dans Linux que j'ai rencontré.




Links