2014-09-26 2 views
2

бегаю следующий GNU Smalltalk скрипт:Сохранение потоков в Smalltalk образа виртуальной машины

stdout << 'Before'; nl. 
ObjectMemory snapshot: 'image.im'. 
stdout << 'After'; nl. 

Он производит этот выход, как и ожидалось, и выписывает новое изображение:

Before 
After 

Теперь я перезагружать изображение:

$ gst -I image.im 

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

Очевидно, что изображение не сохраняет состояние потока, на котором запущен скрипт, или же поток не воссоздается при загрузке изображения. Я думал, что изображения Smalltalk должны содержать моментальный снимок всего состояния системы; так почему это происходит? (И есть ли способ, которым я могу это сделать? Я хочу использовать это поведение.)

ответ

0

При остановке и перезапуске изображения небольшого изображения вы сталкиваетесь с границами того, насколько можно сохранить иллюзию всего объекта , Невозможно возобновить соединение с базой данных, сокеты, файлы и т. Д. Изображение может быть снова открыто на другой машине, в другой сети и спустя годы. Различные мелкие проблемы делают несколько разные варианты решения этих проблем. При запуске Seaside на Pharo соединение с сервером, прослушивающее новые подключения, перезапускается, сами сеансы Seaside очищаются.

+1

Ну, да, но разные темы - потоки Smalltalk - это реалистичные реализации зеленых потоков и полностью реализованы в виртуальной машине. Вы _can_ сохраняете поток на изображении и восстанавливаете его (я пробовал). Я хочу знать, почему поток, обрабатывающий скрипт, не сохраняется. –

+0

Возможно ли, что поток существует, но не может быть подключен к stdout? Возможно, REPL уже владеет этим сокетом. – dcorking

+0

Проблема не в потоке. ObjectMemory и stdout оба не могут полностью поддерживать иллюзию объекта. –

Смежные вопросы