2014-09-26 2 views
2

나는 다음과 같은 GNU 스몰 토크 스크립트를 실행저장 스레드

그것은 예상대로이 출력을 생성하고, 새로운 이미지 써
stdout << 'Before'; nl. 
ObjectMemory snapshot: 'image.im'. 
stdout << 'After'; nl. 

: 지금은 다시로드

Before 
After 

을 이미지 :

$ gst -I image.im 

내가 일이 보여야하는데 어떻게 일이다 단어 After이 인쇄되면 --- 원래 스크립트에 이미지가 저장된 지점부터 실행이 다시 시작됩니다. 무슨 실제로 일이 나는 단지 REPL을 얻을 것입니다.

분명히 이미지가 스크립트를 실행중인 스레드의 상태를 저장하지 않았거나 이미지가로드 될 때 스레드가 다시 생성되지 않습니다. 스몰 토크 이미지는 시스템의 전체 상태에 대한 스냅 샷을 포함하고 있다고 생각했습니다. 그렇다면 왜 이런 일이 일어나고 있습니까? (그리고이 작업을 할 수있는 방법이 있습니까?이 동작을 사용하고 싶습니다.)

답변

0

작은 토큰 이미지를 중지했다가 다시 시작하면 개체의 환상이 얼마나 멀리 유지 될 수 있는지 . 데이터베이스 연결, 소켓, 파일 등을 다시 열 수는 없습니다. 이 이미지는 다른 네트워크의 다른 컴퓨터에서 다시 열 수 있습니다. 다른 작은 토크는 이러한 문제를 다루는 방법에있어서 약간 다른 선택을합니다. Pharo에서 Seaside를 실행하면 새 연결을 수신하는 서버 연결이 다시 시작되고 Seaside 세션 자체가 플러시됩니다.

+1

음, 그렇지만 스레드가 다릅니다. --- 스몰 토크 스레드는 녹색 스레드 구현이며 전적으로 VM에서 구현됩니다. 이미지에서 스레드를 저장하고 복원 할 수 있습니다 (시도했습니다). 스크립트를 처리하는 스레드가 저장되지 않는 이유를 알고 싶습니다. –

+0

스레드가 있지만 stdout에 연결할 수 없습니까? 아마도 REPL은 이미 소켓을 소유하고있을 것입니다. – dcorking

+0

문제는 스레드가 아닙니다. ObjectMemory와 stdout 모두 객체 환상을 완벽하게 유지할 수 없습니다. –