操作系統--存儲管理的任務
存儲管理的任務
存儲管理一共有三個存儲管理任務:
--存儲分配
--地址映射
--存儲保護
--存儲共享
--存儲擴充
存儲分配:
-
分配基本內存空間
-
增加新的內存空間
-
回收內存空間
邏輯地址:表示相對地址,在外存中。
物理地址:絕對地址,標識內存中的每一個存儲單元,在內存中
地址映射:
程序裝入內存之後,由操作系統將邏輯地址改為邏輯地址+起始地址,得到的實際的物理地址。
映射的種類:
動態映射:在編譯時候,對他進行映射。
靜態映射:在程序裝入內存時,一次性完成地址轉換。(有專門的地址管理部件來進行地址的計算)
存儲保護:
防止地址越界,防止操作越權。
存儲共享:
為了進程通訊和節約內存空間,兩個或者多個進程共用內存中相同的分區。為了節約存儲空間。
存儲擴充:
采用軟件手段,在硬件的配合下,將部分外存空間虛擬為內存空間,並將內存和外存有機的結合起來,得到一個容量相當與外存,速度接近於內存,價格十分便宜的虛擬存儲系統。
上面我們簡單介紹了操作系統中存儲器的使用功能。現在我們來對上面的這些功能處理中遇到的問題來做一些詳細的介紹:
內存劃分與分配技術
靜態劃分:
劃分預先進行的,創建新進程的時候,在內存中找到一個合適的分區分配給他們。一旦劃分完畢,分區大小和數目將不再改變。靜態劃分分為分區和分頁兩個方式。
動態劃分:
創建新進程時,根據進程申請的空間大小,依照某種方式(下面的四個算法)在這個分區中動態的劃分一部分空間。
動態劃分涉及到一些動態劃分的算法:
首次適應算法:
從一個內存的某一端開始查找,選擇一個超過進程申請大小的空閑分區。如果找到的分區的大小恰好與申請的進程的存儲空間的大小相同或者相差的很少的話,這個時候,我們就將這個分區全部分配給這個申請進程。否則,系統將這個分區劃分為兩個分區,一個分區的長度等於進程申請的空間大小,並將其分配給申請進程。然後,將另一個子分區鏈接到空閑分區鏈表中。
下次適應算法:
下次適應算法能記住上次分配分區的位置,下次實施分配時,從上次的分配位置之後開始查找,選擇一個大小足夠的空閑分區。
最佳適應算法:
最差適應算法:
夥伴系統:
就是將系統中的空間,不斷二分。
註:在合並的時候,只有夥伴(剛剛之前拆分的存儲空間),才可以合並。
程序裝入技術
可執行程序的裝入步驟:
程序裝入
絕對裝入:程序運行之前,按照程序的邏輯地址,將程序和數據裝入內存指定的地方。(和絕對地址對應)
重定位裝入:允許程序裝入與邏輯地址不同的物理內存空間。即程序可以裝入到內存的任何位置,其邏輯地址與裝入內存後的物理地址無關。
運動時動態裝入:程序的地址轉換不是在裝入時進行,而是在程序運行時動態運行。通過重定位寄存器內的起始物理地址和指令或者數據的邏輯地址逐條計算出物理地址。(和相對地址對應,需要重定位寄存器(硬件支持))
程序鏈接
靜態鏈接:
靜態鏈接效果圖: 動態鏈接:動態鏈接可以分為裝入時動態鏈接和運行時動態鏈接。
一、裝入時動態鏈接(Load-Time Dynamic linking):是在目標模塊裝入內存時,邊裝入邊鏈接。即在裝入一個目標模塊時,若發現一個外部模塊調用,即引起裝入程序去找出相應的外部模塊,並將它裝入內存以及修改目標模塊中的相對地址。 二、運行時動態鏈接(Run-Time Dynamic linking): 這種鏈接方式,可將某些目標模塊的鏈接,推遲到執行時才進行。即在執行過程中,若發現一個被調用模塊尚未裝入內存時,由OS去找到該模塊,將它裝入內存,並把它鏈接到調用者模塊上。
簡單存儲管理技術
為了實現的簡單,操作系統必須要將待執行的程序全部裝入內存。
連續存儲:
需要內存中的一塊連續的足夠大得分區。
非連續存儲:
允許進程的程序和數據分別裝在內存的不同分區中。
非連續存儲的存儲方法:
簡單分頁存儲管理:
頁框:系統事先將物理內存劃分成許多尺寸相等的頁框,並將進程劃分成許多大小相同的頁面,頁面與頁框大小相等。
頁面:裝入內存時進程被分割成許多個頁面,每一個頁面的指令和數據是連續的,他們的地址相對於其所屬頁的第一條語句的地址,稱為頁內偏移量。就是說進程邏輯地址被分為兩個部分:頁號和頁內偏移量。
頁表:系統為每一個進程建立一張頁面映射表。用於記載進程中的各個頁面到物理內存中頁框的映射信息。
頁表寄存器:頁表基地址寄存器用來指向頁表的起始地址;頁表長度寄存器用來指示頁表的大小,即對於當前任務,它總共包含有多少個頁面。
下面是一個頁面存儲管理的地址轉換過程
(文字描述)
(圖片描述)
簡單分段存儲管理:
段的概念:基於模塊化的程序設計時,常常需要將一個大任務劃分為若幹相對獨立的子任務,對應的子任務編寫子程序,稱為段。就是說一個段,就是一個大程序中的子程序。
處理:當一個進程被裝入物理內存時,系統將為該進程的每一段獨立的分配一個分區。同一個進程中的多段不必存放在連續的多個分區中。
段表:每一個進程建立一個,用於描述進程的分段情況,記載進程的各個段的物理內存中分區的映射情況。(其中包括段號,段長,段基址以及對本段的存取控制權限等信息)
段的操作:
簡單段頁式儲存管理(上面兩種技術的組合):
概述:采用分段方法組織用戶程序,采用分頁方法分配和管理內存。
邏輯地址:
數據結構:
地址變換過程:
虛擬存儲管理技術
虛擬存儲:通過系統提供缺頁/段中斷功能和交換技術,動態裝入進程的程序代碼和數據,使得一個打得用戶程序能在一個相對較小的內存空間中運行,也使得有限的內存能同時容量更多的進程。
虛擬存儲的地址轉換方式:
虛擬存儲管理的方式:
虛擬存儲分頁系統:
虛擬存儲分段系統:
虛擬存儲段頁式系統:
虛擬存儲系統的軟件策略:
-
駐留集管理:虛擬存儲系統中,每個進程駐留在內存的頁面集合,或進程分到的物理頁框集合。
-
頁面放置策略:系統應當在內存的什麽位置為活躍進程分配頁框。可以考慮首次適應算法,下次適應算法,最佳適應算法,最差適應算法等等。
-
頁面獲取策略:系統需要何時把一個頁面裝入內存
-
頁面置換策略:當發生缺頁中斷且無足夠內存空間時,需要置換已有的某些(個)頁面。
-
頁面置換算法:最佳置換算法,最近最少使用算法,先進先出算法,時鐘算法。(與上面的頁面置換策略相結合,是頁面置換策略中的一部分。)
-
頁面清除策略:將由頁面置換算法選擇的被修改的置換頁面保存到外存。如果是未修改的頁面,則不保存到外存,也不需要保存到外存。
駐留集管理中有固定分配策略和可變分配策略:
可變分配策略:
當進程的缺頁率和高的時候,駐留集太小,需要增加頁框;當缺頁率一段時間內都保持很低時,可以在不會明顯增加進程缺頁錄的前提下,回收其中一部分頁框,減小進程的駐留集。
固定分配策略:
為每一個進程分配固定數量的頁框。即在每一個活躍的駐留集尺寸在運行期間固定不變。
頁面獲取策略有下面兩種:
請求調頁方式:僅當進程執行過程中,通過檢查頁表發現相應頁面不在內存中,才裝入改頁面。
預調頁方式:當進程創建時,預先為進程裝入多個頁面。
頁面置換策略有下面兩種方式:
局部置換策略:系統在進程自身的駐留集中判斷當前時候存在空閑頁框,並在其中進行置換。
全局置換策略:?在整個內存空間內判斷有無空閑頁框,並允許從其他進程的駐留集中選擇一個頁面換出內存。
頁面置換策略中的頁面置換算法:
最佳置換算法:被置換的頁面是將來不在訪問,或者在最遠的將來才會被訪問的頁面。(這個算法無法實現)?
最近最少使用算法:根據頁面裝入內存以後的使用情況,選擇淘汰最近最久未使用的一個頁面,置換這個頁面。
先進先出置換算法:淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。在實現時,只需把一個進程已調入內存的頁面,按照先後次序鏈接成一個隊列,並設置一個指針,使它總是指向最老的頁面。
時鐘算法:
時鐘置換算法圖解:
時鐘置換算法的實際例子:
(星號表示U為1,沒有表示U為0)頁面清除策略
主要用到一種頁緩沖技術。
操作系統--存儲管理的任務