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

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

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

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


person Jeroen Dirks    schedule 10.10.2008    source источник
comment
При чем тут C / C ++?   -  person camh    schedule 11.10.2008
comment
Согласитесь с camh, не могли бы вы удалить ссылку C / C ++. У вас может быть процесс, код которого полностью asm, и вопрос действителен.   -  person Dan Cristoloveanu    schedule 11.10.2008


Ответы (9)


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

person ephemient    schedule 10.10.2008

это называется миграцией процессов.

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

person Javier    schedule 10.10.2008

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

person Pat Notz    schedule 10.10.2008

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

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

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

person moonshadow    schedule 10.10.2008

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

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

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

person Nobilis    schedule 16.02.2017

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

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

Тут же и другие ответы о виртуализации.

person Chris Jester-Young    schedule 10.10.2008

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

person Paul Nathan    schedule 10.10.2008

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

person Mark Kegel    schedule 10.10.2008

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

person Avdi    schedule 10.10.2008