나는 실행중인 프로그램의 상태를 디스크에 저장하고 다시 가져 오는 기본 원칙을 열심히 찾고있다. 현재 가지고있는 디자인에서 각 객체 (함수 포인터 목록, 저수준 집에서 만든 객체 지향의 C 레벨 객체, 그리고 이런 식으로하는 좋은 이유가 있습니다)은 명시 적 상태를 쓰기 및 복원 가능한 형식으로 내보내는 데 호출됩니다. 이 작업을 수행하는 핵심 속성은 객체와 관련된 모든 상태가 실제로 객체 데이터 구조에 캡슐화되어 있다는 것입니다.개체의 직렬화 : 스레드 상태가 관련 될 수는 없습니다. 맞습니까?
일부 개체에 사용자 수준 스레드가 연결된 활성 개체로 작업하는 다른 솔루션이 있습니다. 따라서 프로그램 카운터, 레지스터 내용 및 스택 내용이 갑자기 프로그램 상태가됩니다. 내가 볼 수있는 한, 임의의 시점에 디스크에 이러한 일을 직렬화하는 좋은 방법은 없습니다. 스레드는 프로그램 카운터 등으로 표현되는 것이없는 특별한 상태로 스스로 가야하므로 기본적으로 실행 상태 시스템 상태를 명시 적 객체 상태로 "저장"합니다.
필자는 일련의 직렬화 라이브러리를 살펴 보았으며 이것이 보편적 인 속성이라고 말할 수있는 한 알 수 있습니다.
핵심 질문은 다음과 같습니다. 아니면 실제로 그렇지 않은가요? 스레드 코드를 스레드에서 실행하는 측면에서 스레드 상태를 포함 할 수있는 저장/복원 솔루션이 있습니까?가상 시스템에 전체 시스템 상태를 저장해도 실제로는 상태를 직렬화하는 것이 아니라 컴퓨터를 정지하고 옮기는 것입니다. 그것은 분명한 해결책이지만, 대부분의 경우 약간 중량이 있습니다.
몇 가지 질문을 통해 나는 우리가 어떻게 일하는가에 대한 아이디어를 설명 할만큼 명확하지 않다는 것을 분명히했습니다. 우리는 내부에서 실행되는 코드에 대한 매우 엄격한 규칙을 사용하여 시뮬레이터 시스템을 작성하고 있습니다. 특히 객체 생성과 객체 상태를 완전히 나눕니다. 인터페이스 함수 포인터는 시스템을 설정할 때마다 다시 작성되며 상태의 일부가 아닙니다. 상태는 내부 런타임 표현과 저장 표현 사이를 변환하는 정의 된 get/set 함수가있는 특정 임명 된 "속성"으로 만 구성됩니다. 오브젝트 간의 포인터의 경우, 모두 이름으로 변환됩니다. 그래서 우리의 디자인, 개체가 저장 장치에 다음과 같이 나와 있습니다
Object foo {
value1: 0xff00ff00;
value2: 0x00ffeedd;
next_guy_in_chain: bar;
}
Object bar {
next_guy_in_chain: null;
}
연결리스트 시뮬레이션 구조에서 정말 존재 결코, 각 개체는 어떤 종류의 하드웨어 장치를 나타냅니다.
문제는 일부 사람들이이를 원하지만 동작을 코드화하는 방법으로 스레드가 있다는 것입니다. 여기서의 "행동"은 실제로 시뮬레이션 단위의 상태를 돌연변이시킨 것입니다. 기본적으로, 우리가 말한 디자인은 이러한 모든 변경 사항은 불려지는 작업을 수행하고 반환하는 원자 적 완성 작업에서 이루어져야한다고 말합니다. 모든 상태는 객체에 저장됩니다. 반응 모델이 있거나 "실행 완료"또는 "이벤트 구동"이라고 부를 수 있습니다.
이것에 대한 다른 생각은 객체에 활성 스레드가 작동하도록하는 것입니다.이 스레드는 고전적인 유닉스 스레드와 같은 방식으로 영원한 루프에 앉아 종료하지 않습니다. 이것은 디스크에 합리적으로 저장할 수 있는지를 확인하려는 경우이지만, VM을 중간에 끼우지 않고 실행 가능한 것처럼 보이지는 않습니다.
2009 년 10 월 업데이트 :이 문서는 2009 년 FDL 회의에서 게시되었으며 체크 포인트 및 SystemC에 대해서는 this paper을 참조하십시오.
글쎄, 여기 스레드는 SystemC라고하는 것, 즉 quickthreads 또는 Windows 섬유를 사용하는 기본적으로 협력적인 비 선점적인 스레딩입니다. 단일 OS 스레드. – jakobengblom2