2012-05-26 1 views
2

. NET 응용 프로그램을 일시 중지하고 다시 시작할 수있는 기능을 보았습니다. 특히 응용 프로그램을 일시 중지하고 상태를 저장할 수 있습니다. , 나중에 다시 시작하십시오.사용자 지정 CLR 호스트 - "일시 중지"/ "재시작"응용 프로그램

필자는 사용자 정의 CLR 호스트를 작성하여 제공되는 옵션을 살펴 보았습니다. 사용자 지정 호스트는 작업, 메모리 관리, 잠금 등에 대한 자체 구현을 제공 할 수 있습니다. 따라서 ICLRask를 통해 응용 프로그램을 일시 중지했다가 다시 시작할 수있는 사용자 지정 CLR 호스트를 만들 수있는 것처럼 보입니다. 제공된 인터페이스가 모든 작업을 일시 중지하고 전체 프로그램 상태를 디스크에 저장 한 다음 나중에 응용 프로그램을 다시 사용할 수있는 충분한 훅을 가지고 있는지 확신하지 못합니다. 누군가가 그것이 가능하지 않다는 것을 명확히 말해 줄 수 있습니까? 또한 응용 프로그램의 작은 하위 집합에 대해서만 가능하다면 걱정하지 않아도됩니다. 여기서는 가능성에 대해 궁금합니다.

+1

사용자 지정 CLR 호스트에 대해 알지 못하기 때문에이 모든 추측입니다. 작동 방식에 대해 생각해 보면 일부 응용 프로그램에서만 작동한다고 생각합니다. 이것은 파일 핸들이나 프로그램을 다시 시작할 때 존재하지 않을 수있는 다른 시스템 리소스 같은 것들 때문입니다. 호스트 나 응용 프로그램 중 어느 쪽이든지 이러한 외부 리소스를 다시 요청하려고 시도 할만큼 똑똑해야합니다. 호스트를 지원하기 위해 앱을 변경해야하는 경우, 어쨌든 앱이 일시 중지되었다가 다시 시작될 수 있으므로 호스트가 필요 없다고 생각합니다. – Steve

+0

Workflow Foundation (http://msdn.microsoft.com/en-us/netframework/aa663328.aspx)은 어떻습니까? 이렇게하면 작업을 중지하고 직렬화하여 나중에 계속할 수 있습니다. 좋은 그림은 여기에 : http://msdn.microsoft.com/en-us/library/dd851337.aspx. – Govert

+0

@Govert 나는 Workflow Foundation에 대해 오히려 meh라고 느낀다. 이 전체 대화에 관심이있는 것이 지속적인 반복기 개념에 대한 링크였습니다. 조금 해키지만, 나는 그것으로 좋은 것들을 할 수있을 것 같아요 ... 링크는 여기에있다 : http://dotnet.agilekiwi.com/blog/2007/05/implementing-workflow-with-persistent. html –

답변

3

당신의 퍼레이드에 비가 와서 미안하지만, 그것은 날지 않을 것입니다. ICLRTask 인터페이스는 SQL Server 팀의 빠른 요청에 추가되었습니다. 프로그래머가 저장 프로 시저에 관리 코드를 작성할 수 있도록 CLR의 사용자 지정 호스팅 인 SQLCLR 호스트를 지원합니다. 이들은 CLR 팀에게 관리되는 스레드와 운영 체제 스레드 (현재 프레임 워크의 ProcessThread) 간의 하드 링크를 해제하도록 요청했습니다. 관리 스레드를 섬유로 구현하려는 의도로 당시 SQL Server의 핵심 기능이었습니다.

실제로 발생하지는 않았지만 프로젝트를 충분히 신뢰할 수없고 프로젝트를 포기했습니다. 그리고이 프로젝트는 빠르게 작동 할 이유가 없어지기 때문에 광섬유는 자신의 L1 캐시가있는 멀티 코어 CPU와 일치하지 않습니다.

달성하고자하는 것과 관련하여 헤 소리 화가 없습니다. 프로세스 상태를 안정적으로 캡처하는 것 외에도 가장 까다로운 견해는 네이티브 코드를 실행하는 스레드를 처리 할 수 ​​없다는 것입니다. 특히 Winapi 함수를 pinvoked하고 I/O 요청을 완료하기 위해 커널 드라이버에서 블로킹하는 종류입니다. 커널 상태를 캡처 할 수 없으며 후크도 없습니다. pinvoke marshaller에 후크를 추가하면 너무 느려집니다. 최대 절전 모드는 시스템 기능이며 프로세스 기능이 될 수 없습니다.

+0

멋진 정보 주셔서 감사합니다! SwitchOut의 기능이 떨어지는 것을 보았지만, 이후 버전에서는이 기능이 구현되었다고 생각했습니다. 저 혼자서 신뢰할 수있는 대답을 얻으려면 내 표를 얻으세요! –

2

실행 프로세스를 일시 중단 한 다음 직렬화하고 다른 시스템 (또는 이후 시간)으로 이동하고 이력서가 Second Life 스크립트 엔진으로 통합 된 Mono 런타임에 구현 된 기능. 몇 년 전의 일이었습니다. 오픈 소스 모노 코드에 그 저작이 통합되었는지 확실하지 않습니다. 그러나 모든 보고서에 따르면 성공적인 운동이었습니다.

Miguel의이 블로그 게시물은 좋은 시작 http://tirania.org/blog/archive/2008/Jan-29.html 일 수 있으며, Second Life on Mono 작업에 대해 논의 된 LANG.NET 비디오에 대한 링크가 더 있습니다. 정확히 from another post를 수행 한 일에 대해

좀 더 단서 : 2006 년

는 LindenLabs에서 짐은 microthreading를 지원하기에 SecondLife에했던 일을 소개했다.

Jim의 작업은 Joe가 요청한 것보다 훨씬 야심 차있었습니다. SecondLife는 어느 시점에서든 코드를 일시 중단하고 전체 상태를 데이터베이스에 저장하기에 적합한 형식으로 직렬화 할 것을 요구했습니다. 직렬화 된 상태는 다른 시점 또는 다른 컴퓨터에서 복원 될 수 있습니다 (예 : 노드에서 노드로 이동 중).

이 기능을 사용하려면 모든 호출 스택 체인, 로컬 변수 및 매개 변수를 정확하게 추적하고 언제든지 코드를 일시 중단 할 수있는 시스템이 필요했습니다.

Jim은 상태 직렬화 및 환생을 기존 CIL 명령 스트림에 삽입 한 CIL 다시 쓰기 엔진을 사용하여이 작업을 수행했습니다. 그는 2006 년 Lang.NET에서 기술을 자세히 다루었습니다.

이 기술은 2008 년에 생산되었으며 현재이 지속 프레임 워크는 SecondLife에서 1,000 만 개의 모노 스크립트를 지원합니다.

+0

이것은 또한 대단한 괴물입니다! 링크를 가져 주셔서 감사합니다. 이것은 아마도 내 질문에 정확하게 대답하지 않았지만 분명히 내 의도에 응답했습니다. 나는 이것을주의 깊게 살펴볼 것입니다 ... –

+0

thanks! 그래서 그 당시 비슷한 두 가지 작업이있었습니다 : Tomi라는 사람과 Linden Lab의 사람이 있습니다. Tomi의 작업 (기본적으로 직렬화를 지원하지 않음)이 선택되어 Mono.Tasklets.Continuations (http://www.mono-project.com/Continuations)로 다시 접 힙니다. 그러나 직렬화 지원이 추가되었는지 확실하지 않습니다. 그게 뭔지 아십니까? 그렇지 않다면, Linden Labs가 Mono 버전을 공개한다면 어떤 단서가 있습니까? 나는 조금 파고 있었지만 지금까지는 아무것도하지 않았다. ... –

+0

나는 그것이 비슷한지 확신하지 못한다. 계속해서 기본적으로 C# 5와 같은 비동기 용 배관을 제공합니다. 런타임 직렬화는 훨씬 더 복잡합니다. http://lists.ximian.com/mailman/listinfo/mono-devel-list에있는 Mono dev리스트에서 물을 수 있습니다. – Govert