580 likes | 710 Views
第 3 章 記憶體管理. 作業執行時又可為自己申請附加主記憶體空間或為子孫處理程序申請主記憶體空間。因此,處理程序是向系統申請主記憶體的基本單位。電腦系統的主記憶體是一種有限資源,卻能滿足多元程式系統的眾多處理程序對主記憶體的要求,其關鍵在於有效的記憶體管理。記憶體管理是指主記憶暻瑊 z (輔助儲存體管理見檔案系統),包括分配主記憶體給處理程序,回收處理程序所佔用的主記憶體,為分配出去的主記憶體提供保護與共用,以及為作業提供一個虛擬的記憶體空間。. 3.1 實體記憶體.
E N D
第3章 記憶體管理 作業執行時又可為自己申請附加主記憶體空間或為子孫處理程序申請主記憶體空間。因此,處理程序是向系統申請主記憶體的基本單位。電腦系統的主記憶體是一種有限資源,卻能滿足多元程式系統的眾多處理程序對主記憶體的要求,其關鍵在於有效的記憶體管理。記憶體管理是指主記憶暻瑊z(輔助儲存體管理見檔案系統),包括分配主記憶體給處理程序,回收處理程序所佔用的主記憶體,為分配出去的主記憶體提供保護與共用,以及為作業提供一個虛擬的記憶體空間。
3.1 實體記憶體 實體記憶體簡稱主記憶體,它是電腦系統中最重要的儲存裝置。現今的個人電腦上通常都配有64 MB以上的RAM,大型電腦上的主記憶體容量更大。主記憶體除了作業系統程式碼佔用一部分(Windows 95佔用高位址段,而UNIX系統V佔用低位址段)外,餘者皆為使用者區域,由使用者處理程序瓜分。
3.2 虛擬記憶體概念與虛擬記 憶體管理 眾所周知,程式段經編譯後形成一個以0位址開始的線性位址或多維位址(常見二維位址)序列。使用者作業可能由若干個程式段組成,必須經過鏈結(linking)才能產生一個可執行檔。鏈結工作的實質是按照各個程式段之間的相互參照的關係把各段的位址統一成從0開始的一維線性位址。例如,Windows 95提供了4 GB的虛擬記憶體(比64 MB的實際主記憶體大得多),如圖3-1(含OS/2的虛擬記憶體)所示。
圖3-1 應用程式看到的虛擬記憶體 (a) OS/2的虛擬記憶體 (b) Win 32的虛擬記憶體
下面是Windows 95使用者在虛擬記憶體中建立私用區段、保留虛擬空間和儲存映射檔的情況。 (1) 私用區段。使用者使用HeapCreate()來產生私用空間,然後在該空間上充分利用系統業已存在的虛擬記憶體分配特性。 (2) 保留虛擬空間。使用者使用VirtualAlloc( ),在虛擬記憶體中保留一個區域,並且能對該區域限制存取許可權。 (3)儲存映射檔。對Windows 95的使用者來說,最主要的虛擬記憶體管理特性是透過儲存映射支援共用虛擬記憶體區域。
3.3 位址轉換 有人不明白為什麼要進行位址轉換。在多元程式環境下,一作業的處理程序空間所在主記憶體中的位置要依據當時主記憶體的狀況而定。因此,儘管它們在邏輯上的虛擬位址是固定的,卻實體記憶體位址在每次執行時可能都不相同,不進行位址轉換是不行的。 下面分兩種情況介紹記憶體管理方法。 (1) 全部處理程序都能載入到主記憶體,其管理方法主要有固定分區(Fixed Partition)、可變分區(Variable Partition)、分頁(Paging)、分段(Segmentation)。 (2) 只能部分處理程序或處理程序的一部分載入到主記憶體,其管理方法主要有需求分頁(Demand Paging)、需求分段(Demand Segmentation)。目前大多數作業系統都採用需求分頁方法。
3.4 處理程序全部載入主記憶體 3.4.1 固定分區 固定分區原理比較簡單,本節僅以舉例方式說明其原理(如圖3-2所示) • 圖3-2 固定分區原理圖
由於處理程序空間(Process Space, PS)的虛擬位址是從0開始遞增編址的,因此載入模組在把它載入到分區時,必須把所有虛擬位址轉換成從分區起始位址為起點的實體位址,其轉換公式是: 實體位址=虛擬位址+分區的起始位址 在處理程序執行之前完成的位址轉換為靜態重定位(static address relocation),它不需要硬體支援。當某個PS從主記憶體的一個區域移動到另一個區域時,原先計算的實體位址不再有效,應當再次進行位址轉換,其轉換公式是: 新實體位址=原區實體位址-原區起始位址+新區起始位址 位址轉換部一定發生在載入模組在把某個PS載入到分區時,有時會延遲到處理程序執行時,才會針對所參照到的物件做虛擬位址到實體位址的轉換,這叫做動態重定位(dynamic address relocation),其過程如圖3-3所示。
上述位址轉換公式的計算需要硬體支援,增加了硬體費用。動態重定位花在位址轉換上的時間比靜態重定位少得多。上述位址轉換公式的計算需要硬體支援,增加了硬體費用。動態重定位花在位址轉換上的時間比靜態重定位少得多。 • 圖3-4 分區與保護
3.4.2 可變分區 可變分區管理不是事先把主記憶體空間一次劃定,而是在系統執行過程中,根據處理程序實際需求的記憶空間大小來進行配置主記憶體。當處理程序釋放其所佔用的空間時,盡可能將那些較小的自由空間(Free Space)合併成較大的記憶體空間。在這種管理方法下,主記憶體分區的個數,各區域的大小,在主記憶體內活動的處理程序個數等都是隨時間而變化的。所以,可變分區又稱為動態分區。
例如,設有一個總容量為256 KB的主記憶體,其中低位址部分的40 KB用於存放作業系統,其餘的216 KB為5個處理程序空間所共同使用,如圖3-5所示。 若按先來先服務(FCFS)演算法分配空間給5個處理程序,則主記憶體配置的變化過程如圖3-6所示。 圖3-6 依可變分區配置後記憶體的狀態
以上是可變分區管理的基本想法,下面介紹實做的演算法。以上是可變分區管理的基本想法,下面介紹實做的演算法。 資料結構 一般常用有可用區塊表FBT(Free Block Table)和可用區塊串列FBC(Free Block Chain) 兩種資料結構供可變分區管理選用。例如,設主記憶體空間有如圖3-6(d)所示的配置現狀,則可用FBT或FBC描述之(如圖3-7所示)。
分區配置演算法 下面以FBC為基礎,介紹常見的三種分區分配演算法。 (1)最先適合(First Fit)。每次分配時總是順可用區塊尋找,找到第1個能滿足長度要求的可用區塊,將處理程序所需空間配置完畢後,剩餘的記憶體空間成為另一較小的可用區塊。 (2)最佳適合(Best Fit)。這種方法是從可用區塊串列中挑選能滿足申請長度的最小可用區塊。 (3)最差適合(Worst Fit)。總是挑選最大的可用區塊分配給申請者,這樣可使剩下的區域不致太小,還可供下次使用。
分配/回收程式與優先順序考慮 回收過程(free_block)是分配過程(get_block)的逆操作。在回收時要考慮回收的自由區是否與原自由區鄰接。鄰接有四種情況,如圖3-8所示,除(a)外,在其他三種情況下都應把回收區與原自由區合併構成一個更大的自由區。回收後要調整FBC。 圖3-8 自由區鄰接情況
地址轉換與保護 可變分區管理採用動態重定位完成虛位址到實體位址的轉換;基址/限長保護法(如圖3-9) 保證:當有越界事件產生時,當前指令不會去存取本分區之外的主記憶體。 圖3-9 地址轉換與保護
分區共用 只要兩個處理程序空間包含相同的虛擬位址(如Windows 95),實體記憶體分區即被二處理程序所共用。同理,允許多處理程序共用分區。
3.4.3 分頁管理 固定分區管理存在“內部斷裂”,可變分區管理存在一些小的難以使用之可用區塊(重新重組這些可用空間的代價太大),被稱為“外部斷裂”。由於內部斷裂的存在,主記憶體的利用率不高。其根本原因是它們都把處理程序使用空間作為不可分割,需整體申請一個整個區塊的主記憶體空間,固定分區是處理程序“整體”空間需求小於實體記憶體固定長度的分區,而產生內部斷裂,可變分區是“整區”大於“整體”而產生外部斷裂。也將實體記憶體劃分成較小的片段(稱為頁框),使分頁大小與頁框大小一致,恰好1個分頁正好佔用實體記憶體的1個頁框。申請者申請若干分頁,分配者分給等量的頁框,縱然有斷裂(fragmentation)產生,至多平均浪費半個頁框空間而已。這就是分頁法的基本想法。如圖3-10所示。
圖3-12列出主記憶體可用頁框的三種資料結構表示法,。三種資料結構中,可用頁框串列最常被使用。MBT記錄的資訊多,在頁面置換時有用。位元示圖用得少。圖3-12列出主記憶體可用頁框的三種資料結構表示法,。三種資料結構中,可用頁框串列最常被使用。MBT記錄的資訊多,在頁面置換時有用。位元示圖用得少。 • 圖3-12 主記憶體可用頁框表的資料結構
圖3-14清楚地說明了這一方法。儲存鍵由記憶體硬體邏輯實現,保護過程是由硬體自動完成的。由於I/O通道存取主記憶體不經過頁表,所以儲存鍵保護對I/O通道是十分有用的。圖3-14清楚地說明了這一方法。儲存鍵由記憶體硬體邏輯實現,保護過程是由硬體自動完成的。由於I/O通道存取主記憶體不經過頁表,所以儲存鍵保護對I/O通道是十分有用的。 • 圖3-14 儲存鍵保護法
分頁法有兩個問題值得研究。 先講第1個問題。每次存取主記憶體都要增加1次存取分頁表的操作,顯然,指令執行的時間會拉長。能在幾個指令週期時間內按分頁號找到對應的實體記憶體頁框號。相關暫存器是硬體對分頁法最有力的支援,其結構如圖3-15所示。設置相關暫存器後存取主記憶體的流程如下:
3.4.4 分段管理 在許多實際系統中,來源程式(Source program)經編譯和載入鏈結所形成的目的模組並不是一維的而是二維的位址,特別是用結構化編程語言寫的程式更是如此。針對這種現實,提出了分段儲存管理的方法。它的直觀圖解如圖3-17。
分段管理是指處理程序執行之前全部分段都裝入主記憶體,每個分段必須分配在主記憶體的一段位址連續的區域內,但各段之間不強求連續主記憶體。由此看來,它是一種以段為單位分配與回收記憶體空間的管理方法。分段管理是指處理程序執行之前全部分段都裝入主記憶體,每個分段必須分配在主記憶體的一段位址連續的區域內,但各段之間不強求連續主記憶體。由此看來,它是一種以段為單位分配與回收記憶體空間的管理方法。 分段管理的實現 實作分段管理需建立如下資料結構: 1.與可變分區管理類似的FBT或FBC,用以記住未分配主記憶體空間的現狀; 2.每個作業1張分段表ST(Segment Table),以記錄該作業各段情況。FBT和FBC已介紹過,下面介紹ST。
ST主要包括:段長、主記憶體始址、存取許可權。許可權通常是R(讀)、W(寫)、E(執行),且互不相斥。段的存取許可權在編譯時形成。顯然,對資料段只能讀或寫,不能執行,而對一個單純程序段(可重入段)能執行、讀,但不能更改。 ST主要包括:段長、主記憶體始址、存取許可權。許可權通常是R(讀)、W(寫)、E(執行),且互不相斥。段的存取許可權在編譯時形成。顯然,對資料段只能讀或寫,不能執行,而對一個單純程序段(可重入段)能執行、讀,但不能更改。 其中k表示作業空間的分段總數,s1,s2,…,sk分別表示各段的段長,p是傳回的指向段表的指標。如果分配不成功則p為零。此cmalloc過程連續地為一作業的各段分配空間,只要有一次不成功便前功盡棄,整個配置失敗。
分段式管理下,分段的共用和分頁式管理下的分頁的共用是相似的。分段式管理下,分段的共用和分頁式管理下的分頁的共用是相似的。 效能研究 (1)由於要存取實際參照到的實體記憶體位址,首先就要存取分段表,即增加了1倍的存取時間,仿分頁管理,在CPU和主記憶體之間設置一個相關暫存器(associative register)來提高存取速度。 (2)分段管理下主記憶體空間的利用率問題。若認為分段管理是可變分區管理的擴展,則只要取得小,幾乎沒有什麼內部斷裂產生,但卻可能有相當數量的外部斷裂,用空占比來衡量主記憶體空間利用率。在動態平衡時,主記憶體的空閒區和已占區(即已存放作業資料的區域)之比稱為空占比。
從已占區的類型入手。隨著主記憶體空間的動態分配,已占區有4種基本類型如圖3-19中A,B,C,D所示。當已占區G釋放後獲得A′,B′,C′,D′。在A′情況下空閒區個數比原來增加了1個,D′則減少了1個,而B′,C′不變。令A,B,C,D情況下已占區個數分別為a,b,c,d,令m,n分別為主記憶體中已占區和空閒區的個數,於是有:從已占區的類型入手。隨著主記憶體空間的動態分配,已占區有4種基本類型如圖3-19中A,B,C,D所示。當已占區G釋放後獲得A′,B′,C′,D′。在A′情況下空閒區個數比原來增加了1個,D′則減少了1個,而B′,C′不變。令A,B,C,D情況下已占區個數分別為a,b,c,d,令m,n分別為主記憶體中已占區和空閒區的個數,於是有:
圖3-19 (a)已占區的4種基本類型 • (b)已占區G釋放後的4種情況
3.5.1 請求頁式管理 請求頁式管理是對分頁管理加以改進。按實際需要載入頁面的做法可避免載入那些在執行中用不著的分頁,比起純粹的分頁管理,無疑節省了主記憶體空間。 圖3-20是需求分頁法下指令的執行過程。對圖3-20有幾點說明。
(1)CPU給出的虛擬位址可能是指令本身的位址,也可能是指令中運算元的位址,按規定虛擬位址被分成頁號和頁內位移兩部分。圖3-21是Windows 95的頁表格式。 圖3-21 Windows 95頁表格式
(2)根據MBT可以回答“主記憶體有可用區塊嗎”。處理程序在執行中產生了分頁錯誤中斷,該處理程序要等待頁面的置入,例如它等待將它的第2個頁面載入到主記憶體第150塊中。在等待期,CPU正在執行其他處理程序。 (2)根據MBT可以回答“主記憶體有可用區塊嗎”。處理程序在執行中產生了分頁錯誤中斷,該處理程序要等待頁面的置入,例如它等待將它的第2個頁面載入到主記憶體第150塊中。在等待期,CPU正在執行其他處理程序。 (3)如圖3-20所示,當分頁錯誤中斷處理完後,要重新啟動被中斷的指令,它的意思是,不管中斷發生在指令的哪一個指令週期中,都要重頭開始執行指令,稱為“指令複執”。 (4)一條指令的執行有可能產生多次分頁錯誤中斷。 (5)從對換區調入所缺頁面或把淘汰的頁面寫回對換區涉及到對換區管理問題。
頁面置換演算法 如圖3-20,替換主記憶體中的1個頁面,目的是空出1個可用區塊以便存放新參照的頁面。替換哪個頁面的首要問題是決定針對整個主記憶體空間範圍內還是只在本處理程序所分配的頁框集中選擇。在需求分頁法中,可選用的頁面置換演算法有下列四種: (1)FIFO(First In First Out )即先進先出演算法。 (2)OPT(OPTimal)即最優置換演算法。 (3)NUR(Not Used Recently)演算法即替換最近一段時間內未參考到的頁面。 (4)LRU(Least Recently Used)演算法被UNIX系統V、Windows 95Windows NT、OS/2所採用。
要為每個頁面設置一特定欄位來記錄自上次存取後到當前(替換時刻)的時間量,所以實現LRU演算法需對各頁面存取的歷史情況時時加以記錄和更新,系統的管理性成本會較大,一般是利用硬體與軟體配合來減少時間成本。下面提供兩個近似實作方法。要為每個頁面設置一特定欄位來記錄自上次存取後到當前(替換時刻)的時間量,所以實現LRU演算法需對各頁面存取的歷史情況時時加以記錄和更新,系統的管理性成本會較大,一般是利用硬體與軟體配合來減少時間成本。下面提供兩個近似實作方法。 1.計時法,即為每頁增設一個計時單元,每當頁被存取時,把系統絕對時間置入計時單元,置換時,比較各頁面的計時單元,選有最小值(最久未使用頁面)的頁面淘汰之。 2.暫存器法,即為每頁設置一個n位的暫存器:R = rn-1 rn-2…r0,當某頁被存取時,便設定相應的rn-1位為1,然後每隔一個時鐘單位,將所有R右移1位。置換時,比較各暫存器值(無符號整數)的大小,值最小的頁面作為被替換的頁面。該方法比記時法的資訊含量多。例如:暫存器中值1的個數表示最近該頁被存取的頻率,頻率高低反映頁面在歷史上的“盛衰”,供LRU置換作進一步參考。
性能研究 (1)M與的關係 一般說來,M(分給處理程序空間的實體記憶體頁框數)越大,(分頁錯誤率)越小。 (2)分頁的大小(Page Size)與的關係 較大的分頁,則頁面存取的命中率高,就小,較小的分頁,則大。 (3)與主記憶體有效存取時間的關係 主記憶體有效存取時間EAT(effective access time)是存取主記憶體所需時間的平均值。 (4)翻轉(thrashing)與工作集模式(working-set model)
如果處理程序花在頁面置入/置出上的時間多於實際的執行時間,稱為系統發生了翻轉。僅在本處理程序空間發生的翻轉稱局部翻轉。導致處理程序處於翻轉狀態的原因可能是所佔實體記憶體頁框數不足、置換演算法不良或頁面存取序列異常。如果處理程序花在頁面置入/置出上的時間多於實際的執行時間,稱為系統發生了翻轉。僅在本處理程序空間發生的翻轉稱局部翻轉。導致處理程序處於翻轉狀態的原因可能是所佔實體記憶體頁框數不足、置換演算法不良或頁面存取序列異常。 圖3-23 工作集
對換區(Swapping)管理 被替換的頁面理應“從哪裡來回哪裡去”,但若該分頁內容有被修正過:如果替換頁沒有被修改過,則不必回存至輔助儲存體,因為輔助儲存體中已有其備份版本;如果替換頁已被修改過,則更不能回寫到磁片中它的正本位置上,而應暫時駐留在由若干區塊組成的專用對換區中。
頁面共用 若干處理程序共用某個頁面,只要把該頁面所佔主記憶體區塊編號填入各自的分頁表中即可,如圖 3-24所示。 圖3-24 請求頁式下的頁面共用
實例──UNIX系統V的記憶體管理 UNIX系統V採用請求分頁法記憶體管理。 (1) UNIX系統V的虛擬記憶體 (2)主記憶體空閒塊的管理 處理程序的p0區和p1區要進入主記憶體時,用memalloc(base,size)申請空閒塊。memalloc程式採用改進的位元示圖結構。釋放空間時使用memfree(base,size),其中base指向處理程序頁表始址,size為主記憶體塊數。 (3)把處理程序空間的一部分載入主記憶體 作業系統為選中的作業建立一個作業控制處理程序,此處理程序空間的p0區存放作業的可執行代碼(程式段),而p1區為資料段,兩段的虛擬頁表被全部載入主記憶體的頁表區,但p0區和p1區按該處理程序應佔用的主記憶體載入其一部分頁面,其餘的頁面由頁面置換(分頁錯誤時)演算法負責。
(4)把系統空間載入主記憶體 作業系統初啟時,由初啟程式負責把系統空間和未用空間一併分頁並形成系統頁表,然後把作業系統本身的程式段和資料段(含系統堆疊),連同系統分頁表一併載入主記憶體的低位址部分。系統分頁表的起始位址和長度載入系統分頁表基底位址暫存器SBR和長度暫存器SLR中,如圖3-26所示。 (5)地址轉換 UNIX系統V的位址轉換分兩種情況。第1種是將虛擬記憶體中的系統空間位址轉換到主記憶體的作業系統區;第2種是把虛擬記憶體的處理程序空間位址轉換到主記憶體的使用者區。兩種位址轉換都由硬體自動完成。
圖3-25 虛擬記憶體佈局、位址結構與頁表項格式
3.5.2 請求段頁式管理 請求段頁式管理是把請求段式與請求頁式結合起來的一種記憶體管理方法。它最主要的優點是具備段的動態鏈結功能──在執行過程中進行段的鏈結與裝入。 實現原理 (1) 虛擬位址構成 主記憶體分塊,每塊等長,使用者程式的段分頁,頁面長度與主記憶體塊長相同,因此虛擬位址是二維的實體上分佈在各個頁表中。段內代碼通過頁表邏輯上連續,實體上分散在主記憶體的各個實體塊中。