Сохранить память процесса для дальнейшего использования? - PullRequest
26 голосов
/ 03 апреля 2009

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

Редактировать Я читал об этом:

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

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

Ответы [ 8 ]

21 голосов
/ 03 апреля 2009

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

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

7 голосов
/ 03 апреля 2009

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

4 голосов
/ 03 апреля 2009

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

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

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

2 голосов
/ 03 апреля 2009

Ну, у java есть сериализация, и она где-то рядом. Хотя вы не можете сделать это на самом низком уровне, например, адрес процессора в памяти и т. Д., Поскольку для этого потребуется, чтобы ОС находилась в том же состоянии, в каком вы находились, когда вы «приостановили» процесс.

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

1 голос
/ 21 сентября 2012

Цитата из " Сохранение (спящий режим!) Состояния процесса на диске для загрузки Quiker " (sic):

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

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

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

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

1 голос
/ 03 апреля 2009

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

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

0 голосов
/ 03 апреля 2009

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

0 голосов
/ 03 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...