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

Я согласен с @Nelson, что унаследовать от float неловко, но, возможно, решение, касающееся функции __repr__, может быть прощено. Я закончил использование пакета decimal для этого, чтобы переформатировать поплавки, когда это необходимо. Поверхность заключается в том, что это работает во всех контекстах, где вызывается repr(), а также, когда просто печатает списки в stdout, например. Кроме того, точность конфигурируется во время выполнения после создания данных. Недостатком, конечно же, является то, что ваши данные должны быть преобразованы в этот специальный класс float (так как, к сожалению, вы не можете увидеть патч обезьяны float.__repr__). Для этого я предоставляю краткую функцию преобразования.

Код:

import decimal
C = decimal.getcontext()

class decimal_formatted_float(float):
   def __repr__(self):
       s = str(C.create_decimal_from_float(self))
       if '.' in s: s = s.rstrip('0')
       return s

def convert_to_dff(elem):
    try:
        return elem.__class__(map(convert_to_dff, elem))
    except:
        if isinstance(elem, float):
            return decimal_formatted_float(elem)
        else:
            return elem

Пример использования:

>>> import json
>>> li = [(1.2345,),(7.890123,4.567,890,890.)]
>>>
>>> decimal.getcontext().prec = 15
>>> dff_li = convert_to_dff(li)
>>> dff_li
[(1.2345,), (7.890123, 4.567, 890, 890)]
>>> json.dumps(dff_li)
'[[1.2345], [7.890123, 4.567, 890, 890]]'
>>>
>>> decimal.getcontext().prec = 3
>>> dff_li = convert_to_dff(li)
>>> dff_li
[(1.23,), (7.89, 4.57, 890, 890)]
>>> json.dumps(dff_li)
'[[1.23], [7.89, 4.57, 890, 890]]'
11
задан Chris Jester-Young 10 October 2008 в 23:46
поделиться

8 ответов

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

4
ответ дан 3 December 2019 в 08:06
поделиться

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

3
ответ дан 3 December 2019 в 08:06
поделиться

это назвало миграцию процесса.

mosix и OpenMosix раньше могли сделать это. в наше время является самым легким переместить целый VM.

5
ответ дан 3 December 2019 в 08:06
поделиться

Это, в целом, не будет достаточно, чтобы позволить произвольному процессу продолжить другую машину. В дополнение к "куче" и состоянию стека, там может также также открыть дескрипторы I/O, выделенные аппаратные ресурсы, и т.д. и т.д.

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

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

2
ответ дан 3 December 2019 в 08:06
поделиться

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

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

Ответы других людей о виртуализации на месте, также.

1
ответ дан 3 December 2019 в 08:06
поделиться

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

0
ответ дан 3 December 2019 в 08:06
поделиться

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

0
ответ дан 3 December 2019 в 08:06
поделиться

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

-1
ответ дан 3 December 2019 в 08:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: