作業系統記憶體管理

2021-05-01 04:15:19 字數 2849 閱讀 2266

作業系統記憶體管理

一、  程序的虛擬位址空間

每個程序都被賦予自己的虛擬位址空間,對於32位程序來說,這個位址空間為4g,因此程序中的位址可以為0x00000000至0xffffffff之間的任何乙個值。其中4g空間中的低區的2g空間留給程序使用,而高區的2g空間則留給系統使用。

在windows2000下,分割槽情況為:

1、   null指標分配的分割槽

null指標分配的分割槽佔據0x00000000至0x0000ffff,該分割槽的設定是為了幫助程式設計師掌握null指標的分配情況。例如當malloc或new分配失敗時就返回null,該分割槽的位址是禁止進入的,訪問該分區內的位址將發生訪問違規現象,同時終止該程序的執行。

2、   使用者方式分割槽

該分割槽是程序私有的位址空間,對於應用程式來講,該分割槽是維護程序的大部分資料的地方,所有的.exe和dll模組均載入在這個分割槽,每個程序可以將dll載入到不同的位址中。對於.exe而言,一般載入到0x00400000位址處。

程序的棧和堆也是在該分割槽中開闢的。

3、   禁止進入分割槽

該分割槽是使用者方式分割槽上禁止進入的分割槽,位於0x7fff0000至0x7fffffff,訪問該分割槽的任何企圖均將導致訪問違規,該分割槽的存在是為了防止使用者從使用者區訪問核心區的**。如:

byte buf[70000];

dword numwritten;

writeprocessmemory(getcurrentproces(), (pvoid)0x7ffeee90, buf, sizeof(buf), &numwritten);

將有可能成功地將資料寫入只能有核心方式**訪問的記憶體。

4、   核心方式分割槽

該分割槽是存放作業系統**的地方,用於執行緒排程、記憶體管理、檔案系統支援、網路支援和所有裝置驅動程式的**全部在這個分割槽載入駐留在該分割槽的一切均可被所有近程序共享。

二、  虛擬記憶體的實現

本質上虛擬記憶體就是要讓乙個程式的**和資料再沒有全部載入記憶體的情況下執行程式。執行過程中,當執行到尚未載入的記憶體**,或者要訪問還沒有載入到記憶體的資料時,虛擬記憶體管理器動態的將這部分**或資料從硬碟載入到記憶體中。而且在通常情況下,虛擬記憶體管理器也會相應的將記憶體中某些**或者資料置換到硬碟中,為即將載入的**或資料騰出地方。

win32中用來輔助實現虛擬記憶體的硬碟檔案稱為「調頁檔案」,調頁檔案用來存放被虛擬記憶體管理器置換處記憶體的資料,當這些資料再次被程序訪問時,虛擬記憶體管理器會先將它們從調頁檔案中置換進記憶體,這樣程序可以正確訪問這些資料。

程式**(包括exe和dll檔案)不會被修改,所以他們所在的頁被置換處記憶體時,並不會被寫進調頁檔案中,而是直接拋棄,當再次被需要時,虛擬記憶體管理器直接從存放他們的exe或dll檔案中找到他們並調入記憶體。

三、  虛擬記憶體的狀態

1、自由

自由表示此頁尚未分配出去,可以用來滿足新的記憶體分配請求。

2、預留

預留是指從虛擬位址空間中劃出一塊區域(頁的整數倍大小),劃出之後的區域中的頁不能用來滿足新的記憶體分配請求,只是用來供要求「預留」此段區域的**以後使用,預留狀態的區域並沒有分配物理儲存,只是增加了乙個描述程序虛擬位址空姐使用狀態的資料結構,用來記錄這塊區域已倍預留。

3、提交

提交記憶體時會從調頁檔案中開闢空間,並修改vad中的相應項。當然,此時並沒有立刻從物理記憶體中分配空間,只是從磁碟的調頁檔案中開闢空間。

當有**第一次訪問這段提交記憶體中的某些資料時,系統發現並沒有真正的物理記憶體,拋出缺頁異常,虛擬記憶體管理器處理該異常,此時才會真正的分配物理記憶體。

四、  虛擬記憶體狀態的管理

win32虛擬記憶體管理器使用乙個資料結構(virtual address descriptor, vad)來記錄和維護每個程序4g的虛擬位址空姐的使用及狀態,美國程序都有自己的vad集合,這個集合被組織成乙個自平衡二叉樹。只有預留或提交的記憶體塊才有vad,自由的記憶體塊沒有vad,因此不在vad資料結構中的虛擬位址就是自由的。每塊vad資料結構記錄了該塊的起始位址以及當前狀態。

五、  訪問虛擬記憶體時的處理流程

對某虛擬記憶體區域進行了預留並提交之後,就可以對該區域中的資料進行訪問了,一下為訪問虛擬記憶體時的處理流程。

1、當被訪問資料已在物理記憶體時,虛擬記憶體管理器只需記那個該資料的虛擬位址對映為物理指標。

2、當被訪問的資料不在物理記憶體時,檢測此資料是否在調頁檔案中或者在exe或dll檔案中,若存在則進入下一步,否則發生訪問違例錯誤,程序退出。

3、判斷記憶體中是否有空閒頁,若存在空閒頁,則直接將調頁檔案或exe或dll檔案的資料載入到該空閒頁中。

虛擬記憶體管理器維護了乙個稱為「頁幀資料庫page-frame database」的資料結構,該資料結構時作業系統全域性的,當系統啟動時被初始化,用來跟蹤和記錄物理記憶體真能幹的每個頁的狀態。

4、當記憶體中不存在空閒頁時,根據調頁演算法,首先選擇出某個頁作為換出頁。

5、判斷此頁自上次調進後是否修改過,若沒有被修改過,則將需要訪問的資料調入此頁,若被修改過,則需要先將此頁的內容寫到調頁檔案與此頁相對應的備份頁中,並隨即將此頁標記為空閒頁。

六、  虛擬位址到實體地址的對映

當訪問的資料已在物理記憶體中後,需要將虛擬位址轉換為實體地址,即「位址對映」,才能真正訪問此資料。

每個程序都維護一套自己的層次表結構來實現位址對映。

第一層稱為「目錄表」,實際上是乙個記憶體頁,以四個位元組為單元分成1024個項,每一項稱為「頁目錄項」。

第二層稱為「頁表」,共有1024個頁表,頁目錄表中的每個目錄表項對應這一層中的某個頁表,每個頁表也佔乙個記憶體也,同樣被分成1024項,表頁的每一項稱為「頁表項」,每個頁表項指向物理記憶體中的某乙個頁幀。

第三層稱為頁幀,是真正存數資料的地方。

當進行位址對映的時候,對應於層次表中的三個部分,頁將32位的位址分成三個部分,最高的十位對應頁目錄下標,次高的十位對應頁表的下標,低位的12位對應位元組下標作為頁內定址。

作業系統記憶體管理

作業系統記憶體管理一 程序的虛擬位址空間 每個程序都被賦予自己的虛擬位址空間,對於 32位程序來說,這個位址空間為 4g,因此程序中的位址可以為 0x00000000 至0xffffffff 之間的任何乙個值。其中 4g空間中的低區的 2g空間留給程序使用,而高區的 2g空間則留給系統使用。在win...

作業系統記憶體管理

記憶體,毫無疑問是最重要的資源,顯然,作業系統對記憶體的管理我必須清楚。這裡主要介紹了分頁管理和分段管理。1.頁式管理 a.頁式管理的基本思想 打破儲存分配的連續性 將邏輯上連續的使用者程式對映到離散的記憶體塊 使用者程式與記憶體空間被劃分為若干等長的區域 邏輯頁 與 物理頁 使用者程式的劃分由系統...

作業系統 記憶體管理

記憶體管理 在單道程式設計系統中,記憶體被分為兩部分 一部分供作業系統使用,一部分供當前正在執行的程式使用。在多道程式設計系統中,必須在記憶體中進一步細分出 使用者部分 以滿足多個程序的要求。細分的任務由作業系統動態完成,這成為記憶體管理。記憶體管理術語 頁框 記憶體中乙個固定長度的塊。頁 乙個固定...