Подтвердить что ты не робот

Сохранить память процесса для последующего использования?

Можно ли приостановить процесс, сохранить содержимое памяти в файл и затем перезагрузить файл, чтобы продолжить программу?

Edit Я читал об этом:

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

Можно ли выгрузить содержимое структуры и каким-то образом заставить malloc распределять те же области памяти?

4b9b3361

Ответ 1

Технически это возможно, но для этого потребуется сохранить все системные ресурсы ресурсов - например, дескрипторы файлов, а затем восстановить их. Так что это сложная задача.

Самый простой способ добиться того, что вы хотите, - использовать виртуальную машину, такую ​​как VMWare. Когда вы приостанавливаете его, вы фактически сохраняете все состояние машины вместе со всеми запущенными программами.

Ответ 2

Обычно это называется постоянным продолжением. Некоторые языки, такие как SmallTalk и SBCL, имеют поддержку первого класса для постоянных продолжений. Большинство языков нет.

Ответ 3

В зависимости от ваших требований и ОС вы можете попробовать форсировать core dump

Я никогда не пытался загружать резервную копию ядра, отличную от gdb. Кажется, что любые файлы, которые вы открыли, или любое другое состояние, которое не находится в вашей памяти программ, будет потеряно, как указано в sharptooth.

Другим подходом будет просто сериализация состояния, которое вам нужно на диске в вашей программе. Это отстой, но это, наверное, самый надежный способ, если вы не довольны приостановкой выполнения программы. Это можно сделать с помощью библиотеки потоков вашей операционной системы. Или как один плакат указал с вашей оболочкой.

Ответ 4

Ну java имеет сериализацию, и она приходит где-то рядом с ней. Хотя вы не можете сделать это на самом низком уровне, таком как адрес памяти регистров CPU и т.д., Так как для этого потребуется, чтобы os находилось в том же состоянии, что и при приостановке процесса.

Это может быть хорошим проектом в качестве модуля ядра linux: -)

Ответ 5

Это беспорядочно с точки зрения невозможности иметь дело с внутренним кодом, как упоминается sharptooth.

Однако некоторые программы (например, iirc emacs) использовали "дамп моей собственной памяти" для сохранения конфигурации вместо того, чтобы иметь дело с конфигурационными файлами. Это не работает в Windows, хотя, поскольку исполняемые файлы запускаются в режиме совместного использования deny-write. Но это симпатичный (хотя и опасный) трюк в Linux или DOS:)

Ответ 6

Цитата из " Сохранять (hibernate!) состояние процесса на диск для загрузки quiker" (sic):

Q. Не могли бы вы подробнее объяснить, как эта смена работает, чтобы состояние процесса сохранялось на диске и повторно использовалось при необходимости? "

а. Это очень просто. Файл страницы - это особое место на диске, где неактивные процессы хранятся в высоко оптимизированном виде. Когда такие процесс возобновляется, система автоматически считывает его обратно память, и она просто продолжается с того места, где она была. Это похоже на то, как программы, запущенные на iPad:)

Все эти функции уже встроены в Windows. Пока процесс продолжает работать, система гарантирует, что он либо находится в памяти или в файле страницы (однако есть несколько исключений, которые вы может игнорировать).

Другими словами, Windows уже имеет возможность спящий процесс в файл страницы. @MSalters цитата из Raymond Chen " объяснение, почему его невозможно" просто неправильно.

Ответ 7

Workflow Foundation в .NET 3.0 и выше позволяет остановить и перезапустить рабочие процессы.

Ответ 8

Раймонд Чен объясняет, почему это невозможно. Очевидно, что не все инженеры Microsoft читают это, потому что компилятор Visual Studio делает это при предварительном компиляции заголовков. Он сбрасывает свое собственное состояние после компиляции заголовков в первый раз и восстанавливается, чтобы продолжить.