프로그램의 메모리를 파일로 덤프하고 다시 복원할 수 있나요?

프로그램의 메모리를 파일로 덤프하고 다시 복원할 수 있나요?

특정 프로그램에서 사용하는 RAM의 복사본을 파일로 만들고 싶습니다. 그런 다음 나중에 해당 상태를 다시 복원하십시오.

ctrl+z & fg의 효과와 유사하지만 프로그램에서 RAM을 확보하고 싶습니다.

답변1

특정 프로그램에서 사용하는 RAM의 복사본을 파일로 만들고 싶습니다. 그런 다음 나중에 해당 상태를 다시 복원하십시오.

오해: ㄴ프로세스가지고 있다가상 주소 공간그리고 사용가상 메모리. RAM 자체는 운영 체제 커널에 의해 관리되는 리소스입니다. 읽다운영 체제: 세 가지 간단한 부분(프로세스는 사용하지 않습니다곧장메모리).

(질문에 대해 더 자세히 설명하기 위해 질문을 많이 편집하고 개선하는 것이 더 나을 것입니다. 어떤 종류의 프로그램을 원하는지, 어떤 맥락에서, 왜, 프로그램을 "중지"해야 하는지, 그리고 원하는지 나중에 개선된 버전으로 다시 시작해 보세요... 이러한 세부 정보가 없으면 더 이상 도움을 드릴 수 없습니다.

Linux에서는 다음을 사용할 수 있습니다.공정(5)주어진 프로세스의 가상 주소 공간을 쿼리합니다. 시도 cat /proc/$$/maps하고cat /proc/self/maps

RAM도 확보하고 싶습니다.

커널이 RAM을 관리하고 있기 때문에 이 작업을 수행할 필요가 없습니다(때때로이기다일어날 수 있습니다). 당신은 또한 볼 수 있습니다미친 웨스(2),posix_fadvise(2),매핑(2),시계 잠금(2). 프로세스가 종료되면 커널은 가상 주소 공간을 해제한 다음 할당된 RAM을 재사용합니다. 프로세스가 중지된 경우(예: Ctrl Z전송 하여 SIGTSTP, 참조)신호(7)&용어(3)), 커널은 다른 목적으로 RAM의 용도를 변경할 수 있습니다(그리고 스왑 공간을 사용하여 더티 페이지를 저장합니다.페이지 출력- 프로세스가 중지되었습니다). 읽다페이징 요청&http://linuxatemyram.com/

당신이 원하는 것신청 체크포인트그리고직교~을 고집하다. Unix와 Linux(및 Windows, Android, MacOSX 등을 포함한 대부분의 다른 운영 체제)에서는 다음과 같습니다.불가능한아니면 매우 어렵거나일반적으로 말하면(개방을 어떻게 처리하시겠습니까?파일 설명자,하위 프로세스,소켓,ASLR,신호,,파일 잠금,GUI,공유 라이브러리, 등...). 그러나 이러한 기능을 사용하여 애플리케이션을 작성할 수 있습니다(물론 이에 도움이 되는 라이브러리를 찾을 수 있음). 지속성 또는 체크포인트를 실현 가능하고 실용적으로 만들기 위해 몇 가지 추가 규칙과 제한 사항을 따르게 됩니다.

시스템 전체에서 이를 달성하려면 다음을 고려하십시오.동면.

지속성은 애플리케이션 설계 초기에 고려해야 하는 사항입니다(나중에 추가하기 어려울 수 있음). 참고하세요데이터 베이스(SQLite,관계형 데이터베이스 관리 시스템,NoSQL데이터베이스,...) 및 인덱스 파일(데이터베이스 관리 시스템...) 구현하는 일반적인 방법으로 간주될 수 있습니다.어떤 종류의지속성(힙을 다음과 같이 생각할 수 있습니다.사이클 다이어그램물체). 코드 관련 데이터를 보존합니다(예:친절한,가상 테이블,폐쇄,함수 포인터...) 일반적으로 어렵습니다.

당신은 좀 찾을 수 있습니다체크포인트 라이브러리,예를 들어BLCR또는크리우. 물론, 이를 사용하기 위해 개발된 애플리케이션의 제한된 컨텍스트 내에서 작동합니다.

마지막으로, 알고리즘 관점에서 전체 상태를 유지(또는 검사점 지정)하는 것은 정확한 상태를 복제하는 것과 매우 유사합니다.가비지 컬렉터. 예를 들어 그들에 대해 읽어보십시오.가스 크로마토그래피 핸드북,굉장히 유용하다.

그러나 진정한 지속성이나 체크포인트는 구현하기 어려우므로 애플리케이션 설계 초기에 고려해야 합니다. 많은 경우에 이것은 충분히 어렵다.애플리케이션을 완전히 다시 작성해야 합니다.제공하지 마십시오.

코드의 발전에 맞춰 호환성을 유지하는 것이 더 어렵습니다(예: 이전 체크포인트에 적용된 최신 버전의 코드로 다시 시작하는 것). 당신은 다음으로부터 영감을 받을 수도 있습니다.동적 소프트웨어 업데이트기술.

일부 프로그래밍 언어 구현(예: Ocaml, Python, Java...)은 다음을 제공합니다.직렬화또는그룹도움을 받을 수 있는 시설. 다른 것들은 체크포인트하는 방법을 가지고 있습니다(예: SBCLsave-lisp-and-die,폴리 머신러닝 export).동형그리고반사유용한 프로그래밍 언어 기능입니다.

당신은 또한 볼 수 있습니다참조 시스템그리고비스몬드영구 시스템의 예입니다.

답변2

ctrl+z & fg의 효과와 유사하지만 프로그램에서 RAM을 확보하고 싶습니다.

Ctrl-z는 fg사용자가 요청한 작업을 정확하게 수행합니다. 커널에 RAM이 필요할 때 일시 중지된 프로그램이 디스크에 사용한 RAM을 스왑 파티션에 기록하여 RAM을 다른 목적으로 재사용할 수 있습니다. 프로그램이 나중에 활성화되면 fg스왑 영역에서 이 RAM을 읽습니다.

답변3

문서 생성 프로그램 TeX 및 LaTeX의 초기 버전에는 기본 프로그램을 시작하고 필요한 모든 다양한 모듈을 로드한 다음 코어 덤프를 트리거하고 새로운 " pre-Configuration"이 코어 덤프에서 실행 가능합니다.

일부가 있습니다좋은 토론tex.stackexchange에 있습니다.

나는 오늘날에도 이것이 이상한 진행 방법으로 간주되고 실행 중인 프로세스의 상태(동적 변수 값 등)를 전혀 보존하지 않는 런타임 사전 연결 형식에만 실제로 영향을 미친다고 생각합니다.

분명히 이전 버전의 emacs도 이 작업을 수행했지만 저는 이것을 알지 못했습니다.

답변4

Ctrl+Z와 fg 외에 원하는 것을 할 수 없을 것 같습니다.

문제는 프로세스의 메모리를 파일에 저장하는 것이 가능하지만(예: 코어 덤프 생성) 목표는 커널의 프로세스 테이블에서 프로세스를 삭제할 수 있는 것 같다는 것입니다. 그러나 이렇게 하면 열린 파일 등 프로세스가 차지하는 다른 모든 운영 체제 리소스가 해제됩니다.

일반적으로 이러한 리소스가 생성되면 해당 검색 방법은 저장되지 않습니다. 즉, 리소스를 다시 얻는 방법에 대한 정보가 저장되지 않습니다. 정보가 어딘가에 저장되어 있더라도 나중에 검색할 수 있다는 보장은 없습니다(성공적인 검색은 프로세스 외부의 상태나 변경된 시스템에 따라 달라질 수 있습니다).

관련 정보