Можно ли вызвать многопоточность гибернации (дамп ядра?)? - PullRequest
2 голосов
/ 25 июля 2011

У меня есть программное обеспечение (c ++), которое запускает несколько процессов (каждый процесс сам является основной системой).

Процессы взаимодействуют друг с другом через xml-rpc или boost asio

Я хочу иметь возможность заморозить или остановить все процессы в данный момент и иметь возможность поднять систему (все процессы) позже до того же состояния, что и до перехода в режим гибернации.

Как я могу это сделать в c ++?

Возможно ли это из-за того, что процессы взаимодействуют друг с другом?

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

Общая картина заключается в том, что вам необходимо привести систему в стабильное согласованное состояние, а затем сохранить это состояние в некоторой воссоздаваемой форме.

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

  • Как процессы соглашаются, что они находятся в согласованном состоянии.Возможно, вам потребуется определить некоторые новые сообщения «Приготовьтесь к гибернации» и «Я готов».
  • Для каждого процесса вам необходимо выяснить, как сохранить его и восстановить его состояние.В зависимости от сложности любых живых структур данных это может быть довольно сложно.С другой стороны, если ваши процессы не имеют состояния, тогда это может быть очень просто.
  • Вам нужно будет разработать схему управления наборами данных в спящем режиме, чтобы определить согласованный набор для всех процессов.

Я считаю это значительным усилием по кодированию, степень сложности будет зависеть от сложности вашего приложения и качества его реализации.В хорошо структурированном приложении такие основные упражнения «повторения» часто оказываются удивительно простыми.

0 голосов
/ 25 июля 2011

Ну

остальные ответы в порядке. Есть другой довольно «экзотический» способ, который может решить эту проблему быстро, но он может быть излишним или не подходящим. Но кто знает? Так на всякий случай ...

Я предлагаю запустить вашу программу на виртуальной машине (я имею в виду, например, linux с vmware) и приостановить / разбудить эту виртуальную машину по желанию.

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

Удачи.

0 голосов
/ 25 июля 2011

Если вы не ОС - нет, это будет невозможно.

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

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

...