Можете ли вы заморозить процесс C/С++ и продолжить его на другом хосте?

Мне было интересно, можно ли создать "основной" файл, скопировать на другой компьютер и продолжить выполнение основного файла на этом компьютере?

Я видел утилиту gcore, которая сделает основной файл из запущенного процесса. Но я не думаю, что gdb может продолжить выполнение на основе основного файла.

Есть ли способ просто сбросить кучу/стек и восстановить их позже?

Ответ 1

В современных системах, а не из основного файла, вы не можете. Для замораживания и восстановления отдельного процесса в Linux CryoPID и нового Контрольная точка на основе ядра и перезагрузка находятся в работе, но их способности в настоящее время весьма ограничены. OpenVZ, а другое программное обеспечение, подобное виртуализации, может заморозить и восстановить всю систему.

Ответ 2

он вызвал процесс миграции.

mosix и OpenMosix имел обыкновение делать это. в настоящее время проще всего перенести целую ВМ.

Ответ 3

Также выйдите из проекта Condor. Кондор может это сделать и с параллельными работами. Condor также включает мониторы, которые могут автоматически переносить ваш процесс, когда некоторые, например, снова начинают использовать свою рабочую станцию. Он действительно предназначен для использования запасных циклов в сетевых средах.

Ответ 4

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

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

Тем не менее, CryoPID пытается сделать именно это и иногда преуспевает.

Ответ 5

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

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

Другие люди говорят о виртуализации тоже на месте.

Ответ 6

По состоянию на февраль 2017 года существует довольно стабильный и зрелый инструмент, называемый CRIU, который зависит от обновлений ядра Linux, сделанного в версии 3.11 (как это было сделано в сентябре 2013 года, большинство современных дистрибутивов должны иметь те, которые включены в их версии ядра).

Его можно установить с помощью aptitude, просто позвонив sudo apt-get install criu.

Инструкции по его использованию

Ответ 7

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

Ответ 8

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

Ответ 9

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