???
存儲管理是操作系統的重要組成部分,它負責計算機系統內存空間的管理。其目的是充分利用內存空間,為多道程序并發執行提供存儲基礎,并盡可能地方便用戶使用。
3.1
存儲管理的目的
???
采用多道程序設計技術,就要在內存中同時存放多道程序,這就要求存儲管理解決以下四個重要問題,以達到盡可能方便用戶使用和充分利用內存以提高內存利用率的目的。
???
一、內存空間的分配和回收
???
二、內存空間的共享與存儲保護
???
三、地址映射(地址重定位)
???
四、內存擴充
3.2
單用戶連續存儲管理
???
這是一種最簡單的存儲管理方式,系統是將整個內存除了給操作系統劃分出一塊空間外,其余部分的空間都分配給一個作業使用。個人機可采用此種管理方法,它不適宜多道程序設計系統。
??? 可以采用靜態重定位方式完成地址映射;處理器在執行指令時,要檢查其絕對地址是否屬于規定范圍內的地址,如果屬于,則按此地址訪問,否則將產生“地址越界”中斷。
??? 某些系統還采用對換技術(Swapping)讓多個進程輪流進入內存,這種技術多用于分時系統,隨著進程調度,將內存中的進程暫時移到外存,而把外存中某一進程換進內存。
3.3
固定分區存儲管理
???
其基本思想是將內存劃分成若干固定大小的分區,每個分區中最多只能裝入一個作業。當作業申請內存時,系統按一定的算法為其選擇一個適當的分區,并裝入內存運行。由于分區大小是事先固定的,因而可容納作業的大小受到限制,而且當用戶作業的地址空間小于分區的存儲空間時,造成存儲空間浪費。
???
一、空間的分配與回收
???
系統設置一張“分區分配表”來描述各分區的使用情況,登記的內容應包括:分區號、起始地址、長度和占用標志。其中占用標志為“
0
”時,表示目前該分區空閑;否則登記占用作業名(或作業號)。有了“分區分配表”,空間分配與回收工作是比較簡單的。
???
二、地址轉換和存儲保護
???
固定分區管理可以采用靜態重定位方式進行地址映射。
為了實現存儲保護,處理器設置了一對“下限寄存器”和“上限寄存器”。當一個已經被裝入主存儲器的作業能夠得到處理器運行時,進程調度應記錄當前運行作業所在的分區號,且把該分區的下限地址和上限地址分別送入下限寄存器和上限寄存器中。處理器執行該作業的指令時必須核對其要訪問的絕對地址是否越界。
???
三、多作業隊列的固定分區管理
???
為避免小作業被分配到大的分區中造成空間的浪費,可采用多作業隊列的方法。即系統按分區數設置多個作業隊列,將作業按其大小排到不同的隊列中,一個隊列對應某一個分區,以提高內存利用率。
3.4
可變分區
???
可變分區存儲管理不是預先將內存劃分分區,而是在作業裝入內存時建立分區,使分區的大小正好與作業要求的存儲空間相等。這種處理方式使內存分配有較大的靈活性,也提高了內存利用率。但是隨著對內存不斷地分配、釋放操作會引起存儲碎片的產生。
???
一、空間的分配與回收
???
采用可變分區存儲管理,系統中的分區個數與分區的大小都在不斷地變化,系統利用“空閑區表”來管理內存中的空閑分區,其中登記空閑區的起始地址、長度和狀態。當有作業要進入內存時,在“空閑區表”中查找狀態為“未分配”且長度大于或等于作業的空閑分區分配給作業,并做適當調整;當一個作業運行完成時,應將該作業占用的空間作為空閑區歸還給系統。
???
可以采用首先適應算法、最佳(優)適應算法和最壞適應算法三種分配策略之一進行內存分配。
???
二、地址轉換和存儲保護
???
可變分區存儲管理一般采用動態重定位的方式,為實現地址重定位和存儲保護,系統設置相應的硬件:基址
/
限長寄存器(或上界
/
下界寄存器)、加法器、比較線路等。
???
基址寄存器用來存放程序在內存的起始地址,限長寄存器用來存放程序的長度。處理機在執行時,用程序中的相對地址加上基址寄存器中的基地址,形成一個絕對地址,并將相對地址與限長寄存器進行計算比較,檢查是否發生地址越界。
???
三、存儲碎片與程序的移動
???
所謂碎片是指內存中出現的一些零散的小空閑區域。由于碎片都很小,無法再利用。如果內存中碎片很多,將會造成嚴重的存儲資源浪費。解決碎片的方法是移動所有的占用區域,使所有的空閑區合并成一片連續區域,這一技術稱為移動技術(緊湊技術)。移動技術除了可解決碎片問題還使內存中的作業進行擴充。顯然,移動帶來系統開銷加大,并且當一個作業如果正與外設進行
I/O
時,該作業是無法移動的。
3.5
頁式存儲管理
3.5.1
基本原理
???
1
.等分內存
???
頁式存儲管理將內存空間劃分成等長的若干區域,每個區域的大小一般取
2
的整數冪,稱為一個物理頁面有時稱為塊。內存的所有物理頁面從
0
開始編號,稱作物理頁號。
??? 2
.邏輯地址
???
系統將程序的邏輯空間按照同樣大小也劃分成若干頁面,稱為邏輯頁面也稱為頁。程序的各個邏輯頁面從
0
開始依次編號,稱作邏輯頁號或相對頁號。每個頁面內從
0
開始編址,稱為頁內地址。程序中的邏輯地址由兩部分組成:
??? 3
.內存分配
???
系統可用一張“位示圖”來登記內存中各塊的分配情況,存儲分配時以頁面(塊)為單位,并按程序的頁數多少進行分配。相鄰的頁面在內存中不一定相鄰,即分配給程序的內存塊之間不一定連續。
???
對程序地址空間的分頁是系統自動進行的,即對用戶是透明的。由于頁面尺寸為
2
的整數次冪,故相對地址中的高位部分即為頁號,低位部分為頁內地址。
3.5.2
實現原理
??? 1
.頁表
???
系統為每個進程建立一張頁表,用于記錄進程邏輯頁面與內存物理頁面之間的對應關系。地址空間有多少頁,該頁表里就登記多少行,且按邏輯頁的順序排列,形如:
邏輯頁號
|
主存塊號
|
0
|
B0
|
1
|
B1
|
2
|
B2
|
3
|
B3
|
??? 2
.地址映射過程
???
頁式存儲管理采用動態重定位,即在程序的執行過程中完成地址轉換。處理器每執行一條指令,就將指令中的邏輯地址(
p,d
)取來從中得到邏輯頁號
(p)
,硬件機構按此頁號查頁表,得到內存的塊號
B’
,便形成絕對地址(
B’,d
)
,
處理器即按此地址訪問主存。
??? 3
.頁面的共享與保護
???
當多個不同進程中需要有相同頁面信息時,可以在主存中只保留一個副本,只要讓這些進程各自的有關項中指向內存同一塊號即可。同時在頁表中設置相應的“存取權限”,對不同進程的訪問權限進行各種必要的限制。
3.6
段式存儲管理
3
.
6
.
1
基本原理
??? 1.邏輯地址空間
??? 程序按邏輯上有完整意義的段來劃分,稱為邏輯段。例如主程序、子程序、數據等都可各成一段。將一個程序的所有邏輯段從0開始編號,稱為段號。每一個邏輯段都是從0開始編址,稱為段內地址。
??? 2.邏輯地址
??? 程序中的邏輯地址由段號和段內地址(s,d)兩部分組成。
??? 3.內存分配
??? 系統不進行預先劃分,而是以段為單位進行內存分配,為每一個邏輯段分配一個連續的內存區(物理段)。邏輯上連續的段在內存不一定連續存放。
3.6.2實現方法
??? 1.段表
??? 系統為每個進程建立一張段表,用于記錄進程的邏輯段與內存物理段之間的對應關系,至少應包括邏輯段號、物理段首地址和該段長度三項內容。
??? 2.建立空閑區表
??? 系統中設立一張內存空閑區表,記錄內存中空閑區域情況,用于段的分配和回收內存。
??? 3.地址映射過程
段式存儲管理采用動態重定位,處理器每執行一條指令,就將指令中的邏輯地址(
s,d
)取來從中得到邏輯段號
(s)
,硬件機構按此段號查段表,得到該段在內存的首地址
S’
,
該段在內存的首地址
S’
加上段內地址
d
,便形成絕對地址(
S’+d
),處理器即按此地址訪問主存。
3
.
6
.
3
段頁式存儲管理
???
頁式存儲管理的特征是等分內存,解決了碎片問題;段式存儲管理的特征是邏輯分段,便于實現共享。為了保持頁式和段式上的優點,結合兩種存儲管理方案,形成了段頁式存儲管理。
???
段頁式存儲管理的基本思想是:把內存劃分為大小相等的頁面;將程序按其邏輯關系劃分為若干段;再按照頁面的大小,把每一段劃分成若干頁面。程序的邏輯地址由三部分組成,形式如下:
???
內存是以頁為基本單位分配給每個程序的,在邏輯上相鄰的頁面內存不一定相鄰。
??
?
系統為每個進程建立一張段表,為進程的每一段各建立一張頁表。地址轉換過程,要經過查段表、頁表后才能得到最終的物理地址。
3.7
虛擬存儲管理
???
前面介紹的各種存儲管理方案有一點是共同的,即當一個參與并發執行的進程運行時,其整個程序都在內存,存在的缺點是:若一個進程的尺寸比內存可用空間大,則該進程無法運行;而實際上由于局部特性,一個進程在運行的任一階段只使用所占存儲空間的一部分,因此未用到的內存區域就被浪費。
??? 虛擬存儲管理是當進程要求運行時,不是將它的全部信息裝入內存,而是將其一部分先裝入內存,另一部分暫時留在外存(通常是磁盤)。進程在運行過程中,如果要訪問的信息不在內存時,發中斷由操作系統將它們調入內存,以保證進程的正常運行。
??? 虛擬存儲管理分為頁式虛擬存儲管理、段式虛擬存儲管理和段頁式虛擬存儲管理。
3.7.1頁式虛擬存儲管理
??? 一、基本原理
??? 基本思想是,在進程開始執行之前,不是裝入全部頁面,而是只裝入一個或幾個頁面,然后根據進程執行的需要,動態地裝入其他頁面。
??? 頁表中將增加若干項:標志位(又稱駐留位),指示該頁是否裝入內存;外存地址給出該頁在外存(磁盤)的地址。
??? 地址映射時當從頁表標志位得知此頁不在內存時,發缺頁中斷。此時暫停進程執行,CPU轉去執行缺頁中斷處理程序,負責把所需的頁從外存調入到內存某空閑塊中,并把物理頁號填入頁表、更改標志位,然后再返回繼續執行被中斷的進程。
??? 二、頁面淘汰
??? 當內存已無空閑塊而又發生缺頁中斷時,必須在內存中選擇一頁面將其淘汰并寫回到外存,然后再換進新的頁面,這一過程稱為頁面調度,選擇被淘汰頁面的算法稱作頁面調度算法。如果頁面淘汰算法不合理,可能產生剛被淘汰出去的一頁,又要訪問它,因而又要把它調入,如此反復,使系統的頁面調入調出工作非常頻繁從而降低系統效率,這種現象稱為“顛簸”或“抖動”。
??? 常用的頁面調度算法有:先進先出調度算法(FIFO)、最近最少使用調度算法(LRU)和最近最不經常使用調度算法(LFU)。
?? 注意,對于單用戶連續、固定分區、可變分區存儲管理是不能實現虛擬存儲管理的,因為它們的共同點是,在對作業進行內存分配時是將整個作業全部、連續地放入內存。
********************************************************************************************************
?