簡體   English   中英

保存進程的內存以備后用?

[英]Save a process' memory for later use?

是否可以暫停進程,將內存內容保存到文件中,然后重新加載文件,以便繼續執行程序?

編輯我一直在閱讀有關此內容的信息:

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

是否可以轉儲結構的內容,並以某種方式強制 malloc 分配相同的內存區域?

從技術上講這是可能的,但它也需要保存所有系統分配的資源狀態 - 例如文件描述符,然后恢復它們。 所以這是一項具有挑戰性的任務。

實現您想要的最簡單方法是使用像 VMWare 這樣的虛擬機。 當您暫停它時,您實際上將整個機器狀態與所有正在運行的程序一起保存。

這通常稱為持久延續 一些語言,如 SmallTalk 和 SBCL,對持久性延續提供一流的支持。 大多數語言都沒有。

根據您的要求和操作系統,您可以嘗試強制進行核心轉儲

除了在 gdb 中,我從未嘗試過實際加載核心轉儲程序備份。 正如sharptooth指出的那樣,您打開的任何文件或不在程序內存中的任何其他狀態似乎都將丟失。

另一種方法是簡單地序列化您需要在程序中寫入磁盤的狀態。 這很糟糕,但它可能是最可靠的方法,除非您滿足於暫停程序的執行。 這可以通過操作系統的線程庫來完成。 或者正如一張海報用你的外殼指出的那樣。

好吧,java 有序列化,它接近它。 盡管您不能像 CPU 寄存器內存地址等那樣將其執行到最低級別,因為這將要求 os 處於“暫停”進程時的相同狀態。

作為 linux 內核模塊,這可能是一個很好的項目:-)

引用自“ Persist (hibernate!) a process state to disk for quiker loading ”(原文如此):

問:您能否詳細解釋一下這種交換是如何工作的,以便將進程狀態保存在磁盤中並在需要時重用?”

答:非常簡單。 頁面文件是磁盤上的一個特殊位置,非活動進程以高度優化的方式存儲在其中。 當此類進程恢復運行時,系統會自動將其讀回內存,並從原來的位置繼續運行。 這是程序在 iPad 上運行的方式 :)

所有這些功能都已內置於 Windows 中。 當您的進程繼續運行時,系統會確保它位於內存或頁面文件中(盡管有一些例外,您可以忽略)。

換句話說,Windows 已經具有將進程休眠到頁面文件的能力。 @MSalters 引用 Raymond Chen 的“ 解釋為什么不可能”是完全錯誤的。

正如sharptooth 提到的那樣,在處理本機代碼時,它變得混亂到無法實現的地步。

但是,某些程序(例如 iirc emacs)使用“轉儲我自己的內存”技巧來保留配置,而不是處理配置文件。 但是,這在 Windows 上不起作用,因為可執行文件在拒絕寫入共享模式下運行。 但它在 linux 或 DOS 上是一個可愛的(雖然很危險)技巧:)

.NET 3.0 及更高版本中的 Workflow Foundation 允許停止和重新啟動工作流。

Raymond Chen 解釋了為什么這是不可能的。 顯然,並非所有 Microsoft 工程師都會閱讀此內容,因為 Visual Studio 編譯器在預編譯頭文件時會這樣做。 它在第一次編譯頭文件后轉儲自己的狀態,並恢復自己以繼續。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM