2009-04-03 4 views
21

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

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

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

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

+0

cryopid разрешено делать это без изменения ядра на linux. – user2284570

ответ

16

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

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

+0

И VMWare гарантирует, что другие ресурсы, такие как сетевые интерфейсы, будут перезагружены должным образом. –

+0

Это не только вызов, но, в общем случае, невозможно. См. Http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg

+0

@GSerg, эта ссылка предполагает, что ресурсы вне процесса будут выпущены, когда он находится в спящем режиме. Этого не должно быть в ситуации, когда процесс просто спрятан в очереди без очереди, и это адресное пространство отправляется на диск, не отказываясь от ресурсов exo-process. – paxdiablo

0

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

2

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

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

1

Это грязно к точке бытия невозможно при работе с машинным кодом, а Sharptooth упоминает.

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

6

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

+0

Продолжение структуры потока управления внутри программы, они не останавливаются или не запускают выполнение программ. – sth

+0

@sth Некоторые временные интервалы Smalltalk и SBCL поддерживают постоянные продолжения, а не только переходные, о которых вы думаете. –

4

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

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

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

0

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

+1

Г-н Чен прав и не прав. Это невозможно, если ресурсы внешнего процесса исчезнут. Это не должно произойти. Вы можете полностью остановить процесс, сохранив ресурсы вне процесса - очевидно, что он не переживет перезагрузки, но это не обязательно то, что нужно здесь. – paxdiablo

+0

Возможность остановить процесс полностью в течение часа, когда вы выполняете некоторую интенсивную работу с ЦП, по-прежнему ценна. Затем вы просто перезапустите этот процесс. SIGSTOP/SIGCONT уже делает это в UNIX et al. – paxdiablo

+0

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

1

Цитата из "Persist (hibernate!) a process state to disk for quiker loading" (SIC):

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

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

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

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

+1

Обратите внимание, что бухгалтерия для выгружаемого процесса все еще существует в ОЗУ (ядре). Его оконные ручки остаются в силе; вы можете отправить ему сообщения, которые заставят его вернуться на страницу и т. д. Вот почему это обычно не считается спящим процессом. – MSalters

Смежные вопросы