Как сохранить ход программы и возобновить ее позже?

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

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


person wakandan    schedule 06.12.2009    source источник


Ответы (4)


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

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

person Toji    schedule 06.12.2009
comment
Вау, это очень информативно. Я очень внимательно посмотрю на это. Большое спасибо. :D - person wakandan; 06.12.2009

Используйте Постоянство.

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

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

person Tebo    schedule 06.12.2009
comment
Мне понадобится куча времени, чтобы понять, что вы здесь говорите: D. Большое спасибо. Сейчас буду копать. - person wakandan; 06.12.2009
comment
Меня поймали на программировании, и я забыл, что должен был прикрепить ссылку. Извини за это. - person Tebo; 06.12.2009

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

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

person Jean Barmash    schedule 06.12.2009

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

person robbie fan    schedule 08.06.2015