Как сохранить прогресс программы и продолжить позже? - PullRequest
5 голосов
/ 06 декабря 2009

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

[Редактировать] Я пишу программу, основанную в основном на рекурсивных функциях. Насколько я знаю, я думаю, что невероятно трудно сохранить такие состояния в моей программе. Есть ли какая-либо техника, каким-то образом сохраняющая содержимое стека, вызовы функций и данные, связанные с моей программой, и затем, когда она перезапускается, она может работать так, как если бы она не была остановлена? Это всего лишь некоторые концепции, которые у меня возникли, поэтому, пожалуйста, прости меня, если это не имеет смысла ...

Ответы [ 4 ]

2 голосов
/ 06 декабря 2009

Использование Постоянство .

Постоянство - это механизм, посредством которого срок службы объекта превышает время выполнения программ.

Сохранить состояние объектов, участвующих в процессе, на локальном жестком диске, используя serialization .

2 голосов
/ 06 декабря 2009

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

Другой распространенный метод - сохранить изображение всего состояния программы. Если вы когда-либо играли с эмулятором игровой приставки с возможностью сохранения состояния, это то, как они это делают. Подобная техника существует в Python с травлением. Если среда достаточно стабильна (т. Е. Нет указателей), вы просто копируете все состояние памяти приложений в двоичный файл. Когда вы хотите возобновить, вы копируете его обратно в память и снова запускаете. Это дает вам практически идеальное восстановление состояния, но то, насколько это вообще возможно, зависит от среды / языка. (Например: большинство приложений C ++ не могли бы сделать это без помощи операционной системы или если они были ОЧЕНЬ тщательно сконструированы с учетом этого.)

1 голос
/ 06 декабря 2009

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

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

0 голосов
/ 08 июня 2015

Для linux существует проект с именем CRIU, который поддерживает сохранение и возобновление на уровне процесса. Это похоже на спящий режим и возобновление работы ОС, но детализация разбита на процессы. Он также поддерживает контейнерные технологии, в частности Docker. См. http://criu.org/ для получения дополнительной информации.

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