1. 虛擬存儲器的基本概念
分析常規存儲器管理不足的原因:
1)常規存儲器管理方式的特征
????一次性:作業在運行前一次性地全部裝入內存
????駐留性:作業裝入內存后,便一直駐留在內存中,直至作業運行結束。
????????一次性及駐留性在程序運行時是否是必須的?
????????????NO。程序運行有局部性。
2)局部性原理
????1968年,Denning.P提出
????程序在執行時將呈現出局部性規律:
????????在一較短的時間內
????????程序的執行僅局限于某個部分;
????????相應地,所訪問的存儲空間也局限于某個區域。
程序執行的特點:
????多數情況下仍是順序執行。
????少部分的轉移和過程調用指令會使程序執行由一部分區域轉至另一部分區域(但研究表明調用深度多數情況下不超過5)
????許多由少數指令構成的循環結構會多次執行。
????對許多數據結構的處理(如數組)往往局限于很小的范圍內。
所有上述情況都表現出程序執行的局部性:
????時間局部性(temporal locality)
????????被引用過一次的存儲器位置很可能在不遠的將來再被多次引用。
????空間局部性(spatial locality)
????????如果一個存儲器位置被引用了一次,那么程序很可能在不遠的將來引用附近的一個存儲器位置。
關于局部性的討論
????有良好局部性的程序運行速度更快;
????計算機系統的各個層次都利用了局部性:
????????Cache;
????????主存:緩存磁盤文件系統最近使用的磁盤塊;
????????Web瀏覽器將最近被引用的文檔放在本地磁盤上;
????????Web服務器將最近被請求的文檔放在前端磁盤高速緩存中。
????重復引用同一個變量的程序有良好的時間局部性;
????對于使用數組等數據結構的程序,a[1],a[2]……數據的使用可看做具有步長k=1的引用模式,步長越小,空間局部性越好;數組按行訪問和按列訪問其局部性不同。
????對于取指令來說,循環有好的時間和空間局部性;
????循環體越小,循環迭代次數越多,局部性越好。
基于局部性原理
????程序運行前,不需全部裝入內存(打破一次性)
????????僅裝入當前要運行的部分頁面或段即可運行,其余部分暫留在外存上。
????????缺頁/段的情況:要訪問的頁(段) 尚未調入內存。程序應利用OS所提供的請求調頁(段)功能,將它們調入內存,使程序繼續執行。
????調入需要的頁/段時,如果內存已滿,無法再裝入新頁(段),通過置換功能將內存中暫時不用的頁(段)調至外存,騰出足夠的內存空間。(不總駐留)
交換技術與虛存使用的調入調出技術有何相同和不同之處?
主要相同點是都要在內存與外存之間交換信息;
主要區別在于交換技術換出換進一般是整個進程(proc結構和共享正文段除外),因此一個進程的大小受物理存儲器的限制;
而虛存中使用的調入調出技術在內存與外存之間來回傳遞的是存儲頁或存儲段,而不是整個進程,從而使得進程映射具有了更大的靈活性,且允許進程的大小比可用的物理存儲空間大的多 。
總之:
????為了用小的內存實現在大的虛空間中程序的運行目的
????基于局部性原理
????虛擬存儲器管理——由操作系統提供一個比實際內存大的,假想的特大存儲器。
3)虛擬存儲器的定義
所謂“虛擬存儲器”,是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。
虛擬存儲管理下
????內存邏輯容量由內存容量和外存容量之和所決定
????運行速度接近于內存速度
????每位的成本卻接近于外存。
4)虛擬存儲器的實現
虛擬存儲管理:
允許將一個作業分多次調入內存。
????若采用連續分配方式,需申請足夠空間,再分多次裝入,造成內存資源浪費,并不能從邏輯上擴大內存容量。
????虛擬的實現建立在離散分配存儲管理基礎上
????????方式:請求分頁/請求分段系統
????????細節:分頁/段機構、中斷機構、地址變換機構、軟件支持
5)虛擬存儲器的特征
離散分配方式是基礎
????多次性:一個作業被分成多次調入內存運行
????對換性:允許在作業的運行過程中進行換進、換出。(進程整體對換不算虛擬)
????最終體現虛擬性:能夠從邏輯上擴充內存容量,使用戶所看到的內存容量遠大于實際內存容量。
2. 請求分頁存儲管理方式
????基本分頁 + “請求調頁”和“頁面置換”功能。
????換入和換出基本單位都是長度固定的頁面
1)硬件支持
一臺具有一定容量的內/外存的計算機+ 頁表機制+ 缺頁中斷機構+ 地址轉換機構
①頁表基本功能不變:邏輯地址映射為物理地址
增加虛擬功能后需記錄的頁表項信息有變化:
(1) 狀態位P :指示該頁是否已調入內存。
(2) 訪問字段A :用于記錄本頁在一段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問。(置換時考量的參數)
(3) 修改位M :該頁在調入內存后是否被修改過。(關系到置換時調出的具體操作)
(4) 外存地址:用于指出該頁在外存上的地址。
②缺頁中斷機構
每當要訪問的頁面不在內存時,便產生一缺頁中斷通知OS,OS則將所缺之頁調入內存。作為中斷,需經歷幾個步驟:
????“保護CPU環境”
????“分析中斷原因”
????“轉入缺頁中斷處理程序”
????“恢復CPU環境”等。
作為一種特殊中斷,與一般中斷有明顯區別:
????(1) 在指令執行期間產生和處理中斷信號。
????(2) 一條指令在執行期間,可能產生多次缺頁中斷。
Copy A to B可能產生6次缺頁中斷。
系統應能記錄每次中斷的狀態。
③地址變換機構
分頁系統地址變換機構的基礎上增加
產生和處理缺頁中斷(請求調入)
從內存中換出一頁的功能(置換)
2)內存分配
作業不一次裝入,部分裝入的情況下如何為進程分配內存,涉及三個問題:
? ? ①最小物理塊數的確定
????????少于此數量進程將不能運行
????????與計算機的硬件結構有關,取決于指令的格式、功能和尋址方式
? ? ②物理塊的分配策略
????????考慮:固定OR可變分配、全局OR局部置換。
????????組合出三種適合的策略。
????????????固定分配、局部置換
????????????????為每個進程分配一定數目的物理塊,在整個運行期間不再改變(基于進程的類型,或根據程序員、程序管理員的建議)
????????????????運行中缺頁時,只能從該進程內存中n個頁面中選出一頁換出,然后再調入一頁。
????????困難:難以把握為每個進程分配“適量”物理塊數
可變分配、全局置換
先為每個進程分配一定數目的物理塊
OS管理一個空閑物理塊隊列,發生缺頁時,系統從隊列中取出一塊分配給該進程,將欲調入的頁裝入(動態增長型,全局空閑空間都可分配使用)
空閑空間不足時,可與其他任何進程頁面置換。“會使其他進程缺頁率提高,影響運行”
最易實現
可變分配、局部置換
為每個進程分配一定數目的物理塊
缺頁時,只允許換出該進程在內存的頁面,不影響其他進程執行。
根據缺頁率增減進程的物理塊數:若頻繁缺頁中斷,則系統再為進程分配若干物理快;若缺頁率特別低,則適當減少分配給該進程的物理塊。
③物理塊的分配算法
固定分配策略時,分配物理塊可采用以下幾種算法:
????平均分配算法
????????將所有可供分配的物理塊平均分配給各進程。
????????缺點:未考慮各進程本身的大小,利用率不均。
????按比例分配算法
????????根據進程的大小按比例分配物理塊。
????????設系統中共有n個進程
則,每個進程能分到的物理塊數:
Si:進程i頁面數為; S:n個進程頁面數總和; m:可用物理塊總數?
????考慮優先權的分配算法
? ?? 實際應用中,要照顧重要、急迫的作業盡快完成,為它分配較多的內存空間。
所有可用物理塊分兩部分:
????????一部分按比例分配給各進程;
????????另一部分根據各進程優先權,適當地為其增加份額,分配給各進程。
3)調頁策略
① 何時調入頁面
1.預調頁策略
????以預測為基礎,將預計不久后便會被訪問的若干頁面,預先調入內存。
????優點:一次調入若干頁,效率較好
????缺點:預測不一定準確,預調入的頁面可能根本不被執行到。主要用于進程的首次調入,由程序員指出應該先調入哪些頁。
2.請求調頁策略
????運行中需要的頁面不在內存,便立即提出請求,由OS將其調入內存。
????優點:由請求調頁策略所確定調入的頁,一定會被訪問;比較容易實現。
????缺點:每次僅調入一頁,需花費較大的系統開銷,增加了磁盤I/O的啟動頻率。
② 從何處調入頁面
????在請求分頁系統中的外存分為:
????對換區:連續存放數據,讀寫速度較快
????文件區:離散分配方式,I/O速度相對慢
發生缺頁時,系統應從何處將缺頁調入內存,分成三種情況:
????系統擁有足夠的對換區空間:進程運行前所有頁面由文件區拷貝到對換區;運行需要的頁面全部從對換區調入內存,提高調頁速度。
????系統缺少足夠的對換區空間:不會被修改的部分,在文件區操作(即:直接從文件區調入,換出時不用寫入文件,再調入時仍從文件區調入)可能被修改的部分,在對換區操作。
UNIX方式:(隨運行數據逐漸從文件區轉到對換區)未運行的頁面從文件區調入;曾經運行,但又被換出的頁面放在對換區,下次調入應從對換區調入。進程請求的共享頁面可能已被其他進程調入,無需再從對換區調入。
③ 頁面調入過程
????程序運行前需要裝入內存:上述的②步策略處理何處調入;
????開始運行:先預調入一部分頁面;
????運行中:需要的頁面不在內存時,
????????向CPU發出一缺頁中斷,“中斷處理程序”開始工作:
????????首先保留CPU環境
????????分析中斷原因后,轉入缺頁中斷處理程序。
????????處理:判斷是否置換、頁表信息更新
????????恢復現場,重新操作頁面。
3.頁面置換算法
????進程運行過程中,訪問的頁面不在內存,調入時內存已無空閑空間,需要將內存中的一頁程序或數據調到外存。
頁面置換算法(page replacement algorithms):選擇換出哪些頁面的算法,其好壞直接影響系統的性能。
????應具有較低的缺頁率:
1)最佳(Optimal)置換算法
????Belady,1966年提出的一種理論上的算法
????????換出以后永不再用的,或在最長(未來)時間內不再被訪問的頁面。
優點:保證獲得最低的缺頁率
不足:無法實現,因為無法預知一進程將來的運行情況
作用:作為參照標準,評價其他算法。
例1:假設一個作業,運行中依次使用的頁面情況如下,分配給該進程的內存物理塊只有3個,按最佳置換算法,內存中的頁面如何變化,缺頁率是多少?
2)先進先出置換算法(FIFO)
????先進入的先淘汰,即選擇內存中駐留時間最久的頁面予以淘汰。
????????優點:實現簡單,把一進程已調入內存的頁面按先后次序組織成一個隊列,并設置一個指針(替換指針),使它總是指向隊首最老的頁面。
????????不足:與進程實際運行規律不相適應(較早調入的頁往往是經常被訪問的頁,頻繁被對換造成運行性能降低)
對例1用FIFO算法計算:
系統用隊列對先進先出的頁面次序進行記錄
隊列最長等于分配的物理塊數
始終置換隊首的最老頁面
Belady 現象
Belady現象:出現分配的頁面數增多,缺頁率反而提高的異常現象。
描述:一個進程P要訪問M個頁,OS分配N個內存頁面給進程P;對一個訪問序列S,發生缺頁次數為PE(S,N)。當N增大時,PE(S, N)時而增大,時而減小。
Belady現象的原因:FIFO算法的置換特征與進程訪問內存的動態特征矛盾,即被置換的頁面并不是進程不會訪問的。
3)最近最久未使用(LRU)置換算法
無法預測將來的使用情況,只能利用“最近的過去”作為“最近的將來”的近似,因此,LRU置換算法選擇最近最久未使用(least recently used)的頁面予以淘汰。
對例1用LRU算法計算:
不足:
有時頁面過去和未來的走向之間并無必然的聯系。
相應的需較多的硬件支持:記錄每個頁面自上次被訪問以來所經歷的時間t,淘汰時選擇頁面t值最大的;以及需要快速地知道哪一頁是最近最久未使用的頁面,用寄存器或棧。
①寄存器記錄時間的原理
????一進程有8個頁面,每個頁面需配備一個8位的(移位)寄存器。
????移位寄存器表示為
? ? ? ? ? ? R=Rn-1Rn-2Rn-3…R2R1R0
????頁面被訪問后的操作:
????????將該頁對應的寄存器的Rn-1位置為1
????如何記時:
????????由系統發出定時信號,每隔一定時間將所有寄存器右移1位。
????????某一時刻,比較各寄存器的值,被用到的標志1逐漸往低位上積累,若高位上沒有1,就說明最近沒用過。所以最近最久未使用的就是寄存器值最小的那個頁。
②棧記錄時間的原理
某頁面被訪問,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此:棧頂始終是最新被訪問頁面的編號,越久未使用,頁面越被壓在棧底。
練習:某程序在內存中分配三個頁面,初始為空,頁面走向為4,3,2,1,4,3,5,4,3,2,1,5。
試分別利用OPT、FIFO及LRU算法計算缺頁次數。
4)輪轉算法(clock)?又稱最近未使用算法(NRU, Not Recently Used)
????LRU(最近最久未使用算法)近似算法
????????折衷FIFO
????每個頁設一個使用標志位(use bit),若該頁被訪問則將其置為1。
????設置一個指針,從當前指針位置開始按地址先后檢查各頁,尋找use bit=0的頁面作為被置換頁。
????若指針經過的頁use bit=1,修改use bit=0(暫不凋出,給被用過的頁面駐留的機會 ),指針繼續向下。到所有頁面末尾后再返回隊首檢查。
時鐘算法示例
說明:
增加了一個使用位
當一頁首次加載入內存時,該位為1,當該頁被訪問時,使用位也置1
當需要進行頁替換時
第一個使用位為0的幀被替換,指針指向緩沖區的下一幀
循環掃描,遇到使用位為1的,變成0
改進CLOCK
改進:主要考慮對沒訪問過的頁面再細分是否修改過的不同情況,減少因修改造成的頻繁I/O操作。
每頁除記錄是否用過A,還記錄是否修改的標志M。置換時根據兩個標志的值有4種不同情況的處理。
算法性能比較
5)其他置換算法
? ? ①最少使用 (LFU, Least Frequently Used)
????????關鍵在次數記錄上
????????每頁設置訪問計數器,每當頁面被訪問時,該頁面的訪問計數器加1;缺頁中斷時,淘汰計數值最小的頁面,并將所有計數清零;
????????計數的實現類似LRU,用移位寄存器,但比較時不是簡單比較寄存器的值,而是比較寄存器每位的和∑Ri。
????????LRU與LFU
????????1000101
????????0001111
????????????LFU置換次數少的。程序局部性會導致一個頁面在一段時間內使用次數很多。但使用次數多并不能說明將來被用到的可能性大
????????????而LRU置換最近最久未用的,對未來的預計一般會更好些。
????????所有,LRU相對得到較好的應用。
? ? ②頁面緩沖算法PBA(page buffering algorithm)
????????對FIFO算法的發展,彌補了FIFO可能造成的I/O開銷,又不需要LRU等算法的硬件支持。
????????????仍用FIFO算法選擇被置換頁
????????????但并不將其馬上換入外存。
????????????系統將頁面放入兩個鏈表之一:如果頁面未被修改,就將其歸入到空閑頁面鏈表的末尾;否則將其歸入到已修改頁面鏈表。
????????????需要調入新的物理頁面時,將新頁面內容讀入到空閑頁面鏈表的第一項所指的頁面,然后將第一項刪除(從空閑鏈表摘下)。
????????????空閑頁面和已修改頁面,仍停留在內存中一段時間,如果這些頁面被再次訪問,只需較小開銷,而被訪問的頁面可以返還作為進程的內存頁。
????????????當已修改頁面達到一定數目后,再將它們一起調出到外存,然后將它們歸入空閑頁面鏈表,這樣能大大減少I/O操作的次數。
常用防抖動方法:
局部置換策略;
頁面調入內存前檢查各進程工作集,為缺頁率高的增加有限物理塊;
L缺頁間的平均時間=S置換一個頁面所需時間,可使磁盤和cpu達到最大利用率;
抖動發生時選擇暫停一些進程,調節多道程序度。
缺頁率與物理塊數有關聯,基于程序局部性原理,若能預知程序在某段時間要訪問的頁面并全部調入他們,將大大降低缺頁率。
Denning提出工作集概念:
某段時間間隔中,進程實際要訪問的頁面的集合。可以用一個二元函數W(t, ?)來表示, t是當前的執行時刻,? 稱為工作集窗口(working-set window )。
工作集大小的變化
進程開始執行后,隨著訪問新頁面逐步建立較穩定的工作集。
當內存訪問的局部性區域的位置大致穩定時,工作集大小也大致穩定;
局部性區域的位置改變時,工作集快速擴張和收縮過渡到下一個穩定值。
實現工作集模型的困難是怎樣跟蹤工作集的軌跡!
工作集模型的原理:
????操作系統跟蹤每個進程的工作集,并為進程分配大于其工作集的物理塊。
????如果還有空閑物理塊,則可以再調一個進程到內存以增加多道程序數。
????如果所有工作集之和增加以至于超過了可用物理塊的總數,那么操作系統會暫停一個進程,將其頁面調出并且將其物理塊分配給其他進程,防止出現抖動現象。
正確選擇工作集的大小,對存儲器的利用率和系統吞吐量的提嵩,都將產生重要影響。
W(t,△) 表示該進程在過去的△個虛擬時間單位中被訪問到的頁的集合。
駐留集
駐留(常駐)集是指在當前時刻,進程實際駐留在內存當中的頁面集合。
工作集是進程在運行過程中固有的性質,而駐留集取決于系統分配給進程的物理頁面數目,以及所采用的頁面置換算法;
如果一個進程的整個工作集都在內存當中,即駐留集 ? 工作集,那么進程將很順利地運行,而不會造成太多的缺頁中斷(直到工作集發生劇烈變動,從而過渡到另一個狀態);
當駐留集達到某個數目之后,再給它分配更多的物理頁面,缺頁率也不會明顯下降。
4.請求分段存儲管理方式
在請求分段系統中,程序運行之前,只需先調入若干個分段(不必調入所有的分段),便可啟動運行。當所訪問的段不在內存中時,可請求OS將所缺的段調入內存。
1)請求分段中的硬件支持
①段表機制
(1)存取方式 :用于標識本分段的存取屬性。R,R/W,W
(2)訪問字段A:用于記錄本段被訪問的頻繁程度。
(3)修改位M:表示該段在調入內存后是否被修改過。
(4)存在狀態位P:指示該段是否已調入內存。
(5)增補位 :特有字段,表示該段運行中是否做過動態增長
(6)外存地址:用于指出該段在外存上的起始地址(盤塊號)。
②缺段中斷機構
發現運行進程所訪問段尚未調入內存
????由缺段中斷機構產生一缺段中斷信號
????進入OS,由缺段中斷處理程序將所需的段調入內存。
????缺段中斷同樣在一條指令的執行期間產生和處理中斷,一條指令執行可能產生多次缺段中斷。但不會出現一條指令被分割在兩個分段中或一組信息被分割在兩個分段中的情況。
③ 地址變換機構
基于分段系統地址變換機構的基礎
????段調入內存
????修改段表
????再利用段表進行地址變換。
????總之:就是增加了缺段中斷的請求及處理等功能。
2)分段的共享和保護
分段在邏輯意義上劃分,實現共享和保護都較方便。以下討論具體實現:
①實現共享:共享段表
在內存中配置一張共享段表,每個共享段都占有一表項,記錄如下內容:
共享計數count:
????共享段為多個進程所需要,當某進程不再需要它而釋放它時,系統并不回收該段所占內存區,僅當所有共享該段的進程全都不再需要它時,才由系統回收該段所占內存區。設置count用于記錄有多少個進程需要共享該分段。
存取控制字段:一個共享段給不同的進程以不同的存取權限。
段號:對一個共享段,不同的進程可用不同的段號。
② 共享段如何分享與回收
共享段的分配
????第一個請求使用該共享段的進程A:系統為該共享段分配一物理區,再把共享段裝入該區;
????將該區的始址填入A的段表相應項;
????共享段表中增加一表項,填寫有關數據,count置1;
????其他進程B也調用該共享段時,無需再為該段分配內存,只需在B的段表中增加一表項,填寫該共享段的物理地址;在共享段的段表中,填上調用進程的進程名、存取控制等,再執行count:=count+1操作。
共享段的回收
????包括撤消在進程段表中共享段所對應的表項,執行count:=count-1。
????如果count為0,則由系統回收該共享段的物理內存,并取消共享段表中該段所對應的表項。
③ 分段保護
越界檢查
????段表寄存器存放了段表長度;段表中存放了每個段的段長。
????在進行存儲訪問時,將段號與段表長度比較,段內地址與段長比較。
存取控制檢查
????尤其表現在不同進程對共享段的不同使用上。段表每個表項都設置“存取控制”字段,規定該段的訪問方式:只讀,只執行,讀/寫
環保護機構
????規定:低編號的環具有高優先權
遵循的原則:一個程序可以訪問駐留在相同環或較低特權環中的數據。一個程序可以調用駐留????在相同環或較高特權環中的服務