완료하는 데 며칠이 걸릴 수 있는 긴 계산을 수행하는 프로그램이 있습니다.
컴퓨터를 종료하고 저장된 상태에서 프로그램을 실행할 수 있도록 프로그램의 실행 상태를 저장하는 방법이 있습니까? 아니면 어떤 이유로든 프로그램이 충돌하는 경우 (처음부터가 아니라) 저장된 상태에서 다시 시작할 수 있나요?
답변1
프로세스가 파일 시스템과 가질 수 있는 다양한 상호 작용으로 인해 프로세스의 다시 시작 가능한 스냅샷을 만드는 것은 어렵습니다. 일반적으로 UNIX 시스템이 이를 지원할 것이라고 기대하지 마십시오. 재부팅 가능한 코어 덤프를 갖춘 일부 유닉스 변형이 있었지만 현대에는 그렇지 않다고 생각합니다(너무 복잡해졌습니다).
Lisp 시스템에는 일반적으로 재부팅 가능한 이미지를 생성하는 dump 명령이 있습니다. 따라서 지원되는 Lisp 방언으로 프로그램을 작성할 수 있습니다.덤핑.
가상 머신에서 코드를 실행하고 VirtualBox와 같은 가상 머신 관리자를 사용하여 정기적인 스냅샷을 생성할 수 있습니다. 프로그램의 용도에 따라 성능이 저하될 수도 있고 그렇지 않을 수도 있습니다.
가장 좋은 해결책은 아마도 프로그램에 스냅샷 기능을 구축하는 것입니다. 순수한 계산 프로그램의 경우 이는 일반적으로 약간만 어렵습니다. 다중 스레드 컴퓨팅 프로그램에서 스냅샷 지점은 모든 스레드가 통신하는 전역 동기화 지점인 경우가 많습니다. 프로그램을 작업 패키지로 구축하고 프로세서가 유휴 상태일 때마다 작업을 시작하는 스케줄러로 진입점을 만들어 보세요. 신호를 받은 후 스케줄러는 현재 모든 작업이 완료될 때까지 기다리고 프로그램 상태를 저장한 다음 작업 예약을 다시 시작합니다.
답변2
컴퓨터를 종료하는 것보다 최대 절전 모드를 권장하지만, 정말 상황을 피할 수 없다면 '스냅샷/복원' 시스템이 있습니다.크리우(사용자 공간의 체크포인트/복원) 이는 귀하의 요구에 적합할 수 있습니다. 이 프레임워크를 사용하면 프로세스를 쉽게 "고정"(상태를 디스크에 효과적으로 저장)한 다음 다시 고정을 해제할 수 있습니다.
나는 이것을 광범위하게 테스트하지는 않았지만 꽤 좋은 문서를 가지고 있는 것 같으므로 이 문서가 도움이 될 것입니다. 또한 CRIU를 사용하려면 대부분의 기본 배포판( 및 Linux) CONFIG_CHECKPOINT_RESTORE
에서는 활성화되지 않은 여러 커널 기능을 활성화해야 할 수 있으므로 CONFIG_MEM_SOFT_DIRTY
이를 실행하려면 자체 커널을 컴파일해야 할 가능성이 높습니다.
노트:프로그램이 충돌하는 경우이유미리 동결하는 것은 프로그램이 동일한 상황에 다시 직면할 가능성이 높기 때문에 아마도 올바른 접근 방식이 아닐 것입니다(디스크나 메모리가 가득 찬 것과 같은 외부 이유가 아닌 경우).