2009-04-03 3 views
21

프로세스를 일시 중지하고 메모리 내용을 파일로 저장 한 다음 나중에 프로그램을 계속할 수 있도록 파일을 다시로드 할 수 있습니까?나중에 사용할 수 있도록 프로세스의 메모리를 저장 하시겠습니까?

편집 나는 이것에 대해 읽어 봤는데 :

http://en.wikipedia.org/wiki/Setcontext

는 동일한 메모리 영역을 할당하는 malloc을 강제로 어떻게 든 구조체의 내용을 덤프하고, 할 수 있습니까?

+0

리눅스에서 커널을 수정하지 않고도 cryopid가 그것을 할 수 있습니다. – user2284570

답변

16

기술적으로는 가능하지만 시스템에 할당 된 모든 리소스 상태를 저장해야합니다 (예 : 파일 desciptors). 따라서 그것은 어려운 과제입니다.

원하는 것을 얻기위한 가장 쉬운 방법은 VMWare와 같은 가상 컴퓨터를 사용하는 것입니다. 일시 중지하면 실제로 실행중인 모든 프로그램과 함께 전체 시스템 상태가 저장됩니다.

+0

그리고 VMWare는 네트워크 인터페이스와 같은 다른 리소스가 올바르게 다시 시작되도록합니다. –

+0

그것은 도전적 일뿐만 아니라 일반적으로 불가능합니다. http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg

+0

@GSerg를 참조하십시오. 해당 링크는 최대 절전 모드 일 때 프로세스 외부의 리소스가 해제 될 것이라고 전제합니다. 프로세스가 do-not-run 큐에 숨겨져 있고 EX-process 리소스를 포기하지 않고 디스크로 보내진 주소 공간의 경우에는 그렇지 않아도됩니다. – paxdiablo

0

.NET 3.0 이상의 워크 플로 파운데이션을 사용하면 워크 플로를 중지했다가 다시 시작할 수 있습니다.

2

글쎄 자바는 직렬화를 가지고 있으며, 어딘가에 있습니다. 비록 당신이 프로세스를 일시 정지 시켰을 때와 같은 상태로 OS를 요구하기 때문에 CPU 레지스터 메모리 주소 등과 같은 가장 낮은 레벨로는 할 수 없지만. sharptooth 언급으로

1

그것은 원시 코드를 처리 할 때 불가능 있다는 점에 지저분한입니다 :-) 리눅스 커널 모듈로 좋은 프로젝트가 될 수 있습니다.

그러나 일부 프로그램 (예 : iirc emacs)은 구성 파일을 처리하는 대신 구성을 보존하기 위해 "내 자신의 메모리를 덤프"트릭을 사용했습니다. 하지만 실행 파일은 거부 쓰기 공유 모드에서 실행되므로 Windows에서는 작동하지 않습니다. 그러나 그것은 리눅스 나 DOS에서 귀여운 (비록 위험 하긴하지만) 트릭입니다 :)

6

이것을 보통 persistent continuation라고합니다. SmallTalk 및 SBCL과 같은 일부 언어는 영구 지속에 대한 일류 지원을 제공합니다. 대부분의 언어는 그렇지 않습니다.

+0

연속체는 프로그램 내에서 제어 흐름을 구조화합니다. 프로그램 실행을 중지하거나 시작하지 않습니다. – sth

+0

@sth 일부 스몰 토크 런타임 및 SBCL은 사용자가 생각하는 일시적인 지속 시간이 아닌 지속적인 지속 시간을 지원합니다. –

4

당신이 gdb를보다 다시 다른 최대 core dump

나는 결코 실제로로드되지 시도 코어 덤프 프로그램을 강제로 시도 할 수 귀하의 요구 사항과 OS에 따라. sharptooth가 지적한 것처럼 열려있는 파일이나 프로그램 메모리에없는 다른 상태가 손실되는 것 같습니다.

또 다른 방법은 단순히 프로그램에서 디스크에 필요한 상태를 직렬화하는 것입니다. 그것은 짜증나지만 당신이 프로그램의 실행을 중단하는 것에 만족하지 않는 한 아마 가장 신뢰할 수있는 방법 일 것입니다. 그것은 운영 체제의 쓰레드 라이브러리로 할 수 있습니다. 또는 한 포스터가 귀하의 껍질로 지적했다.

0

레이몬드 첸 explains 왜 그렇게 할 수 없습니까? Visual Studio 컴파일러는 헤더를 미리 컴파일 할 때이 작업을 수행하기 때문에 분명히 모든 Microsoft 엔지니어가이를 읽지는 않습니다. 헤더를 처음 컴파일 한 후 자체 상태를 덤프하고 계속해서 복원합니다.

+1

첸씨는 옳고 그름입니다. 외부 프로세스 리소스가 사라지면 불가능합니다. 이것은 일어나지 않아도됩니다. out-of-process 리소스를 보존하면서 프로세스를 완전히 중지 할 수 있습니다. 재부팅을 견디지 못하더라도 분명히 필요하지는 않습니다. – paxdiablo

+0

일부 CPU 집약적 인 작업을 수행하는 동안 프로세스를 완전히 정지시키는 기능은 여전히 ​​중요합니다. 그런 다음 해당 프로세스를 다시 시작하면됩니다. SIGSTOP/SIGCONT는 이미 UNIX 외에서이 작업을 수행합니다. – paxdiablo

+0

실제로, 유휴 상태로 우선 순위를 낮추면 충분합니다. 마지막 코어의 마지막 몇 % 만 사용하면 해가되지 않습니다. 많은 병렬 알고리즘은 전체 작업, 특히 나무에서 완전한 병렬 처리를 유지할 수 없습니다. – MSalters

1

"Persist (hibernate!) a process state to disk for quiker loading"(SiC)로부터 견적 :

Q.프로세스 상태를 디스크에 저장하고 필요할 때 다시 사용할 수 있도록이 스왑의 작동 방식에 대해 더 자세히 설명해 주시겠습니까? "

A. 매우 간단합니다. 페이지 파일은 디스크의 특정 위치로, 비활성 프로세스가 있습니다. 이러한 프로세스가 실행 다시 시작하면 고도로 최적화 된 방식으로 저장됩니다. 시스템이 자동적으로 메모리로 다시 읽어 들여, 그냥 어디에서 계속됩니다. 그것은 프로그램

이 모든 기능 : 아이 패드에서 실행하는 방법의 일종이다 프로세스가 계속 실행되는 동안 시스템은 메모리 또는 PA에 있음을 확인합니다. ge 파일 (예외는 거의 없지만 무시할 수 있습니다.)

즉, Windows는 이미 프로세스를 페이지 파일에 최대 절전 모드로 전환 할 수 있습니다. Raymond Chen의 @MMS 인용문 "explaining why its impossible"은 단순히 잘못되었습니다.

+1

페이지 된 프로세스에 대한 부기가 여전히 RAM (커널)에 있음을 유의하십시오. 윈도우 핸들은 유효합니다. 다시 페이지로 돌아 가게 할 메시지를 보낼 수 있습니다. 이것이 일반적으로 프로세스 최대 절전 모드로 간주되지 않는 이유입니다. – MSalters

관련 문제