記憶體管理策略!(13)

2021-08-09 04:33:59 字數 1847 閱讀 2389

對於32位程序而言,這個位址空間的大小為4gb。而64位程序則可以到達16eb的位址空間。每個程序都有自己專有的位址空間,當程序中的執行緒執行時,他們只能訪問屬於該程序的記憶體。

每個程序的虛擬空間都被劃分成許多分割槽:

0x00000000-0x0000ffff是空指標賦值分割槽

0x00010000-0x7ffeffff是使用者模式分割槽

0x7fff0000-0x7fffffff是64kb禁入分割槽

0x80000000-0xffffffff是核心模式分割槽

空指標賦值分割槽:該分割槽可以幫助程式設計師捕獲對空指標的賦值。如果有執行緒試圖讀取或寫入位於這一分區內的記憶體位址,就會引起違規操作。

使用者模式分割槽:程序位址空間的駐地。對於應用程式來說,程序的大部分資料都儲存在這一分割槽中。每個程序都有自己的資料分割槽,因此程序無法通過指標來讀取、寫入或以任何方式,訪問駐留在這一分割槽中其他程序的資料。

記憶體對映檔案的物理儲存器來自磁碟上已有的檔案,而不是來自也交換檔案。系統在載入exe和dll檔案的時候使用的是記憶體對映檔案來載入並執行exe和dll,這樣大大節省了頁交換檔案的空間以及應用程式的啟動時間。所以,實際上系統載入exe檔案的時候就是利用記憶體對映檔案技術把磁碟中的exe檔案對映到記憶體(實際上,系統只是預定了一塊足夠大的位址空間來容納exe檔案,一定要注意「預定」這個詞,待預定的位址空間區域的具體位置已經在exe檔案中指定。預設情況下,exe的基位址為0x00400000.系統也會對這個位址空間的區域進行標註,表明該區域的後備物理儲存區來自磁碟上的exe檔案,而非來自系統的頁交換檔案。

以上就是,系統裝載可執行檔案的時經常被稱為「對映到位址空間」的解釋了,實際上就是建立了exe檔案對應的頁交換檔案,也就是系統為這個exe檔案的執行預定了足夠大的位址空間,在x86下為4g的位址空間。

以上是系統載入exe檔案的過程,對映到位址空間之後,系統開始執行exe檔案的啟動**。完成了這個對映過程後,系統會負責所有的換頁(paging),快取(buffering)以及快取記憶體(caching)的操作。例如,如果.exe檔案中的**跳到乙個指令位址,但是該位址尚未載入記憶體,那麼會引發乙個頁錯誤(page fault)。系統會檢測到這個錯誤並自動將該頁**從檔案載入到記憶體。然後系統會把該記憶體頁對映到程序位址空間中的適合位置,並讓執行緒繼續執行,就好像該頁**早就在記憶體中一樣。

從理想來分析整個裝載的過程,我們需要了解pe檔案的結構,實際上,在載入的過程pe檔案會按照磁碟中的各個頁的排列順序對映到位址空間中,也即是對映到記憶體對映檔案中。改變的只是每乙個頁在磁碟中的對齊大小要按照在記憶體中的頁對齊大小來排列了。假如,在磁碟中的檔案對齊為0x1000,記憶體對齊其0x2000,那麼pe檔案的記憶體映像中每一也都將擴大1倍了,但是每乙個頁的相對位置不變。這樣,對於磁碟映像到記憶體映像的雙向都可以很容易的一一對應起來,這為windows虛擬記憶體的管理提供了很好的乙個機制。檔案對齊和記憶體對齊的值在pe檔案中都有指定,具體的位置在pe的頭部資訊中。

當執行緒試圖寫入乙個共享頁面時,系統會接入並執行一下操作。

(1)系統在記憶體中找到乙個閒置頁面。注意,該閒置頁面的後備頁面來自頁交換檔案,它是系統最初將模組對映到程序的位址空間時分配的。由於系統在第一次進行對映的時候分配了所有可能需要的頁交換檔案空間,這一步時不可能失敗的。

(2)系統把執行緒想要修改的頁面內容複製到在第1步中得到的閒置頁面。

(3)然後,系統更新程序表,這樣一來,原來的虛擬位址現在就對應到記憶體中乙個新的頁面了。

在執行完以上步驟後,程序就可以訪問它自己的副本了。

把資料的位址模除資料的大小,如果結果為0,那麼資料就是對其的。如果資料未對齊,那麼會有兩種可能,第一種是cpu會引發乙個異常,另一種時cpu會通過多次訪問已對齊的記憶體,來取得整個錯位的資料。在x86-x64平台下,cpu會自動修正未對齊錯誤。

記憶體管理策略

在引用計數的環境下管理記憶體使用的基本模型是,通過在nsobject協議定義的方法和提供標準命名的方法。nsobject類也定義了乙個方法 dealloc 當乙個物件被釋放時此函式被呼叫。本文介紹了您需要知道的,如何正確的管理內存在乙個cocoa程式,並提供了一些正確的使用例項。記憶體管理模型是基於...

Redis記憶體管理 鍵過期策略 記憶體淘汰策略

記憶體使用統計指標 可以參考文章 其中需要重點關注的指標 used memory redis使用的記憶體總量 used memory rss 系統分配的記憶體總量 mem fragmentation ratio 記憶體碎片率 used memory rss used memory 當 mem fra...

13 Windows API 記憶體管理(3)

二 堆管理 使用者使用記憶體分配函式分配的記憶體都位於堆中,所以使用堆管理函式對記憶體進行分配 釋放等是最為直接的方式。windows系統中,每個程序都有自己的堆,每個程序的堆的數量也有所不同。windows系統中所謂的 堆 heap 並不是記憶體塊,而是一種用於記憶體管理的物件,也是一種記憶體組織...