프로세스를 일시 중지하고 메모리 내용을 파일로 저장 한 다음 나중에 프로그램을 계속할 수 있도록 파일을 다시로드 할 수 있습니까?나중에 사용할 수 있도록 프로세스의 메모리를 저장 하시겠습니까?
편집 나는 이것에 대해 읽어 봤는데 :
http://en.wikipedia.org/wiki/Setcontext
는 동일한 메모리 영역을 할당하는 malloc을 강제로 어떻게 든 구조체의 내용을 덤프하고, 할 수 있습니까?
프로세스를 일시 중지하고 메모리 내용을 파일로 저장 한 다음 나중에 프로그램을 계속할 수 있도록 파일을 다시로드 할 수 있습니까?나중에 사용할 수 있도록 프로세스의 메모리를 저장 하시겠습니까?
편집 나는 이것에 대해 읽어 봤는데 :
http://en.wikipedia.org/wiki/Setcontext
는 동일한 메모리 영역을 할당하는 malloc을 강제로 어떻게 든 구조체의 내용을 덤프하고, 할 수 있습니까?
기술적으로는 가능하지만 시스템에 할당 된 모든 리소스 상태를 저장해야합니다 (예 : 파일 desciptors). 따라서 그것은 어려운 과제입니다.
원하는 것을 얻기위한 가장 쉬운 방법은 VMWare와 같은 가상 컴퓨터를 사용하는 것입니다. 일시 중지하면 실제로 실행중인 모든 프로그램과 함께 전체 시스템 상태가 저장됩니다.
그리고 VMWare는 네트워크 인터페이스와 같은 다른 리소스가 올바르게 다시 시작되도록합니다. –
그것은 도전적 일뿐만 아니라 일반적으로 불가능합니다. http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg
@GSerg를 참조하십시오. 해당 링크는 최대 절전 모드 일 때 프로세스 외부의 리소스가 해제 될 것이라고 전제합니다. 프로세스가 do-not-run 큐에 숨겨져 있고 EX-process 리소스를 포기하지 않고 디스크로 보내진 주소 공간의 경우에는 그렇지 않아도됩니다. – paxdiablo
.NET 3.0 이상의 워크 플로 파운데이션을 사용하면 워크 플로를 중지했다가 다시 시작할 수 있습니다.
글쎄 자바는 직렬화를 가지고 있으며, 어딘가에 있습니다. 비록 당신이 프로세스를 일시 정지 시켰을 때와 같은 상태로 OS를 요구하기 때문에 CPU 레지스터 메모리 주소 등과 같은 가장 낮은 레벨로는 할 수 없지만. sharptooth 언급으로
이
은그것은 원시 코드를 처리 할 때 불가능 있다는 점에 지저분한입니다 :-) 리눅스 커널 모듈로 좋은 프로젝트가 될 수 있습니다.
그러나 일부 프로그램 (예 : iirc emacs)은 구성 파일을 처리하는 대신 구성을 보존하기 위해 "내 자신의 메모리를 덤프"트릭을 사용했습니다. 하지만 실행 파일은 거부 쓰기 공유 모드에서 실행되므로 Windows에서는 작동하지 않습니다. 그러나 그것은 리눅스 나 DOS에서 귀여운 (비록 위험 하긴하지만) 트릭입니다 :)
이것을 보통 persistent continuation라고합니다. SmallTalk 및 SBCL과 같은 일부 언어는 영구 지속에 대한 일류 지원을 제공합니다. 대부분의 언어는 그렇지 않습니다.
연속체는 프로그램 내에서 제어 흐름을 구조화합니다. 프로그램 실행을 중지하거나 시작하지 않습니다. – sth
@sth 일부 스몰 토크 런타임 및 SBCL은 사용자가 생각하는 일시적인 지속 시간이 아닌 지속적인 지속 시간을 지원합니다. –
당신이 gdb를보다 다시 다른 최대 core dump
나는 결코 실제로로드되지 시도 코어 덤프 프로그램을 강제로 시도 할 수 귀하의 요구 사항과 OS에 따라. sharptooth가 지적한 것처럼 열려있는 파일이나 프로그램 메모리에없는 다른 상태가 손실되는 것 같습니다.
또 다른 방법은 단순히 프로그램에서 디스크에 필요한 상태를 직렬화하는 것입니다. 그것은 짜증나지만 당신이 프로그램의 실행을 중단하는 것에 만족하지 않는 한 아마 가장 신뢰할 수있는 방법 일 것입니다. 그것은 운영 체제의 쓰레드 라이브러리로 할 수 있습니다. 또는 한 포스터가 귀하의 껍질로 지적했다.
레이몬드 첸 explains 왜 그렇게 할 수 없습니까? Visual Studio 컴파일러는 헤더를 미리 컴파일 할 때이 작업을 수행하기 때문에 분명히 모든 Microsoft 엔지니어가이를 읽지는 않습니다. 헤더를 처음 컴파일 한 후 자체 상태를 덤프하고 계속해서 복원합니다.
첸씨는 옳고 그름입니다. 외부 프로세스 리소스가 사라지면 불가능합니다. 이것은 일어나지 않아도됩니다. out-of-process 리소스를 보존하면서 프로세스를 완전히 중지 할 수 있습니다. 재부팅을 견디지 못하더라도 분명히 필요하지는 않습니다. – paxdiablo
일부 CPU 집약적 인 작업을 수행하는 동안 프로세스를 완전히 정지시키는 기능은 여전히 중요합니다. 그런 다음 해당 프로세스를 다시 시작하면됩니다. SIGSTOP/SIGCONT는 이미 UNIX 외에서이 작업을 수행합니다. – paxdiablo
실제로, 유휴 상태로 우선 순위를 낮추면 충분합니다. 마지막 코어의 마지막 몇 % 만 사용하면 해가되지 않습니다. 많은 병렬 알고리즘은 전체 작업, 특히 나무에서 완전한 병렬 처리를 유지할 수 없습니다. – MSalters
"Persist (hibernate!) a process state to disk for quiker loading"(SiC)로부터 견적 :
Q.프로세스 상태를 디스크에 저장하고 필요할 때 다시 사용할 수 있도록이 스왑의 작동 방식에 대해 더 자세히 설명해 주시겠습니까? "
A. 매우 간단합니다. 페이지 파일은 디스크의 특정 위치로, 비활성 프로세스가 있습니다. 이러한 프로세스가 실행 다시 시작하면 고도로 최적화 된 방식으로 저장됩니다. 시스템이 자동적으로 메모리로 다시 읽어 들여, 그냥 어디에서 계속됩니다. 그것은 프로그램
이 모든 기능 : 아이 패드에서 실행하는 방법의 일종이다 프로세스가 계속 실행되는 동안 시스템은 메모리 또는 PA에 있음을 확인합니다. ge 파일 (예외는 거의 없지만 무시할 수 있습니다.)
즉, Windows는 이미 프로세스를 페이지 파일에 최대 절전 모드로 전환 할 수 있습니다. Raymond Chen의 @MMS 인용문 "explaining why its impossible"은 단순히 잘못되었습니다.
페이지 된 프로세스에 대한 부기가 여전히 RAM (커널)에 있음을 유의하십시오. 윈도우 핸들은 유효합니다. 다시 페이지로 돌아 가게 할 메시지를 보낼 수 있습니다. 이것이 일반적으로 프로세스 최대 절전 모드로 간주되지 않는 이유입니다. – MSalters
리눅스에서 커널을 수정하지 않고도 cryopid가 그것을 할 수 있습니다. – user2284570