存儲器管理
存儲器歷來都是計算機系統的重要部分。
存儲器的層次結構
多層結構的存儲系統
- 存儲器的多層結構
對於計算機而言,存儲層次至少分為三層:CPU寄存器、主存、輔存。
還可以根據具體功能細分為:寄存器、高速緩存、主存儲器、磁盤緩存、固定硬盤、可移動存儲介質。
寄存器、高速緩存、主存儲器、磁盤緩存均屬於操作系統存儲管理的管轄范圍,斷電后信息不再存在。低級的固定磁盤和可移動存儲介質則屬於設備管理的管轄范圍,將被長期保存。 - 可執行存儲器
在計算機系統的存儲層次中,寄存器和主存器又被稱為可執行存儲器。進程可以在很少的時鍾周期內使用一條load或store指令對可執行存儲器進程訪問。但是對輔存的訪問則要通過I/O設備實現。
對於不同層次的存儲介質,由操作系統進行統一管理、回收以及提供在存儲層次間數據移動的管理機制。
主存儲器與寄存器
- 主存儲器
主存儲器簡稱主存或內存,是計算機系統的主要部件,用於保護進程運行時的程序和數據,也稱為可執行存儲器。
- 寄存器
寄存器具有與處理機相同的速度,故對寄存器的訪問速度最快。
高速緩存和磁盤緩存
- 高速緩存
高速緩存是現代計算機結構的一個重要部件,它是介於寄存器和存儲器之間的存儲器。為了緩和內存和處理機速度之間的矛盾。
- 磁盤緩存
為了緩和磁盤的I/O與主存的速度不匹配。磁盤緩存並不是實際存在的存儲器,而是利用主存中的部分存儲空間存放在磁盤讀寫的信息。主存也可以看做是輔存的高速緩存。
程序的裝入和鏈接
用戶程序要在系統中運行,必須現將它裝入內存,然后將其轉變為一個可以執行的程序。
- 編譯
- 鏈接
- 裝入
程序的裝入
- 絕對裝入方式
當計算機系統很小,且僅能運行單道程序時,完全有可能知道程序將駐留在內存的什么位置。此時可以采用絕對裝入方 式。
程序中所使用的絕對地址既可在編譯或匯編時給出,也可由程序員直接賦予。 - 可重定位裝入方式
可適合多道程序環境,但並不允許程序運行時在內存中移動位置。
重定位裝入程序將裝入模塊裝入內存后,會使得裝入模塊中所有邏輯地址與實際裝入內存的物理地址不同。
在裝入時對目標程序中指令和數據地址的修改過程成為重定位(靜態重定位)。 - 動態運行時的裝入方式
一個進程被多次換出又被多次換入,應采用動態運行方式。
程序的鏈接
源程序經過編譯后,可得到一組目標模塊。鏈接程序的功能是將這組目標模塊以及它們所需要的庫函數裝配成一個完整的裝入模塊。在對目標模塊進行鏈接時,根據進行鏈接的時間不同,可以把鏈接分為以下三類:
- 靜態鏈接
- 裝入時動態鏈接
- 運行時動態鏈接
連續分配存儲管理方式
為了將用戶程序裝入內存,必須為它提供一定大小的內存空間。連續分配方式可分為四類:單一連續分配、固定連續分配、動態分區分配、動態可重定位分區分配
單一連續分配
在單道程序中,當時的存儲器管理的方式是把內存分為用戶區和系統區兩個部分,系統區僅對OS使用,它通常放在內存的低址部分。
固定分區分配
- 划分分區方法
- 分區大小相等:缺乏靈活性
- 分區大小不等:增加存儲器分配的靈活性
- 內存分配
將分區按其大小進程排隊,為之建立一張分區使用表,各表項包括了每個分區的起始地址,大小及狀態,由內存分配表依據用戶程序的大小檢索該表。若未找到大小足夠的分區,則拒絕為該用戶程序分配內存。
動態分區分配
動態分區分配又稱為可變分區分配,依據進程的實際需要,動態地位置分配內存空間。涉及到分區分配中所用的數據結構、分區分配算法和分區的分配與回收操作三個方面的問題。
- 動態分區分配中的數據結構
為了實現動態分區分配,必須配置相應的數據結構用於描述空閑分區和已分配分區的情況,為分配提供依據。常用的數據結構有兩種形式:①空閑分區表,②空閑分區鏈
- 動態分區分配算法
為把一個新作業裝入內存,須按照一定的分配算法,從空閑分區表或空閑分區鏈中選出一分區分配給該作業。
- 分區分配操作
主要操作為:分配內存和回收內存
- 分配內存
- 回收內存
基於順序搜索的動態分區分配算法
- 首次適應算法(FF)
FF算法要求空閑分區鏈以地址遞增的次序鏈接。
- 循環首次適應算法(NF)
為了避免地址部分留下許多很小的空閑分區,不再每次都從鏈首開始查找,而是從上次找到的空閑分區的下一個空閑分區開始查找,知道找到一個能滿足要求的空閑分區。
- 最佳適應算法(BF)
總是把能滿足要求、又最小的空閑分區分配給作業,避免“大材小用”。
- 最壞適應算法(WF)
總是挑選一個最大的空閑區,以至於存儲器中缺乏大的空閑區。
基於索引搜索的動態分區的分配算法
基於順序搜索的動態分區分配算法比較適用於不太大的系統。
- 快速適應算法
該算法又稱為分類搜索法,將空閑分區根據容量大小進行分類,相同容量的所有空閑分區單獨設立一個空閑分區鏈表。
第一步確定進程的長度,從索引表中尋找能容納它的最小空閑區鏈表;第二步是從鏈表中取下第一塊進行分配即可。優點是查找效率高。 - 伙伴系統
該算法規定,武林已分配區間或空閑分區,大小均為2的k次冪的形式。
時間性能比快速適應算法叉,但是采用了索引搜索算法,比孫旭搜索算法好。 - 哈希算法
哈希算法就是利用哈希快速查找的優點,建立哈希函數,構造一張以空閑分區大小為關鍵字的哈希表。
動態可重定位分區分配
- 緊湊
連續分配方式的一個重要特點是,一個系統或用戶程序必須被裝入一個連續的內存空間中。
- 動態重定位
訪問內存地址是相對地址與重定位寄存器中的地址相加形成的。
- 動態重定位分區分配算法
動態重定位分區分配算法與動態分區分配算法基本相同,差別在於:這種分配算法中,增加了“緊湊”功能。
對換
對換技術也稱為交換技術,最早用於麻省理工學院的分時系統中。
對換程序環境下的對換技術
- 對換的引入
在多道程序環境下,一方面在內存中的某些進程由於某事件尚未發生而被阻塞運行,但卻占用了大量空間,甚至有時可能出現在內存中所有進程都被阻塞而無可運行程序;另一方面又有許多作業駐留在外存因內存不足一直駐留在外存上。這是一種資源浪費。
“對換”是指把內存中暫存不能運行的進程或者暫時不用的程序和數據換出到外存上,以便騰出足夠的內存空間,再把以具備條件的進程或進程所需的程序換入內存。
對換是改善內存利用率的有效措施,可以直接提高處理機的利用率和系統的吞吐量。
- 對換的類型
- 整體對換:處理機的中級調度實際上就是存儲器的對換功能。以整個進程為單位的,稱之為“進城對換”或“整體對換”。
- 頁面對換:以一個進程的“頁面”或“分段”為單位進行的。目的:支持虛擬存儲系統。
對換空間的管理
- 對換空間管理的主要目標
具有對換功能的OS中,通常把磁盤文件分為文件區和對換區
- 對文件系統的主要目標
文件區占用磁盤空間很大部分,是用於存放各類文件。對文件區空間的管理采取離散分離分配方式。
- 對空間管理的主要目標
對換空間只占用磁盤空間的小部分,用於存放內存換出的進程。對對換區空間的管理采用連續分配方式,較少考慮外存的碎片問題。
- 對文件系統的主要目標
- 對換區空閑盤塊管理中的數據結構
空閑分區表和空閑分區鏈。空閑分區表包含兩項:對換區的首址及大小,分別用盤塊號和盤塊數代替表示。
- 對換空間的分配與回收
對換空間算法的分配與回收與動態分區方式時的內存分配與回收方法雷同。
進程的換出與換入
- 程序的換出
- 選擇被換出的進程
選擇處於阻塞狀態或睡眠狀態的進程,選擇優先級最低的作為換出進程。
- 進程換出的過程
先申請對換空間,若申請成功,就啟動磁盤,將該進程的程序和數據傳送到磁盤的對換區上。
- 選擇被換出的進程
- 程序的換入
對換進程將定時執行換入操作,首先查看PCB集合中所有進程的狀態,從中找出“就緒”狀態但已換出的進程。
分頁存儲管理方式
根據離散分配時所分配的地址空間和基本單位的不同,可將離散分配分為以下三種:
- 分頁存儲方式
- 分段存儲方式
- 段頁式存儲管理方式
分頁存儲器管理的基本方法
- 頁面和物理塊
- 頁面
分頁存儲管理將進程的邏輯地址分為若干個頁,並未各頁加以編號。
- 頁面大小
減小頁面有利於內存利用率的提高,但會導致頁表過長,占用大量內存。頁面過大會使頁內隨便增大。
- 頁面
- 地址結構
邏輯地址為A,頁面大小為L,頁號P和頁內地址d可按下式求得:
P=INT[\frac{A}{L}],d=[A] mod LP=INT[LA],d=[A]modL - 頁表
在分頁系統中,允許將多個頁面離散地存儲在內存的任一物理塊中,為保證進程仍然能正確運行,即能在內存中,找到每個頁面所對應的物理塊,系統由為每個進程建立了一張頁面映像表,簡稱頁表。
地址變換機構
該機制的任務是實現從邏輯地址到物理地址的轉換。頁面映射表的作用就是用於實現從頁號到物理號的變化,因此地址變換的任務是借助於頁表實現的。
- 基本地址的變換機構
- 具有快表的地址變換機構
訪問內存的有效時間
從進程發出制定邏輯地址的有效訪問,經過地址變換,到內存中找到相應的實際物理地址單元並取出數據,所需要花費的總時間,成為內存的有效時間。
假設訪問一次內存時間為t;在基本分頁存儲管理方式中,有效訪問時間為:
EAT=t+t=2t;
快表分頁中為:EAT=a×λ+(t+λ)(1-a)+t=2t+λ-t×a=2t+λ-t×a。
上述中,a表示命中率,λ表示快速命中所需要的時間,t表示一次訪存需要時間。
兩級和多級分頁
現代大多數計算機都支持非常大的邏輯空間,這樣的環境下,頁表就變得非常大,要占用相當大的內存空間,故每個進程僅僅頁表就要占用1MB的空間問題,而且要求連續。這樣是不顯示的。我們采用兩種方法解決這個問題:①對於頁表所需要的空間可采用離散分配方式;②只將當前需要的部分頁表項調入內存,其余的頁表扔駐留在磁盤上,需要時再調入。
- 二級頁表
為離散分配的頁表在建立一張頁表,成為外層頁表。
- 多級頁表
對於32位機器,采用兩級頁表結構是合適的,但對於64位機器,就不合適了。
反置定頁表
- 反置表的引入
一般頁表的頁選項是按頁號進行排序的,頁表項中的內容是物理編號,而反置表則是為每一個物理塊設置一個頁表項。
- 地址變換
在反置表進行地址變換時,是根據進程識別符和頁號,去檢索反置頁表。
分段存儲管理方式
引入分段存儲的目的是為了滿足用戶(程序員)在編程和使用上多方面的要求。
分段存儲管理方式的引入
- 方便編程
通常,用戶把自己的作業按照邏輯關系分為若干段,每個段都從0開始編址,並有自己的名字和長度。因此程序員們都迫切地需要訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的。
- 信息共享
實現程序和數據的共享時,是以信息的邏輯單位為基礎的。
- 信息保護
信息保護是以信息的邏輯單位為基礎的,而且經常是以一個過程、函數或文件為基本單位進行保護的。
- 動態增長
一些段,尤其是數據段,由於數據量的不斷增加,而使數據段動態增長,相應地它所需要的存儲空間也會動態增加。 - 動態鏈接
為了提高內存的利用率,系統只將真正要運行的目標程序裝入內存,動態鏈接在作業運行之前,並不是把所有的目標程序段都鏈接起來。
分段系統的基本原理
- 分段
作業的地址空間被划分為若干個段,每個段都定義了一組邏輯信息。
- 段表
分段式存儲管理系統中,程序為每個段分配一個連續的分區。
段表是用於實現邏輯段到物理內存區的映射的。 - 地址變換機構
- 分頁和分段的主要區別
相似支出:而且都采用離散分配方式,以消除內存的外零頭,提高內存利用率。
不同:
1. 頁是信息的物理單位。
2. 頁的大小固定是由系統決定的
3. 分頁的用戶程序地址空間是一維的。
信息共享
分段系統的一個突出有點,是易於實現段的共享。
- 分段系統中對程序和數據的共享
- 分段系統中程序和數據的共享
段頁式存儲管理方式
分頁系統以頁面為內存分配的基本單位,能有效提高內存利用率。而以內存為基本單位,能夠更好地滿足用戶多方面的需求。段頁式存儲管理方式具有:便與實現、分段可共享、易於保護、可動態鏈接等一系列優點,很好地解決內存外部碎片問題。
- 基本原理
段頁系統的基本原理是分段和分頁原理的結合,現將用戶程序分為若干個階段,再把每個段分為若干個頁。段頁式系統中,其地址結構由段號、段內頁號及頁內地址三部分組成。
段頁系統中,實現了從邏輯地址到物理地址的變換,系統需要同時配置段表和頁表。
- 地址變換過程
段頁式系統中,為了獲得一條指令和數據,需要三次防存,第一次找段表,第二次找頁表,第三次才是真正地址。
習題
-
為什么要配置層次式結構存儲器
設置多個存儲器可以使存儲器兩端的硬件能並行工作;采用多級存儲系統,特別是cache技術,是減輕存儲器對帶寬對系統性能影響的最佳結構方案;在微處理機內部設置各種緩沖存儲器,減輕對存儲器的壓力,增加CPU中寄存器數量,大大環節對存儲器壓力。
-
可采用哪幾種方式將程序裝入內存?它們分別適用於何種場合?
(1)絕對裝入方式,只適用於單道程序環境。 (2)可重定位裝入方式,適用於多道程序環境。 (3)動態運行時裝入方式,用於多道環境。
-
什么是基於順序搜索的動態分區分配算法?它分為哪幾種?
(1)首次適應算法(FF):FF要求空閑分區鏈以地址遞增的順序鏈接,從鏈首開始查找,直至找到第一個滿足要求的分區,然后按照作業的大小,從該分區中划出一片內存空間。若從鏈首到鏈尾都找不到一個空閑分區,則分配失敗。 (2)循環首次適應算法(NF):為避免低址部分留下許多小的空閑分區,以及減少查找可用空閑分區的開銷,NF在查找時不再每次都從鏈首開始,而是從上一次找到的空閑分區的下一個空閑分區開始。為實現此算法,應該設置一起始查找指針,用於指示下一次起始查找的位置。該算法能使內存中的空閑分區分布的更加均勻,從而減少了查找空閑分區的開銷,但這樣會缺乏大的空閑分區。 (3)最佳適應算法(BF):所謂最佳是指,每次分配內存時,總是把能滿足要求,又是最小的空閑分區分配給作業。為加速查找,該算法要求將空閑分區按從小到大的順序排列。孤立的看,最佳適應算法似乎是最佳的,然而宏觀上卻不一定。因為每次分配后所切割下來的剩余部分總是最小的,這樣會在存儲器中留下許多難以利用的碎片。 (4)最壞適應算法(WF):與BF算法相比,其策略正好相反,在掃描整個空閑分區時,總是挑選一個最大的空閑分區,從中切割一塊空間分配給作業,這樣可避免小碎片的產生。
-
在采用首次適應算法回收內存時,可能出現哪幾種情況?應怎樣處理這幾種情況?
(1)回收區前鄰空閑區。將會收區與前臨空閑區合並。 (2)回收區后鄰空閑區。 (3)回收區前后鄰均空閑區。 (4)回收區前后鄰均不空閑區。
-
什么是基於索引搜索的動態分區分配算法?它可分為那幾種?
基於順序搜索的動態分區分配算法,比較適用於不太大的系統。當系統很大時,系統中的內存分區可能會很多,相應的空閑分區鏈就可能很長,這時采用順序搜索分區的方法可能會很慢。為了提高搜索空閑分區的速度,在大、中型系統中旺旺會采用基於索引搜索的動態分區分配算法。它分為三種:快速適應算法,伙伴系統,哈希算法。
-
令Buddy_k(x)的大小為2^k、地址為x的塊的伙伴系統地址,試寫出Buddy_k(x)的通用表達式。Buddyk(x)的大小為2k、地址為x的塊的伙伴系統地址,試寫出Buddyk(x)的通用表達式。
f(x)= \begin{cases} x+2^k& \text{x mod $2^{k+1}=0$}\\ x-2^k& \text{x mod $2^{k+1}=2^k$} \end{cases}f(x)={x+2kx−2kx mod 2k+1=0x mod 2k+1=2k
-
為什么要引入對換?對換分為哪幾種類型?
由於當時計算機的內存都非常小,為了使該系統能分時運行每個用戶程序引入了對換技術。根據每次對換時所對換的數量,分為:整體對換、分段對換。
-
為了實現對換,系統用具備那幾個方面的內容?
1. 對對換空間的管理 2. 進程的換出 3. 進程的換入
-
基於離散分配時所用的基本單位不同,可將離散分配分為哪幾種?
1. 分頁存儲管理方式 2. 分段存儲管理方式 3. 段頁式存儲管理方式
-
什么是頁表?頁表的作用是什么?
在分頁系統中,允許將多個頁面離散地存儲在內存的任一物理塊中,為保證進程仍然能正確運行,即能在內存中,找到每個頁面所對應的物理塊,系統由為每個進程建立了一張頁面映像表,簡稱頁表。