Memory

是否可以將程序的記憶體轉儲到文件並再次恢復?

  • November 15, 2019

我想將某個程序使用的 RAM 複製到文件中。然後稍後再次恢復該狀態。

類似於 ctrl+z & fg 的效果,但我也想從該程序中釋放 RAM。

我想將某個程序使用的 RAM 複製到文件中。然後稍後再次恢復該狀態。

誤解:一個程序有它的虛擬地址空間並使用虛擬記憶體。RAM 本身是由作業系統核心管理的資源。讀取作業系統:三個簡單的部分(一個程序不直接使用RAM)。

(你最好編輯和改進你的問題,以便更多地解釋它:你有什麼樣的程序,在什麼情況下,為什麼,你需要多長時間“停止”程序,你呢?需要稍後重新啟動它的改進版本…?沒有這些細節,我們無能為力。)

在 Linux 上,您可以使用proc(5)來查詢某個給定程序的虛擬地址空間。嘗試cat /proc/$$/mapscat /proc/self/maps

我也想釋放記憶體

不需要這樣做,因為核心正在管理 RAM(有時可能會發生抖動)。另請參見madvise(2)posix_fadvise(2)mmap(2)mlock(2)。當一個程序終止時,核心將釋放它的虛擬地址空間,然後重新使用分配給它的 RAM。當一個程序停止時(例如通過Ctrl Z發送SIGTSTP,參見signal(7)termios(3)),核心可能會將其 RAM 用於其他目的(並使用交換空間來儲存該停止程序的髒頁 - 即頁出)。閱讀需求分頁和h​​ttp: //linuxatemyram.com/

您想要的與**應用程序檢查點正交持久性有關。在 Unix 和 Linux(以及大多數其他作業系統,包括 Windows、Android、MacOSX ……)上,一般來說這是不可能或非常困難**(你將如何處理打開的文件描述符子程序套接字ASLR信號量執行緒文件 鎖定,圖形 使用者 界面,共享 庫, ETC…)。但是你可以編寫一個具有這種特性的應用程序(你可以找到幫助的庫);當然,您將遵循一些額外的約定和限制,以使持久性或檢查點變得可行和實用。

如果您想要整個系統,請考慮hibernation

持久性是在應用程序設計時很早就要考慮的事情(之後可能很難添加)。請注意,數據庫sqliteRDBMSnosql數據庫…)和索引文件(gdbm …)可以被視為實現某種持久性的常用方法(您可以將堆視為對象的循環圖) . 持久化與程式碼相關的數據(例如vtables閉包函式指針……)通常很難。

您可以找到一些用於檢查點的庫,例如BLCRCRIU。當然,它們在為使用它們而開發的應用程序的有限上下文中工作。

最後,從算法的角度來看,持久化整個狀態(或檢查點)非常接近於複製精確的垃圾收集器。所以閱讀一些關於它們的東西,例如GC 手冊,是很有用的。

但是,真正的持久性或檢查點很難實現,應該在應用程序設計的早期就實現。在許多情況下,要求完全重寫不提供它的應用程序已經夠難的了。

與程式碼的演變保持兼容更加困難(例如,能夠使用應用於舊檢查點的較新版本的程式碼重新啟動)。您可能會受到動態軟體更新技術的啟發。

一些程式語言實現(例如 Ocaml、Python、Java 等)提供了可以提供幫助的序列化編組工具。其他人有一些檢查點的方式(例如 SBCL save-lisp-and-diePolyML export)。同音性反射是有用的程式語言特性。

另請參閱RefPerSysBismon作為持久系統的範例。

引用自:https://unix.stackexchange.com/questions/439312