Можете ли вы заморозить процесс C / C++ и продолжить его на другом хосте?
Мне было интересно, можно ли создать файл "core", скопировать его на другую машину, а затем продолжить выполнение файла ядра на этой машине?
Я видел утилиту gcore, которая сделает основной файл из запущенного процесса. Но я не думаю, что gdb может продолжить выполнение на основе основного файла.
есть ли способ просто сбросить кучу / стек и восстановить их позже?
9 ответов
на современных системах, а не из основного файла, нет, вы не можете. Для замораживания и восстановления отдельного процесса в Linux,CryoPID и новая контрольная точка на основе ядра и перезагрузка находятся в работах, но их возможности в настоящее время довольно ограничены. OpenVZ и другие виртуализаци-как програмное обеспечение могут замерзнуть и восстановить всю систему.
Это называется процесс переноса.
mosix и OpenMosix раньше это было возможно. в настоящее время проще всего перенести всю виртуальную машину.
этого, как правило, недостаточно, чтобы произвольный процесс продолжался на другой машине. В дополнение к состоянию кучи и стека также могут открываться дескрипторы ввода-вывода, выделенные аппаратные ресурсы и т. д. так далее.
вы можете либо явно написать свое программное обеспечение таким образом, чтобы оно сбрасывало состояние по сигналу и позже возобновлялось из сброшенного состояния, либо запустить программное обеспечение на виртуальной машине и перенести его на альтернативный хост-Xen и Vmware оба поддерживают замораживание / восстановление, а также живая миграция.
Что сказал:CryoPID пытается сделать именно это, и иногда успешно.
в некоторых случаях это можно сделать. Например, частью процесса сборки Emacs является загрузка всех библиотек Lisp, а затем сброс образа памяти на диск для быстрой загрузки. Некоторые другие переводчики языка делают это тоже (я думаю о реализации Lisp и схемы, в основном). Тем не менее, они специально разработаны для такого рода использования, поэтому я не знаю, какие специальные вещи они должны делать, чтобы позволить этому работать.
Я думаю, что это будет очень трудно сделать для произвольной программы, но если вы написали фреймворк, где все объекты поддерживали сериализацию / десериализацию, вы можете сериализовать все объекты, используемые вашей программой, а затем отправить их в другое место и десериализовать их на другом конце.
ответы других людей о виртуализации тоже на месте.
от февраля. 2017, есть довольно стабильный и зрелый инструмент, называемый CRIU Это зависит от обновления ядра Linux в версии 3.11 (как это было сделано в сентябре. 2013, большинство современных дистрибутивов должны иметь те, которые включены в их версии ядра).
его можно установить через aptitude просто вызывая sudo apt-get install criu
.
зависит от машины. Это очень выполнимо в очень маленькой встроенной системе, например. Я думаю, что это также несколько реализованных в Beowulf кластеры и другие supercomputeresque приложений.
есть много причин, по которым вы не можете сделать то, что вы хотите очень легко. Например, при восстановлении основного файла на другой машине как разрешить файловые дескрипторы, которые были открыты при обработке? Как насчет сокетов, именованных каналов, семафоров или любого другого ресурса уровня ОС? В принципе, если ваша система специально разработана для обработки такой операции нельзя наивно дамп файл и переместить его на другую машину.
Я не верю, что это возможно. Тем не менее, вы можете посмотреть в программное обеспечение виртуализации - например Xen - которые позволяют заморозить и перенести всю систему одной машины на другую.