作業系統記憶體管理

2021-09-30 01:21:24 字數 3111 閱讀 2249

程式通常以二進位制形式儲存在磁碟上,為了執行,被調入記憶體放進程式空間內。在磁碟上等待調入記憶體的程序形成了輸出佇列(input queue)。

將指令和資料繫結到記憶體位址有以下幾種情況:

執行時:如果程序在執行時可以從乙個記憶體段移到另乙個記憶體段,那麼繫結必須延遲到執行時才行

邏輯位址(logical address):cpu所生成的位址

實體地址(physical address):載入到記憶體位址暫存器的位址,或記憶體單元所看到的位址

執行時從虛擬位址到實體地址的對映是由記憶體管理單元(memory-management unit,mmu)完成的。例如:基位址暫存器被稱為重定位暫存器(relocation register)。使用者程序所生成的位址在提交記憶體前,都將加上重定位暫存器的值:基位址設定為14000,生成位址為299,那實體地址就等於14299

使用者(程序)只生成邏輯位址,且認為程序的位址空間0-max。使用者提供的邏輯位址,必須在使用前對映到實體地址

乙個子程式只有被呼叫時才會被載入進記憶體,所有子程式都可以以重定位的形式保留在磁碟上。當乙個子程式呼叫另乙個子程式時,呼叫子程式首先檢查另乙個子程式是否裝載。如果沒有,可重定位的鏈結程式用來載入所需要的子程式,並更新程式的位址表反映這一變化

有些作業系統只接受靜止鏈結,此時系統語言庫的處理與其他目標模組一樣,由引導程式合併到二進位制程式映象中。動態鏈結,將鏈結延遲到執行時候(類似於動態載入)。如果存在動態鏈結,二進位制映象中對每個庫程式的飲用都有乙個存根(stub)。存根是一小段**,用來指出如何定位適當的記憶體駐留庫程式,總而言之就是:存根它會用子程式位址來替換自己,並執行子程式。好處是,下次執行這串**時,存根已經換成了位址,不需要再次鏈結產生開銷。動態鏈結還可以用於更新庫。

程序可以暫時從記憶體中交換到備份儲存上,當需要再次執行時可以調回記憶體中。更高階的的程序執行完後,低優先順序程序可以交換回記憶體以繼續執行。這種交換成為滾出(roll out)和滾入(roll in)

通常,乙個交換出的程序需要交換回到其原有的記憶體空間。這一限制是由位址繫結方式決定的,如果繫結是在彙編或載入時候確定的,那程序不可以移動到不同的位址空間;如果是在執行時才確定的,由於實體地址是在執行時才進行的,那可以移動到不同的位址空間

交換需要備份儲存於快速磁碟,提供對這些記憶體映象的直接訪問。系統有乙個就緒佇列,包括在備份儲存或在記憶體中準備執行的所有程序。當cpu排程程式決定執行程序時,快速磁碟呼叫排程程式,檢測佇列裡的下乙個程序是否在記憶體裡。如果不在記憶體裡,且沒有空閒記憶體空間,排程程式將記憶體中的乙個程序交換出去,並換入所需要的程序,然後重新裝在暫存器,將控制權交給所選擇的程序

記憶體分為兩個區域,乙個用於駐留作業系統,另乙個用於使用者程序;需要考慮如何為輸入佇列中需要調入記憶體的程序分配記憶體空間。採用連續記憶體分配(contiguous memory allocation)時,每個程序位於乙個連續的記憶體區域

***程序保護

*是通過重定位暫存器和界限暫存器來實現的。重定位暫存器有最小的實體地址值;界限位址暫存器含有邏輯位址的範圍值。邏輯位址必須小於界限暫存器

將記憶體分為多個固定大小的分割槽(partition)。每個分割槽只能容納乙個程序。然而這種多分割槽(multiple-partition method)的方法已經已不再使用。固定分割槽方案的推廣:在可變分割槽方案中,作業系統有乙個表,用於記錄哪些記憶體已用和哪些記憶體可用。一開始所有記憶體都可用於使用者程序,成為乙個孔(hole)。當有新程序需要記憶體時,為該程序查詢足夠大的孔。如果找到,可以從該孔為該程序分配所需記憶體,孔內未分配的記憶體可以下次再用。當程序分配到孔時,就裝入記憶體,開始競爭cpu

在任何時候,都有一組可用孔大小列表和輸入佇列,作業系統會根據排程演算法對輸入佇列進行排序。記憶體不斷分配給程序,直到下乙個程序的記憶體需求不能滿足為止,作業系統可以等到有足夠空間,或者向下掃瞄佇列以確定是否有其他記憶體需求小的程序可以被滿足。

通常,一組大小不同的孔分布在記憶體中,當分配給新程序的孔太大時,將孔分兩塊,剩下的換給孔集。如果心孔和其他孔相鄰,那這些孔合併成大孔

分配最佳方法有:

首次適應:分配第乙個遇到的足夠大的孔

最佳適應:分配最小足夠大的孔,必須查詢整個表,產生最小剩餘孔

最差適應:分配最大的孔,必須查詢最大的孔

碎片首次適應方法和最佳適應方法都會有外部碎片問題(external fragmentation)隨著程序的裝入和移入記憶體,空閒記憶體空間被分為小片段。當所有總的可用記憶體之和可以滿足請求,但並不連續時,就出現了外部碎片問題。不管用什麼優化,假定有n個可分配塊,那麼可能有0.5n個塊為外部碎片。即1/3的記憶體可能不能使用,這一特性成為50%規則

因此可以用「塊」來分配記憶體,但程序分配的記憶體可能比所要的記憶體要大(最後乙個塊可能用不完)

還可以使用緊縮(compaction)方法,移動記憶體內容,使得所有空閒空間合併成一塊。但緊縮並非是總可能的,如果重定向是靜態的,並且在彙編或裝入時候進行的,就不能緊縮 分頁

分頁允許了非連續的無理位址空間,這樣只要有空間就可以分配

分頁避免了將不同大小的記憶體塊匹配到交換空間上這樣的麻煩,前面所述的記憶體管理方案都有這個問題,當位於記憶體的**或資料需要換出時,必須現在備份儲存上找空間,這就導致了備份儲存也存在碎片問題,但由於訪問更慢,備份儲存不適合使用合併

其基本方法是將物理記憶體分割為較小的塊,成為幀(frame),將邏輯記憶體也分割為同樣大小的塊,稱為頁(page)。當需要執行程序時,其頁就從備份儲存中調入可用的記憶體幀中。備份儲存也分為固定大小的塊,其大小與記憶體幀是一樣的。

cpu生成的位址分為兩個部分:頁號(p)和頁偏移(d)。頁號作為頁表中的索引。頁表包含每頁所在物理記憶體的基位址,這些基位址與頁偏移的組合就形成了實體地址。用cpu生成的頁號在頁表中查詢到該頁的基位址,然後加上頁偏移,組合後就可以送交物理單元

採取分頁技術不會產生外部碎片,每個幀都可以分給需要他的程序。但會產生內部碎片,如果程序要求的記憶體並,不是頁的整數倍,那最後乙個幀就用不完。例如,頁的大小事2048b,乙個大小為72776b的程序需要35個頁和1086b,該程序會得到36個幀,因此會產生接近乙個幀的內部碎片。

分頁環境下的保護

在分頁環境下,記憶體保護是通過每個幀相關聯的保護位來實現的,可以用乙個位來定義乙個頁是可讀寫還是唯讀的。每次位址引用都要通過頁表來查詢正確的幀碼。還有乙個位與頁表中的每一條目相關聯:有效位-無效位。該位有有效時,表示相關的頁在程序的邏輯位址空間內,因此是合法的。當該位是無效時,表示不在程序的邏輯位址空間內。

作業系統記憶體管理

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

作業系統記憶體管理

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

作業系統記憶體管理

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