Est-il possible d '«hiberner» un processus sous Linux? Tout comme «hibernate» 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 en RAM et je peux continuer mon processus?
linux
linux-kernel
hap497
la source
la source
Réponses:
J'avais l'habitude de maintenir CryoPID , qui est un programme qui fait exactement ce dont vous parlez. Il écrit le contenu de l'espace d'adressage d'un programme, du VDSO, des références de descripteur de fichier et des états dans un fichier qui peut être reconstruit ultérieurement. CryoPID a démarré lorsqu'il n'y avait pas de hooks utilisables sous Linux lui-même et fonctionnait entièrement à partir de l'espace utilisateur (en fait, cela fonctionne toujours, en fonction de vos paramètres de distribution / noyau / sécurité).
Les problèmes étaient (en effet) les sockets, les signaux RT en attente, de nombreux problèmes X11, l'implémentation de la mise en cache de la glibc getpid () parmi beaucoup d'autres. La randomisation (en particulier le VDSO) s'est avérée insurmontable pour le petit nombre d'entre nous qui y travaillons après que Bernard s'en soit éloigné. Cependant, c'était amusant et est devenu le sujet de plusieurs thèses de maîtrise.
Si vous envisagez simplement un programme qui peut sauvegarder son état de fonctionnement et redémarrer directement dans cet état, il est loin ... beaucoup plus facile de simplement sauvegarder ces informations depuis le programme lui-même, peut-être lors de la maintenance d'un signal.
la source
Je voudrais mettre une mise à jour de statut ici, à partir de 2014.
La réponse acceptée suggère CryoPID en tant qu'outil pour effectuer Checkpoint / Restore, mais j'ai trouvé que le projet était inimaginable et impossible à compiler avec les noyaux récents. Maintenant, j'ai trouvé deux projets activement maintenus fournissant la fonction de point de contrôle d'application.
Le premier, celui que je suggère parce que j'ai plus de chance de l'exécuter, est CRIU qui effectue le point de contrôle / restauration principalement dans l'espace utilisateur, et nécessite l'activation de l'option de noyau CONFIG_CHECKPOINT_RESTORE pour fonctionner.
Ce dernier est le DMTCP ; citant leur page principale:
Il y a aussi une belle page Wikipedia sur l'argument: Application_checkpointing
la source
Les réponses évoquées
ctrl-z
parlent vraiment d'arrêter le processus avec un signal, dans ce casSIGTSTP
. Vous pouvez émettre un signal d'arrêt aveckill
:Cela suspendra l'exécution du processus. Il ne libérera pas immédiatement la mémoire utilisée par celui-ci, mais comme la mémoire est requise pour d'autres processus, la mémoire utilisée par le processus arrêté sera progressivement remplacée.
Lorsque vous souhaitez le réveiller, utilisez
Les solutions les 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.
la source
Le problème est de restaurer les flux - fichiers et sockets - que le programme a ouverts.
Lorsque tout 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 des erreurs et ainsi de suite et survit aux conditions d'erreur (ou devrait le faire).
Si vous avez mis en veille prolongée par programme (sans prise en charge des applications), comment géreriez-vous les fichiers ouverts? Que faire 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 échanger sur le disque aurait à peu près le même effet?
Ou exécutez le programme dans une machine virtuelle et laissez la machine virtuelle gérer la suspension.
la source
Linux Kernel a maintenant partiellement implémenté les futures checkpoint / restart: https://ckpt.wiki.kernel.org/ , le statut est ici .
Quelques informations utiles se trouvent dans le lwn (linux hebdomadaire net): http://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......
Donc, la réponse est oui"
la source
La réponse courte est "oui, mais pas toujours de manière fiable". Découvrez CryoPID:
http://cryopid.berlios.de/
Les fichiers ouverts seront en effet le problème le plus courant. CryoPID déclare explicitement:
Les mêmes problèmes affecteront également les connexions TCP, bien que CryoPID prenne en charge tcpcp pour la reprise de la connexion.
la source
La reponse courte est oui." Vous pouvez commencer par regarder ceci pour quelques idées: reconstruction de l'exécutable ELF à partir d'une image principale ( http://vx.netlux.org/lib/vsc03.html )
la source
J'ai étendu Cryopid en produisant un package appelé Cryopid2 disponible auprès de SourceForge. Cela peut aussi bien migrer un processus que le mettre en veille prolongée (avec tous les fichiers et sockets ouverts - les données dans les sockets / tuyaux sont aspirées dans le processus en veille prolongée et crachées dans ces derniers 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 - à la fois cela (et / ou le cryopid original) a besoin de quelqu'un à bord qui puisse les faire fonctionner avec les derniers noyaux (par exemple Linux 3.x) .
La méthode Cryopid fonctionne - et est probablement la meilleure solution pour l'hibernation / migration de processus à usage général sous Linux que j'ai rencontrée.
la source
Comme d'autres l'ont noté, il est difficile pour le système d'exploitation de fournir cette fonctionnalité, car l'application doit avoir une vérification d'erreurs intégrée pour gérer les flux interrompus.
Cependant, en passant, certains langages de programmation et outils qui utilisent des machines virtuelles prennent explicitement en charge cette fonctionnalité, comme le langage d'auto-programmation .
la source
Ctrl-Z augmente les chances que les pages du processus soient permutées, mais cela ne libère pas complètement les ressources du processus. Le problème avec la libération complète des ressources d'un processus est que des éléments tels que les descripteurs de fichiers, les sockets sont des ressources du noyau que le processus utilise, mais ne sait pas comment persister tout seul. Donc, Ctrl-Z est aussi bon que possible.
la source
Il y a eu des recherches sur les points de contrôle / restauration pour Linux dans les jours 2.2 et 2.4, mais cela 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 vous pouvez écrire un module noyau pour le faire, c'est possible. Mais pour la valeur commune du possible (puis-je le faire à partir du shell sur une distribution Linux commerciale), ce n'est pas encore possible.
la source
C'est en quelque sorte le but ultime du système d'exploitation en cluster. Mathew Dillon met beaucoup d'efforts pour implémenter quelque chose comme ça dans son projet Dragonfly BSD .
la source
ajouter une autre solution de contournement: vous pouvez utiliser virtualbox. exécutez vos applications dans une machine virtuelle normale et "enregistrez simplement l'état de la machine" quand vous le souhaitez. Je sais que ce n'est pas une réponse, mais j'ai pensé que cela pourrait être utile lorsqu'il n'y a pas de vraies options.
si pour une raison quelconque vous n'aimez pas virtualbox, vmware et Qemu sont aussi bons.
la source
Il y a
ctrl+z
sous Linux, mais je ne suis pas sûr qu'il offre les fonctionnalités que vous avez spécifiées. Je soupçonne que vous avez posé cette question car ce n'est pas le casla source