期末必考地址轉換和自對映大題。
記憶體管理
連結與裝載
ELF中的部分段落:
在ELF頭之外:
注意程式中的區域性變數不在ELF中,在棧上。
儲存管理基礎
儲存硬體:
- SRAM:讀寫速度快,生產成本高,多用於Cache
- DRAM:讀寫速度較慢,生產成本低,多用於主存
- ROM:非易失性
儲存結構:
- 暫存器—記憶體—外存
- 暫存器—快取—記憶體—外存
單道程式&多道程式
單道程式:
- 單道程式環境下,整個記憶體裡只有兩個程式:一個使用者程式和作業系統;作業系統所佔的空間是固定的。
- 因此,可以將使用者程式永遠載入到一個地址,即使用者程式永遠從同一個地方開始執行。
- 靜態地址翻譯:在程式執行之前就計算出所有實體地址。
- 有地址獨立,且有地址保護。
多道程式:
- 分割槽式分配空間:把記憶體分為一些大小相等或不等的分割槽,每個應用程式佔用一個或幾個分割槽。作業系統佔一個分割槽。
- 適合多道程式系統和分時系統,支援多個程式併發執行,但難以進行記憶體分割槽的共享。
- 分割槽分配方法 ↓
固定式分割槽&可變式分割槽
固定(靜態)式分割槽:
- 把記憶體劃分為若干個固定大小的連續分割槽
- 易於實現,但有內碎片
可變(動態)式分割槽:
- 分割槽的邊界看移動,即分割槽的大小可變
- 沒有內碎片,有外碎片。
閒置空間的管理
管理記憶體時OS需要知道記憶體空間有多少空閒,跟蹤方法有:
-
點陣圖表示法
- 給每個分配單元賦予一個二進位制數位,用於記錄該分配單元是否閒置。
- 空間開銷固定,不依賴於記憶體中的程式數量;
- 時間開銷低
- 沒有容錯能力:如果一個分配單元的標誌位為1 ,不能確定是否因錯誤變成1
-
連結串列表示法
- 將分配單元按是否閒置連結起來。
- 空間開銷取決於記憶體中的程式數量
- 時間開銷高
- 有一定容錯能力:連結串列中有被佔空間和閒置空間的表項,可以相互驗證。
記憶體管理演算法
-
首次適應演算法
每個空閒區按其在儲存空間中地址遞增的順序連在一起,在為作業分配儲存區域時,從這個空閒區域鏈的始端開始查詢,選擇第一個滿足請求的空白塊。
-
下次適應演算法
把空閒區構成一個迴圈連結串列,每次查詢時從上次查詢結束的地方開始,找一個滿足請求的空白塊。
-
最佳適應演算法
分配時總是選擇大小最接近於作業所要求的儲存區域。
-
最壞適應演算法
總是選擇最大的空閒區,效率略高於最佳適應演算法。
上述均為基於順序搜尋的動態分割槽分配演算法,一般只適合於較小的系統。
大中型系統採用了基於索引搜尋的動態分割槽分配演算法。
-
快速適應演算法
-
夥伴系統(Linux使用)
- 從一個大分割槽分裂而來的兩個分割槽稱為一對夥伴;
- 每次分配空閒分割槽的大小必為2的冪次;
- 某一塊被釋放時,只和它原先的夥伴塊進行合併;如果兩個儲存塊大小相同、地址也相鄰,但不是同一個大塊分裂出來的,就不會被合併。
系統中的碎片
記憶體中無法被利用的儲存空間被稱為碎片。
-
內部碎片:指分配給作業的儲存空間中未被利用的部分。(已分配未利用)
-
外部碎片:系統中無法利用的空閒分割槽。是造成記憶體系統效能下降的主要原因,可以被整理後清除。
-
緊湊技術:消除外部碎片。
-
透過移動作業,把多個分散的小分割槽拼接成一個大分割槽。
-
緊湊時機:找不到足夠大的空閒分割槽,且總空閒分割槽容量可以滿足作業要求時。
-
實現支撐:動態重定位,作業在記憶體中的位置發生變化時,對其地址加以修改。
動態重定位指硬體在每次記憶體訪問時動態實現邏輯地址到實體地址的轉化(需要額外的硬體支援);
靜態重定位則是在程序裝入時,一次完成所有地址的轉化(不需要額外的硬體支援);
-
分割槽分配
- 可重定位分割槽分配
- 多重分割槽分配
覆蓋與交換
在多道程式環境下用來擴充記憶體的兩種方法,可以解決在小的記憶體空間執行大作業的問題。
-
覆蓋:把一個程式劃分為一系列功能相對獨立的程式段,讓執行時不要求同時裝入記憶體的程式段組成一組(稱為覆蓋段),共享主存的同一個區域。
程式段先儲存在磁碟上,當有關程式段的前一部分執行結束,把後續程式段調入記憶體,覆蓋前面的程式段。
缺點:對使用者不透明,增加使用者負擔
不透明:可見的,需要關心的
透明:不可見的,不需要關心的
-
交換:把暫時不用的某些程式及資料部分或全部從主存移到輔存中去;接著把指定程式或資料從輔存中讀到相應的主存中,讓其在系統上執行。
缺點:增加處理機開銷。
-
兩者的區別:
-
覆蓋可以減少一個程式執行所需的空間。交換可讓整個程式暫存於外存中,讓出記憶體空間。
-
覆蓋是由程式設計師實現的,作業系統根據程式設計師提供的覆蓋結構來完成程式段之間的覆蓋;
交換技術不要求程式設計師給出程式段之間的覆蓋結構。
-
覆蓋技術主要對同一個作業或程式進行;交換主要在作業和程式之間進行。
-
頁式記憶體管理
基本思想:把一個邏輯地址連續的程式分散存放到若干不連續的記憶體區域內,並保證程式的正確執行;
這樣既可以充分利用記憶體空間,又可減少移動帶來的開銷。
屬於固定式分割槽。
純分頁系統
不具備頁面對換功能,不支援虛擬儲存器功能。
又稱基本分頁儲存管理方式。
在排程一個作業時,必須把它的所有頁一次裝到主存的頁框裡;如果頁框數不足則必須等待。
優點:
- 沒有外碎片,每個內碎片不超過頁大小
- 程式不必連續存放
- 便於改變程式佔用空間的大小
缺點:
- 程式全部裝入記憶體;有內碎片。
基本概念
-
頁面:把每個作業的地址空間分成一些大小相等的片,稱之為頁面(Page)或頁,各頁從0開始編號。
虛擬地址分頁→頁面/頁
-
頁框:實體地址分片,與頁面大小相同,這些片稱為儲存塊,或稱頁框,同樣從0開始編號。
實體地址分頁→頁框/儲存塊
-
頁表:使頁面對應到頁框,每個程序一張;每一頁在頁表中都對應有一個頁表項。頁表項中儲存頁框號、標記位、髒位、訪問保護等。
-
頁面大小計算:略,同計組計算。
-
地址變換——頁表查詢
將“頁表始地址”與“頁號和頁表項長度的乘積”相加,得到該頁表項在頁表中的位置;於是可從頁表項中得到該頁的物理塊號,將之裝入實體地址暫存器中。
-
MMU:地址翻譯器。
二級頁表
當邏輯地址空間很大時,劃分的頁比較多,頁表很大,佔用的儲存空間大;所以有了多級頁表。
二級頁表將頁表再分頁,離散地將各個頁表頁面存放在不同的物理塊中,同時建立一張外部頁表(頁表的頁表)用以記錄頁表頁面對應的物理塊號。
正在執行的程序,必須把外部頁表調入記憶體,同時動態匯入內部頁表。只將當前所需的一些內部頁表裝入記憶體,其餘部分再根據需要陸續調入。
二級頁表大小最優情況:二級頁表的頁表項能正好填滿一個頁面
每次調入一個內部頁表時,其大小應該正好是一個頁框大小=頁面大小=8位元組;
頁表項1位元組,頁面大小8位元組→一個頁面(頁框)儲存8個頁表項;
內部頁表的頁號:2^3,3位
外部頁表的頁號:6-3=3位
一級頁表:外部
二級頁表:內部
虛擬頁號位數=內部頁表頁號位數+外部頁表頁號位數
最佳情況:內部頁表大小=頁面大小,
→內部頁表儲存的頁表項 = 頁面大小/頁表項大小
內部頁表頁號位數=\(log_2\)內部頁表儲存的頁表項
快表TLB
頁表機制帶來的嚴重問題:記憶體訪問效率的嚴重下降。
有效記憶體訪問時間(一級頁表)
=TLB命中率*訪問TLB時間+(1-TLB命中率)*(訪問TLB時間+訪問記憶體時間)+訪問記憶體時間(訪問所需位元組)
雜湊頁表
即雜湊頁表。
常用於處理超過32位地址空間。
根據虛擬頁號的雜湊值來訪問頁表。雜湊頁表的每一表項都包括一個連結串列的元素,這些元素雜湊成同一位置(要處理碰撞)。
每個元素包括:虛擬頁號、所對映的頁框號、指向連結串列中下一個元素的指標。
反置頁表
一般的頁表是根據程序的邏輯頁號來組織的;
反置頁表則依據該程序在記憶體中的頁框號來組織(按頁框號排列)。
表項內容:邏輯頁號P和隸屬程序識別符號pid。
原來:根據邏輯頁號找到對應的頁框號
反置頁表查詢流程:用程序識別符號和頁號去檢索反置頁表。
反置頁表的大小隻與實體記憶體的大小相關,與邏輯空間大小和程序數無關。
採用反置頁表的系統很難共享記憶體,因為每個物理幀只對應一個虛擬頁條目。
段式記憶體管理
基本原理
方便程式設計:通常一個作業是由多個程式段和資料段組成的,使用者一般按邏輯關係對作業分段,並能根據名字來訪問程式段和資料段。
資訊共享:共享是以資訊的邏輯單位為基礎的。頁是儲存資訊的物理單位,段是資訊的邏輯地址。要求:程式碼是可重入的。
可重入程式碼
又稱為純程式碼,指多次併發呼叫時能安全執行的程式碼。
要求:不能使用全域性/靜態變數;程式碼不能修改程式碼本身;不能呼叫其他不可重入程式碼。
一個段可以定義為一組邏輯資訊,每個資訊的地址空間是由一些分段組成的,每段由段號,且都是一段連續的地址空間。
地址變換
段表:
-
段表記錄了段與記憶體位置的對應關係
-
段表儲存在記憶體中。
-
段表的基址和長度由段表暫存器給出
|段表始址|段表長度|
-
訪問一個位元組的資料/指令需要訪問記憶體兩次:段表一次,記憶體一次。
-
邏輯地址由段和段內地址組成。
|段號|段內地址|
地址變換過程:
- 邏輯地址段號與段表長度比較:
- 段號>段表長(段表項個數),越界中斷
- 未越界,則根據段表始址和該段段號,計算出該段對應段表項的位置,再從段表項中讀取該段在記憶體中的始址。
- 檢查段內地址d,是否超過該段段長SL
- 超過則越界中斷
- 未超過則將該段基址與段內地址相加,獲得要訪問的記憶體實體地址。
分段管理的優缺點
優點:
- 易於實現段的共享和段的保護
- 更好支援動態的記憶體需求
缺點:
- 處理機要為地址變換花費時間;要為段表提供附加的儲存空間。
- 為滿足分段的動態增長和減少外碎片,要採用記憶體緊湊 的技術手段。
- 在輔存中管理不定長度的分段比較困難(交換)。
- 分段的最大尺寸受到主存可用空間的限制。
分頁與分段的比較
-
分頁作業的地址空間是一維的線性地址空間;
分段作業的地址空間是二維的。
頁式儲存的虛擬地址是連續的,在獲取地址時只需要虛擬地址就能自動分割出頁號和頁內偏移量;
但段式儲存的虛擬地址不是連續的,需要給出段號,再給出段內偏移。
-
頁是資訊的物理單位,大小固定
段是資訊的邏輯單位,長度不定
-
分頁是系統對於主存的管理
分段是使用者可見的,可以在程式設計時確定,也可以在編譯時劃分。
段頁式管理
基本思想:用分段方法來分配和管理虛擬儲存器,同時用分頁方法來分配和管理實儲存器。
-
先把使用者程式分成若干段,賦段名;
-
再把每個段分成若干個頁
-
地址結構:
| 段號S | 段內頁號P | 頁內地址W |
-
系統中設段表和頁表:每個程序一張段表,每個段一張頁表。讀一次指令或資料需要訪問記憶體三次。
-
段表含段號、頁表始址、頁表長度;
頁表含頁號、頁框號。
地址對映:
-
比較段號和段表長(段表項個數),若段號大則產生越界中斷。
-
段表始址+段號,獲得該段表項在段表中位置。
段表中的“段”=段表項。
-
比較 段內頁號 和 該段的頁表長度,若頁號大則產生越界中斷。
-
利用頁表始址與頁號獲得該頁表項在頁表中的位置。
-
取出該頁的物理塊號,與頁內地址拼接得實體地址。
虛擬記憶體管理
區域性性原理
-
空間區域性性:
當前指令和鄰近的幾條指令,當前訪問的資料和鄰近的資料集中在較小區域內。(比如陣列操作)
-
時間區域性性:
一條指令的一次執行和下次執行,一個資料的一次訪問和下次訪問都集中在一段較短時間內。(比如程式中的迴圈結構)
虛擬儲存的特徵
- 離散性:實體記憶體分配的不連續,虛擬地址空間使用的不連續
- 多次性:作業被分成多次調入記憶體,所以虛擬儲存器具備了邏輯上擴大記憶體的功能,是虛擬儲存器最重要的特徵。
- 對換性:允許在作業執行過程中進行換進、換出。
- 虛擬性:允許程式從邏輯的角度訪問儲存器,而不考慮實體記憶體上可用的空間容量。
虛擬性以多次性和對換性為基礎,而多次性和對換性以離散性為基礎。
代價:犧牲了CPU處理時間以及內外存交換時間。
限制:虛擬記憶體的最大容量主要由計算機的地址結構決定。
請求分頁式管理
請求分段式管理類似。
基本概念
- 在分頁系統的基礎上,增加 了請求調頁功能、頁面置換功能所形成的頁式虛擬儲存系統。
- 允許只裝入若干頁的使用者程式和資料,就能啟動執行,以後在硬體支援下透過調頁功能和置換頁功能,陸續將要執行的頁面調入記憶體。
- 交換分割槽:一段連續的、按頁劃分的,並且對使用者不可見的磁碟空間。功能是在實體記憶體不夠的情況下,作業系統先把記憶體中暫時不用的資料,存到硬碟的交換空間,騰出實體記憶體來讓別的程式執行。
常用排程策略
-
按需調頁(請求式調頁)
當且僅當需要某頁時,才將其調入記憶體;
需要使用外存,儲存不在記憶體中的頁
磁碟IO啟動頻率高,系統開銷大
-
預調頁
當程序開始時,所有頁都在磁碟上,每個頁都要透過缺頁異常來調入記憶體;
實際中可以給每個程序維護一個當前工作集合中的頁的列表。
如果程式執行的區域性性差,則反而會降低系統的效率。
缺頁錯誤的處理機制
-
現場保護:陷入核心態,儲存必要的資訊
-
頁面定位:查詢出發生缺頁中斷的虛擬頁面
-
許可權檢查:檢查虛擬地址的有效性和安全保護位;如果發生保護錯誤,則殺死該程序。
-
新頁面調入1:查詢一個空閒的頁框(物理頁),如果沒有空閒的則需要透過頁面置換演算法找到一個需要換出的頁框。
-
舊頁面寫回:如果透過頁面置換演算法找到的內容被修改了,則需要將修改的內容儲存在磁碟上。
-
新頁面調入2:頁框乾淨後,作業系統將保持在磁碟上的頁面內容複製到該頁框中。
-
更新頁表:磁碟中頁面內容全部裝入頁框後,向CPU傳送一箇中斷,作業系統更新記憶體中的頁表項,更新頁表中的頁框號,並將頁框標記為正常狀態。
-
恢復現場:恢復缺頁中斷髮生前的狀態,將程式指標重新指向引起缺頁中斷的指令。
-
繼續執行:重新執行引發缺頁中斷的指令,進行儲存訪問。
替換問題
-
最優置換OPT:替換之後不會再用的,如果沒有則替換最久之後使用的。實際不存在,常用於比較性研究,衡量其他頁置換演算法的效果。
-
先進先出FIFO:沒有實現區域性性,可能出現Belady異常現象。
-
Belady異常:在使用FIFO演算法時,隨著分配的頁框增多,缺頁率反而提高。
-
改進的FIFO:
-
-
最近最少使用LRU:選擇最近一段時間最久不用的頁面淘汰。
-
軟體實現方法:連結串列法
設定一個連結串列,連結串列節點儲存當前使用的頁面的頁號;
每次訪問記憶體,根據相應的頁面號查詢連結串列,如果找到則把相應的節點移到連結串列頭部;沒有找到則建立一個新的節點,插入連結串列頭部;
連結串列尾部就是最近最少使用的頁面,即淘汰的目標
-
硬體實現方法:計數器
設定指令計數器,每個頁面在被訪問時讀取計數器並記錄數值;最後淘汰計數值最小的頁面。
-
-
工作集演算法
更新問題
目標:保持主存和輔存的一致性。
在虛擬儲存系統中,主存作為輔存的快取記憶體,儲存了磁碟資訊的副本。
- 若換出的頁面是file backed型別,且未被修改,則直接 丟棄,因為磁碟上儲存有相同的副本。
- 若換出頁面是file backed的型別,但已被修改,則直 接寫回原有位置。
- 若換出頁面是anonymous型別,若是第一次換出或已被 修改,則寫入swap區;若非第一次換出且未被修改,則 丟棄。
工作集與駐留集
- 程序的工作集:當前正在使用的頁面的集合
- 程序的駐留集:虛擬儲存系統中,每個程序駐留在記憶體的頁面集合,或程序分到的物理頁框集合。
抖動問題
- 隨著駐留記憶體的程序數量增加,即程序併發程度的提高,處理器利用率先上升,後下降。
- 原因是當每個程序的駐留集不斷減小,當駐留集小於工作集後,缺頁率急劇上升,頻繁調頁使得調頁開銷增大。
抖動的消除與預防:
- 區域性置換策略:如果一個程序出現抖動,它不能從另外的程序那裡奪取記憶體塊,從而不會引發其他程序出現抖動。但是並未消除抖動的發生。
- 引入工作集演算法
- 預留部分頁面
- 掛起若干程序
- 負載控制:控制多道程式系統的度,即系統應當保持多少個活動程序駐留在記憶體的問題。
寫時複製技術COW
兩個程序共享一塊實體記憶體,每個頁面都被標誌成寫時複製;
共享的實體記憶體中的每個頁面都是隻讀的;
某個程序想要改變某個頁面時,會在記憶體中複製出一個頁框,然後進行寫操作。
記憶體對映檔案
- 程序透過一個系統呼叫,將一個檔案(或部分)對映到其虛擬地址空間的一部分,訪問這個檔案就像訪問記憶體中的一個大陣列,而不是丟檔案進行讀寫。
- 對映共享的頁面不會實際讀入頁面的內容,而是在訪問頁面時,頁面才會被每次一頁地讀入。
- 解除檔案對映或程序退出時,所有被修改頁面會寫回檔案
- 可以方便地讓多個程序共享一個檔案。
儲存保護
- 界限保護:所有訪問地址必須在上下界之間
- 使用者態與核心態
- 存取控制檢查
- 環保護:不同訪問級別分為不同環,編號越小級別越高。
頁目錄自對映
對於32位二級頁表結構:
-
儲存頁表的4MB地址空間是整個4GB虛擬地址空間中的一部分,OS設計者可規定其所在的位置(4MB對齊)
-
4KB頁目錄實際上是一個特殊的頁表
-
頁表頁實際上也是一個頁面
所以儲存頁目錄和頁表一共只需要4MB,而非4KB+4MB。
一些結論:
一些理解的關鍵點:
“頁表”實際上是由若干頁組成的連續空間。
“頁目錄”也是一個頁表。
頁目錄的首項一定指向頁表的第一張表的起始地址,即頁表基址。
由頁表基址可以算出首張頁表頁在整個地址空間中的頁號=頁表基址/頁面大小。
算出的頁號,必然與指向首張頁表頁的頁表項(即頁目錄首項)在整個頁表空間中的編號相同。
由此可以算出頁目錄首項的位置,即頁目錄基址。
自對映目錄表項同理。
使用頁目錄自對映可以節省4K(虛擬地址)空間。
頁目錄自對映是虛擬地址空間內的對映,與虛擬地址到實體地址的對映無關;表項裡的內容才與實體地址有關!