2009-04-03 24 views
21

Ist es möglich, einen Prozess anzuhalten, den Speicherinhalt in einer Datei zu speichern und die Datei später erneut zu laden, damit Sie das Programm fortsetzen können?Speichern Sie den Speicher eines Prozesses für die spätere Verwendung?

bearbeiten Ich habe über diese zu lesen:

http://en.wikipedia.org/wiki/Setcontext

Ist es möglich, den Inhalt der Struktur zu entleeren, und irgendwie malloc zwingen, die gleichen Speicherbereiche zuzuordnen?

+0

Cryopid darf es tun, ohne den Kernel unter Linux zu ändern. – user2284570

Antwort

16

Technisch ist es möglich, aber es würde erforderlich sein, alle vom System zugewiesenen Ressourcen zu speichern - wie zum Beispiel Dateideciptors und dann diese wiederherzustellen. Es ist also eine herausfordernde Aufgabe.

Der einfachste Weg zu erreichen, was Sie wollen, ist eine virtuelle Maschine wie VMWare zu verwenden. Wenn Sie es anhalten, speichern Sie den gesamten Maschinenzustand zusammen mit allen laufenden Programmen.

+0

Und VMWare stellt sicher, dass andere Ressourcen wie Netzwerkschnittstellen ordnungsgemäß neu gestartet werden. –

+0

Es ist nicht nur schwierig, aber im Allgemeinen unmöglich. Siehe http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg

+0

@GSerg, dieser Link setzt voraus, dass Ressourcen außerhalb des Prozesses freigegeben werden, wenn es sich im Ruhezustand befindet. Das muss nicht in einer Situation der Fall sein, in der der Prozess nur in einer Do-not-Run-Warteschlange gespeichert wird und der Adressraum auf die Festplatte gesendet wird, ohne die Exo-Prozess-Ressourcen aufzugeben. – paxdiablo

0

Workflow Foundation in .NET 3.0 und höher ermöglicht das Stoppen und Neustarten von Workflows.

2

Gut Java hat Serialisierung und es kommt irgendwo in der Nähe dazu. Obwohl Sie es nicht auf die niedrigste Ebene wie CPU-Speicheradresse usw. ausführen können, da dies erfordert, dass os in demselben Zustand ist, in dem Sie den Prozess "pausiert" haben.

auf den Punkt Das kann unmöglich zu sein :-)

1

Es ist chaotisch ein gutes Projekt als Linux-Kernel-Modul sein, wenn sie mit nativen Code zu tun, als Sharptooth erwähnt.

Allerdings haben einige Programme (zB Emacs) "dump my our memory" -Tricks verwendet, um die Konfiguration beizubehalten, anstatt mit Konfigurationsdateien zu arbeiten. Unter Windows funktioniert dies jedoch nicht, da ausführbare Dateien im Deny-Write-Share-Modus ausgeführt werden. Aber es ist ein niedlicher (wenn auch gefährlicher) Trick auf Linux oder DOS :)

6

Dies wird normalerweise persistent continuation genannt. Einige Sprachen wie SmallTalk und SBCL haben erstklassige Unterstützung für dauerhafte Fortsetzungen. Die meisten Sprachen nicht.

+0

Continuations strukturieren den Kontrollfluss innerhalb eines Programms, sie stoppen oder starten die Programmausführung nicht. – sth

+0

@sth Einige Smalltalk-Laufzeiten und SBCL unterstützen persistente Fortsetzungen, nicht nur die vorübergehenden, an die Sie denken. –

4

Je nach Bedarf und OS Sie könnten versuchen, zwingen ein core dump

Ich habe eigentlich nie versucht, einen Kern abgeladen Programm wieder auf andere als in GDB geladen. Es scheint, als ob irgendwelche Dateien, die Sie geöffnet haben, oder jeder andere Zustand, der nicht in Ihrem Programmspeicher ist, verloren gehen würde, wie scharf darauf hingewiesen wurde.

Ein anderer Ansatz wäre einfach serialisieren den Zustand, den Sie auf der Festplatte in Ihrem Programm benötigen. Es ist nervig, aber es ist wahrscheinlich der zuverlässigste Weg, es sei denn, Sie sind damit zufrieden, die Ausführung des Programms zu unterbrechen. Das könnte mit der Thread-Bibliothek Ihres Betriebssystems getan werden. Oder als ein Poster, das mit deiner Schale hervorgehoben wird.

0

Raymond Chen explains warum es unmöglich ist. Offensichtlich lesen nicht alle Microsoft-Ingenieure dies, weil der Visual Studio-Compiler dies tut, wenn Header vorkompiliert werden. Es gibt nach dem ersten Kompilieren der Header einen eigenen Zustand ab und stellt sich selbst wieder her.

+1

Herr Chen hat Recht und Unrecht. Es ist nur unmöglich, wenn die externen Prozessressourcen verschwinden. Das muss nicht passieren. Sie können einen Prozess vollständig stoppen, während Sie die Out-of-Process-Ressourcen erhalten - offensichtlich wird das einen Neustart nicht überstehen, aber das ist nicht notwendigerweise, was hier benötigt wird. – paxdiablo

+0

Die Fähigkeit, einen Prozess während einer CPU-intensiven Arbeit für eine Stunde zu stoppen, ist immer noch wertvoll. Dann starten Sie diesen Prozess einfach neu. SIGSTOP/SIGCONT tut dies bereits auf UNIX et al. – paxdiablo

+0

Eigentlich reicht es aus, die Priorität auf Leerlauf zu reduzieren. Kein Schaden in der Verwendung der letzten paar Prozent des letzten Kerns, viele parallele Algorithmen können keine volle Parallelität über die gesamte Operation aufrechterhalten - besonders bei Bäumen. – MSalters

1

Zitat aus "Persist (hibernate!) a process state to disk for quiker loading" (sic):

Q.Können Sie bitte mehr darüber erklären, wie dieser Austausch funktioniert, so dass der Prozesszustand auf dem Datenträger gespeichert und bei Bedarf wiederverwendet wird?

A. Es ist sehr einfach. Die Page-Datei ist ein spezieller Ort auf einer Festplatte, auf der inaktive Prozesse sind in hoch optimierten Art und Weise gespeichert werden. Wenn ein solcher Prozess läuft wieder aufgenommen wird, liest das System automatisch, es zu Speicher zurück und es geht weiter gerade aus, wo es war. es ist eine Art, wie Programme laufen auf dem iPad :)

All-Funktionalität ist bereits in Windows integriert.Während Ihr Prozess läuft weiter, stellt das System sicher, dass es entweder im Speicher oder im pa ist ge Datei (es gibt nur wenige Ausnahmen, die Sie ignorieren können).

Mit anderen Worten, Windows hat bereits die Möglichkeit, einen Prozess in die Auslagerungsdatei zu versetzen. @ MSalters Zitat von Raymond Chen "explaining why its impossible" ist einfach falsch.

+1

Beachten Sie, dass die Buchhaltung für einen ausgelagerten Prozess weiterhin im RAM (Kernel) vorhanden ist. Seine Fenstergriffe bleiben gültig; Sie können Nachrichten senden, die zum Zurücksenden usw. führen. Daher wird dies im Allgemeinen nicht als Prozess-Ruhezustand betrachtet. – MSalters

Verwandte Themen