虛擬位址空間
程序可用的虛擬位址範圍稱為該程序的「虛擬位址空間」。每個使用者模式程序都有其各自的專用虛擬位址空間。 對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x00000000 至 0x7fffffff。
那麼什麼又是使用者模式?
使用者模式與核心模式
這同樣是cpu的概念。cpu就有這兩種執行方式,兩種方式的保護級別不一樣。根據cpu上執行的**的型別,cpu在兩個模式之間切換。應用程式在使用者模式下執行,核心作業系統元件在核心模式下執行。可以這樣理解:核心模式的許可權更高,可以執行一些使用者模式不能執行的指令,比如裝置i/o。
在遙遠的dos時代,系統和程式都執行在cpu的實模式下(使用者模式就是cpu的)
每個使用者模式程序都有其各自的專用虛擬位址空間,但在核心模式下執行的所有**都共享稱為「系統空間」的單個虛擬位址空間。當前使用者模式程序的虛擬位址空間稱為「使用者空間」。
共享記憶體和對映檔案
引入:共享記憶體的定義是:對於多個程序可見的記憶體,或者出現在多個程序的虛擬位址空間中的記憶體。那麼共享記憶體有什麼作用?用處大了!設想,在windows中有兩個程序使用了同乙個dll,那麼,只需要將該dll中的**載入到物理記憶體中一次,然後再在所有需要使用這個dll的程序之間共享這塊記憶體,不就可以節省大量的記憶體,並且節省了重複載入的時間!
下圖演示了兩個程序之間共享記憶體的情形。
作為乙個現代的作業系統,windows需要提供這種機制。而windows的記憶體管理器實現共享記憶體的機制叫記憶體區物件,在windows api中又被稱為檔案對映物件。
程序的虛擬位址可以對映到記憶體區物件上,而記憶體區物件又可以在不同的地方:①在記憶體中;②在換頁檔案中;③在其他檔案中(顯然是磁碟上的檔案)。但是應用程式訪問這些檔案中的內容卻像它們在記憶體中一樣。這是如何實現的呢?下面分別來討論。在討論這個之前,先看一下另乙個概念:
頁面的狀態:空閒、保留的、已分配的。
乙個程序的位址空間中的頁面可以是空閒的(free)、保留的(reserved),或者已分配的(committed)。
總結:只有已分配的頁面才能訪問,而訪問頁面一定是訪問物理記憶體。因此如果頁面被對映到磁碟上,那麼第一次訪問時,系統需要將磁碟中的內容讀到記憶體中。
應用程式可以先保留位址空間,然後(在合適的時間)再分配位址空間中的頁面。當然,它們也可以在同乙個函式呼叫中一次性保留和分配頁面。相應的api是virtualalloc和virtualallocex。
使用「先保留再分配」的方法可以節省記憶體,它將提交分配頁面的操作推遲到真正需要這些頁面的時候,同時又可以保證虛擬位址空間的頁面相鄰。保留記憶體操作開銷很小,僅僅是更新一些小的內部資料結構(虛擬位址描述符)。對於那些可能需要大塊連續的虛擬記憶體的應用程式來說,這種方法是非常有用的:不需要為整個區域分配頁面,而可以先保留位址空間,等以後需要時再分配頁面。對於作業系統,乙個典型的例子是執行緒的使用者模式棧。執行緒棧的預設大小是1mb,但系統在建立執行緒的時候,只是保留乙個1mb的棧位址空間,而僅分配棧的初始頁面。下乙個頁面被標記為乙個守護頁面,但並沒有被分配。它的作用是捕捉對棧的已分配頁面之外的引用,並擴充套件這一部分。
----------------------- 我是分割線 --------------------------
回到剛才的話題。從上面的討論可以看到,不管記憶體區物件在哪,程序要訪問頁面,最終還是要將內容載入記憶體。這就回答了為什麼應用程式訪問這些檔案中的內容就像它們在記憶體中一樣。
當記憶體區物件是(準確的說是對映到)乙個磁碟上的檔案時,這個檔案就叫做記憶體對映檔案。而當記憶體區物件對映到一塊已分配的記憶體上時,這個記憶體區被稱為由換頁檔案支撐的記憶體區(原諒我,這個名字是潘愛民譯的),因為記憶體中的頁面往往對應換頁檔案,必要時會被寫入到換頁檔案中。此時,它便提供了前面所說的共享記憶體的功能。
記憶體區物件甚至可以引用比程序的位址空間大得多的檔案。為了訪問乙個非常大的記憶體區物件,乙個程序可以只對映該記憶體區物件中它感興趣的那部分(稱為該記憶體區的乙個檢視),其做法是呼叫mapviewoffile函式。
檔案對映有著廣泛的用途。應用程式可以用它來方便地執行檔案i/o,因為只需要讓對映檔案出現在其位址空間中即可(想想通常的readfile、writefile繁瑣的的呼叫)。系統的映像載入器可以利用檔案對映,將可執行映像檔案、dll和裝置驅動程式對映到記憶體中。
windows記憶體管理
32位平台下,cpu的定址能力為4gb,pc中有些裝置 如顯示卡 都提供自己的裝置記憶體,這部分記憶體會對映到pc的物理記憶體上,也就是讀寫這段物理記憶體位址,其實是在讀寫裝置記憶體位址,而不會讀寫物理記憶體位址。雖然提供了4gb的定址能力,但是實際可能沒有這麼大的物理記憶體,這樣就引入了虛擬記憶體...
Windows 記憶體管理
windows 2000 使用基於分頁機制的虛擬記憶體。每個程序有4gb的虛擬位址空間。基於分頁機制,這4gb位址空間的一些部分被映 物理記憶體,一些部分對映硬碟上的交換檔案,一些部分什麼也沒有對映。程式中使用的都是4gb位址空間中的虛擬位址。而訪問物理記憶體,需要使用實體地址。下面我們看看什麼是實...
windows記憶體管理
物理記憶體 硬體中真實存在的儲存空間。轉換操作,將程式中的虛擬位址轉換為硬碟中的真實位址 分頁和分段 api 1.堆管理 獲取 分配 1 handle heapcreate dword floptions,size t dwinitialsize,size t dwmaximumsize 為當前程序...