1. 程式人生 > >作業系統——第四章筆記(三)

作業系統——第四章筆記(三)

分頁儲存管理方式
儲存管理的離散分配方式
1.基本分頁儲存管理
與連續分配方式比較
 作業邏輯地址空間有M大,就需要向記憶體申請一個M大的連續區域。
 分頁的目的是更細粒度的處理空間,減少粗放管理的浪費或開銷問題。
離散分配記憶體:
 作業規定大小劃分成小份;記憶體也按同樣大小劃分成小份
 作業的任一小份可分散放入記憶體任意未使用的小份
分頁方式下,記憶體的使用率高,浪費少。但不是絕對沒有碎片(程序的最後一頁不總是能佔滿一個物理塊)
1.1頁面的概念
記憶體劃分成多個小單元,每個單元K大小,稱(物理)塊。作業也按K單位大小劃分成片,稱為頁面。
 物理劃分塊的大小 = 邏輯劃分的頁的大小
 頁面大小要適中
太大,(最後一頁)內碎片增大,類似連續分配的問題。
太小的話,頁面碎片總空間雖然小,提高了利用率,但每個程序的頁面數量較多,頁表過長,反而又增加了空間使用。
1.2頁表的概念
為了找到被離散分配到記憶體中的作業,記錄每個作業各頁對映到哪個物理塊,形成的頁面對映表,簡稱頁表。
 每個作業有自己的頁表
頁表的作用:頁號到物理塊號的地址對映。
要找到作業 關鍵是找到頁表(PCB) 根據頁表找物理塊
 離散分配過程:
找空:空閒空間管理
放入:裝入與地址對映(形成頁表)
記錄:頁表地址記入pcb
 如何執行一個作業?
連續方式下:PCB記錄記憶體首地址,根據該地址順序取指令執行即可。
離散方式下:1)頁表記錄作業的各頁分別佔用了記憶體的哪些塊。
2)pcb則記錄頁表在記憶體的地址——程序構造時伴隨著構造頁表,該核心資訊也要放在記憶體中供訪問。
1.3地址的處理
1.3.1地址對映(地址計算)的過程?
若要執行某作業的一條指令,其相對地址是24B (設10B一頁,頁表如右表),其實體地址到底是多少呢?
 分析其所在的頁和偏移得:2號頁(頁號從0開始) ,偏移4B處是該條指令。
 查頁表找頁面對應的塊(2號頁儲存在6號物理塊)。
 找物理塊6,向下偏移4B,找到要執行的指令。取出執行即可。
 計算上就是求商(頁號)及取餘(偏移量)的過程。
1.3.2規律
 作業相對地址在分頁下不同位置的數有一定的意義結構:
頁號+頁內地址(即頁內偏移)
 關鍵的計算是:根據系統頁面大小找到不同意義二進位制位的分界線。
 從地址中分析出頁號後,地址對映只需要把頁號改為對應物理塊號,偏移不變,即可找到記憶體中實際位置。
 注意:一作業所有指令在使用者地址空間是順序編址
例題:
1.設一分頁系統,頁面大小為8B(設8條指令)一個大小為 32B 的作業分配記憶體,若作業頁表如右表所示,任意取一使用者程式指令,如第1011個指令,如何知道放在記憶體的哪裡?

首先,根據頁面大小為8B得出偏移量佔3位,則第一位為頁號(邏輯地址組成:頁號+頁內地址(偏移量))
其次,查詢頁表,得出1號頁面對應的物理塊號為7號,則塊號為111,塊內地址=頁內地址=011
最後,得出記憶體地址為111011

2.頁面大小為4K的系統,一個32K的作業地址結構如何?
頁面數量=32k/4k=8,即頁號佔3位
頁面大小=4k,即頁面大小佔12位
共佔15位

3.使用者地址1000 0000 0010如何找到頁號?
(1)若頁面大小為1K,頁內地址10位
(2)一個4K大小的作業,邏輯地址共12位
即2位頁號,10位頁內地址
10 0000000010
若為32位定址(邏輯地址一共有32位)的邏輯地址結構:
則 頁號22位,頁內大小10位

4.某系統採用頁式儲存管理方式,實體記憶體空間1M,頁面大小2K,若邏輯空間32頁,計算:
(1)邏輯地址格式
(2)不考慮許可權等問題,程序的頁表有多少項(即頁表記錄條數)?每項多少位?
(3)物11理空間減一半,頁表有什麼變化?
解:
(1)
實體記憶體空間1M:實體地址共20位
頁面大小2k:頁面大小佔11位
物理塊號:20-11=9位
邏輯空間32頁:頁號佔5位
(2)程序的頁表有32項(邏輯空間頁數),每項9位(物理塊號位數)
(3)物理空間減一半,實體地址總數變為19位,頁面大小不變,則塊號減少一位為8位。

計算口訣:
(1)頁面大小決定偏移量(頁內地址)的位數 n;
(2)作業大小/頁面大小=頁表長度=頁面數量
(3)記憶體容量決定塊數,塊數決定編址位數,即頁表項位數 b。
1.4地址變換機構
1.4.1圍繞頁表進行工作,那麼頁表資料放在哪?
 暫存器。一個程序有n個頁,頁表就需要記錄n項資料,需要n個暫存器。不現實。
 記憶體。只設置一個頁表暫存器PTR(page table register)記錄頁表在記憶體中的首地址和頁表長度,執行時快速定位頁表。
1.4.2地址變換過程
分頁系統中,程序建立,放入記憶體,構建頁表,在PCB中記錄頁表存放在記憶體的首地址及頁表長度。
 執行某程序A時,將A程序PCB中的頁表資訊寫入PTR中;
 每執行一條指令時,根據分頁計算原理,得到指令頁號X和內部偏移量Y;
 CPU高速訪問PTR找到頁表在哪裡;
為防止錯誤檢索,增加預先的判斷:
1)計算得到的頁號是否大於頁表長度(即頁表項數)。
2)一個5頁的程序,頁面編號0-4,若地址計算出的頁號不在該範圍,一定產生了越界錯誤。
 查頁表資料,得到X實際對應存放的物理塊,完成地址對映計算,最終在記憶體找到該指令。
1.4.3訪問記憶體的有效時間
程序發出邏輯地址的訪問請求,經過地址變換,到記憶體中找到對應的實際實體地址單元並取出資料,所需花費的總時間,稱為記憶體的有效訪問時間EAT(effective access time)
 設訪問一次記憶體時間為t,則基本分頁機制下EAT=2t,為什麼?
1)CPU操作一條指令需訪問記憶體兩次:
2)訪問記憶體中的頁表(以計算指令所在的實際實體地址)
3)訪問指令記憶體地址
1.5引入快表——針對訪問速度問題
1)問題:基本分頁機制下,一次指令需兩次記憶體訪問,處理機速度降低1/2,分頁空間效率的提高以如此的速度為代價,得不償失。
2)改進:減少第1步訪問記憶體的時間。增設一個具有“並行查詢”能力的高速緩衝暫存器,稱為“快表”,也稱“聯想暫存器”(Associative memory),IBM系統稱為TLB(Translation Look aside Buffer)。
1.5.1快表放什麼?:正在執行程序的頁表的資料項。
1.5.2引入快表後的記憶體訪問時間如何?
1)快表的暫存器單元數量是有限的,不能裝下一個程序的所有頁表項。雖不能完全避免兩次訪問記憶體,但如果命中率a高還是能大幅度提高速度。
2)設一次查詢訪問快表時間為t’,則 EAT= at’+(1-a)(t’+t)+ t= 2t +t’-t

a
3)能在快表中找到就在快表中做,找不到按以前的方式做。
1.6兩級、多級頁表,反置頁表——針對大頁表佔用記憶體問題
1.6.1頁表大小的討論
程序分頁離散存放,但頁表的資料是連續在存放記憶體的。而頁表可能很大:現代作業系統支援非常大的邏輯地址空間的程序。如32位系統,可編址的最大程式碼數為232,若頁面大小為4KB(4210),則支援的最大程序頁表項數可達碼232/212=220,有1M個,每個頁表項佔1B(位元組),則頁表大小就有1MB。
1.6.2兩級頁表
 將頁表分頁,並離散地將頁表的各個頁面分別存放在不同的物理塊中
 為離散分配的頁表再建立一張頁表,稱為“外層頁表”,其每個表項記錄了頁表頁面所在的物理塊號。
 外表存頁表塊號,頁表寸作業塊號。
頁面大小=頁表項大小×個數
 頁表分頁原理:將頁表也按4K大小分頁(212)
頁表被分頁後,頁表的一個外頁4K,外頁偏移量需10位。
1.6.3多級頁表
64位作業系統下,兩級仍然不足以解決頁表過大問題時,可按同樣道理繼續分頁下去形成多級頁表。
1.6.4反置頁表
每個程序一張頁表 一張OS 反置頁表 + 每程序一張外部頁表
 反置頁表(Inverted Page Tale):站在物理塊的角度,記錄佔用它的已調入記憶體的程序標識和頁號。系統中只需一張該表即可。一個64MB記憶體,若頁面大小4KB(64M/4K=2^16=16K個物理塊),反置頁表佔用64KB(16K
4B)
 程序外部頁表(External Page Table):每個程序一張,記錄程序不在記憶體中的那些頁面所在的外存物理位置。
 如何提高檢索反置頁錶速度:記憶體容量大時,反置頁表的頁表項還是會很大,利用程序識別符號和頁號去檢索一張大的線性表很費時,可利用hash演算法提高檢索速度。
2.基本分段儲存管理
2.1從提高記憶體利用率角度:
固定分割槽 à 動態分割槽à 分頁
2.2從滿足並方便使用者(程式設計師)和使用上的要求角度:
 分段儲存管理:作業分成若干段,各段可離散放入記憶體,段內仍連續存放。
 方便程式設計:如彙編中通過段:偏移確定資料位置
 資訊共享:同地位的資料放在一塊方便進行共享設定
 資訊保護
 動態增長:動態增長的資料段事先固定記憶體不方便
 動態連結:往往也是以邏輯的段為單位更方便
2.3分段系統的基本原理
程式通過分段(segmentation)劃分為多個模組,每個段定義一組邏輯資訊。如程式碼段(主程式段main,子程式段X)、資料段D、棧段S等。
 誰決定一個程式分幾段,每段多大?
編譯程式(基於原始碼)
 段的特點
1)每段有自己的名字(一般用段號做名),都從0編址,可分別編寫和編譯。裝入記憶體時,每段賦予各段一個段號。
2)每段佔據一塊連續的記憶體。(即有離散的分段,又有連續的記憶體使用)。
2.3.1地址結構:段號 + 段內地址
2.3.2段表:記錄每段實際存放的實體地址
2.4段表與地址變換機構
段是連續存放在記憶體中。段表中針對每個“段編號”記錄:“記憶體首地址”和“段長”
 同樣有兩次記憶體訪問問題
解決方法:1)設定聯想暫存器,用於儲存最近常用的段表項。
2)各段大小不等。
2.5分頁和分段的主要區別
1)需求:分頁是出於系統管理的需要,是一種資訊的物理劃分單位,分段是出於使用者應用的需要,是一種邏輯單位,通常包含一組意義相對完整的資訊。
 一條指令或一個運算元可能會跨越兩個頁的分界處,而不會跨越兩個段的分界處。
2)大小:頁大小是系統固定的,而段大小則通常不固定。分段沒有內碎片,但連續存放段產生外碎片,可以通過記憶體緊縮來消除。相對而言分頁空間利用率高。
3)邏輯地址:
 分頁是一維的,各個模組在連結時必須組織成同一個地址空間;
 分段是二維的,各個模組在連結時可以每個段組織成一個地址空間。
4)其他:通常段比頁大,因而段表比頁表短,可以縮短查詢時間,提高訪問速度。分段模式下,還可針對不同型別採取不同的保護;按段為單位來進行共享
2.6資訊共享
分段系統的突出優點:
 易於實現共享
1)在分段系統中,實現共享十分容易,只需在每個程序的段表中為共享程式設定一個段表項。
2)比較課本圖。對同樣的共享內容的管理上,很明顯分段的空間管理更簡單。分頁的圖涉及太多的頁面劃分和地址記錄的管理。
 易於實現保護:
1)程式碼的保護和其邏輯意義有關,分頁的機械式劃分不容易實現。
3.段頁式儲存管理
3.1基本原理
 將使用者程式分成若干段,併為每個段賦予一個段名。
 把每個段分成若干頁
 地址結構包括段號、段內頁號和頁內地址三部分
3.2地址變換過程
 三次訪問記憶體
 可藉助高速緩衝彌補不足
現階段分配方式的不足:
基本分頁/分段方式都是程序全部裝入記憶體的方式。記憶體空間使用上仍有侷限。
虛擬儲存管理:請求式分頁/分段