存儲器管理的主要對象是內存,由於對外存的管理與對內存的管理相類似,只是它們的用途不同,即外存主要用來存放文件。
存儲器的層次結構
對於通用計算機而言,存儲層次至少應具有三級:最高層為CPU寄存器,中間為主存,最底層是輔存。可以細划為寄存器、高速緩存、主存儲器、磁盤緩存、固定磁盤、可移動存儲介質等6 層。由於進程可以在很少的時鍾周期內使用一條load或store指令對可執行存儲器進行訪問,速度快;但對輔存的訪問則需要通過I/O設備來實現,因此,訪問中將涉及到中斷、設備驅動程序以及物理設備的運行,速度慢。操作系統的存儲管理,負責對可執行存儲器的分配、回收以及提供在存儲層次間數據移動的管理機制。

- 寄存器:訪問速度最快,完全能與CPU協調工作,存器的長度一般以字(word)為單位。寄存器用於加速存儲器的訪問速度,如用寄存器存放操作數,或用作地址寄存器加快地址轉換速度等。
- 高速緩存:根據程序執行的局部性原理(即程序在執行時將呈現出局部性規律,在一較短的時間內,程序的執行僅局限於某個部分),將主存中一些經常訪問的信息存放在高速緩存中,減少訪問主存儲器的次數,可大幅度提高程序執行速度。如果沒有指令高速緩存,CPU 將會空等若干個周期,直到下一條指令從主存中取出,故有的計算機系統中設置了兩級或多級高速緩存。
- 主存儲器:CPU的控制部件只能從主存儲器中取得指令和數據,數據能夠從主存儲器讀取並將它們裝入到寄存器中,或者從寄存器存入到主存儲器。CPU 與外圍設備交換的信息一般也通過主存儲器。由於主存儲器的訪問速度遠低於CPU執行指令的速度,為緩和這一矛盾,在計算機系統中引入了寄存器和高速緩存。
- 磁盤緩存:由於磁盤的I/O速度遠低於對主存的訪問速度,因此將頻繁使用的一部分磁盤數據和信息暫時存放在磁盤緩存中,可減少訪問磁盤的次數。磁盤緩存利用主存中的存儲空間,來暫存從磁盤中讀出(或寫入)的信息。
程序的裝入與鏈接
首先是要編譯,其次是鏈接,形成一個完整的裝入模塊(Load Module),最后是裝入,由裝入程序(Loader)將裝入模塊裝入內存。

程序的裝入
- 絕對裝入方式:在編譯時,如果知道程序將駐留在內存的什么位置,那么,編譯程序將產生絕對地址的目標代碼。絕對裝入程序按照裝入模塊中的地址,將程序和數據裝入內存。裝入模塊被裝入內存后,由於程序中的邏輯地址與實際內存地址完全相同,故不須對程序和數據的地址進行修改。只適合於單道程序環境。
- 可重定位裝入方式:在多道程序環境下,所得到的目標模塊的起始地址通常是從0 開始的,程序中的其它地址也都是相對於起始地址計算的。通常是把在裝入時對目標程序中指令和數據的修改過程稱為重定位。又因為地址變換通常是在裝入時一次完成的,以后不再改變,故稱為靜態重定位。不允許程序運行時在內存中移動位置。
- 動態運行時裝入方式:動態運行時的裝入程序在把裝入模塊裝入內存后,並不立即把裝入模塊中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程序真正要執行時才進行。因此,裝入內存后的所有地址都仍是相對地址。為使地址轉換不影響指令的執行速度,這種方式需要一個重定位寄存器的支持。
程序的鏈接
需要解決兩個問題,相對地址問題和變換外部調用符號問題。
- 靜態鏈接:在程序運行之前,先將各目標模塊及它們所需的庫函數,鏈接成一個完整的裝配模塊,以后不再拆開。
- 裝入時動態鏈接:指將用戶源程序編譯后所得到的一組目標模塊,在裝入內存時,采用邊裝入邊鏈接的鏈接方式。優點是便於修改和更新,便於實現目標模塊的共享。
- 運行時動態鏈接:指對某些目標模塊的鏈接,是在程序執行中需要該(目標)模塊時,才對它進行的鏈接。在執行過程中,當發現一個被調用模塊尚未裝入內存時,立即由OS去找到該模塊並將之裝入內存,把它鏈接到調用者模塊上。凡在執行過程中未被用到的目標模塊,都不會被調入內存和被鏈接到裝入模塊上,這樣不僅可加快程序的裝入過程,而且可節省大量的內存空間。

連續分配方式
連續分配方式是指一個用戶程序分配一個連續的內存空間。連續分配方式分為單一連續分配、固定分區分配、動態分區分配以及動態重定位分區分配四種方式。

- 單一連續分配方式:把內存分為系統區和用戶區兩部分,系統區僅提供給OS使用,通常是放在內存的低址部分;用戶區是指除系統區以外的全部內存空間,提供給用戶使用。只能用於單用戶、單任務的操作系統。
- 固定分區分配:將內存用戶空間划分為若干個固定大小的區域,在每個分區中只裝入一道作業。會維護一個分區使用表。是最簡單的一種可運行多道程序的存儲管理方式。分區划分有大小相等划分和大大小不等划分兩種。缺點是由於每個分區的大小固定,必然會造成存儲空間的浪費。

- 動態分區分配:根據進程的實際需要,動態地為之分配內存空間。涉及到分區分配中所用的數據結構、分區分配算法和分區的分配與回收三個問題。
數據結構有空閑分區表(表項分區號、分區起始地址,分區大小等)和空閑分區鏈(如下圖,在分區的起始部分,設置一些用於控制分區分配的信息和前向指針;在分區尾部則設置后向指針。注意當分區被分配出去以后,把狀態位由“0”改為“1”,此時前、后向指針已無意義。)

分區分配算法有以下5種:
-
- 首次適應算法:要求空閑分區鏈以地址遞增的次序鏈接。在分配內存時,從鏈首順序查找,直至找到第一個能滿足要求的空閑分區為止;然后再按照作業的大小,從該分區中划出一塊內存空間分配給請求者,余下的空閑分區仍留在空閑鏈中。若沒有找到則此次內存分配失敗。其缺點是低址部分不斷被划分,會留下許多碎片,而每次查找又都是從低址部分開始,會增加查找時的開銷。
- 循環首次適應算法:該算法是由首次適應算法演變而成,每次從上次找到的空閑分區的下一個空閑分區開始查找。應設置一起始查尋指針,用於指示下一次起始查尋的空閑分區,並采用循環查找方式,可從尾回到首部。找到后,應調整起始查尋指針。該算法能使內存中的空閑分區分布得更均勻,從而減少了查找空閑分區時的開銷。
- 最佳適應算法:要求將所有的空閑分區按其容量以從小到大的順序形成一空閑分區鏈。所謂“最佳”是指每次為作業分配內存時,總是把能滿足要求、又是最小的空閑分區分配給作業,避免“大材小用”。為了加速尋找,缺點會留下許多碎片。
- 最壞適應分配算法:要求將所有的空閑分區按其容量以從大到小的順序形成一空閑分區鏈。掃描整個空閑分區表或鏈表,總是挑選一個最大的空閑區分割給作業使用,其優點是可使剩下的空閑區不至於太小,產生碎片的幾率最小,對中、小作業有利。缺點是它會使存儲器中缺乏大的空閑分區。
- 快速適應算法:又稱為分類搜索法,是將空閑分區根據其容量大小進行分類,對於每一類具有相同容量的所有空閑分區,單獨設立一個空閑分區鏈表,同時在內存中設立一張管理索引表,該表的每一個表項對應了一種空閑分區類型,並記錄了該類型空閑分區鏈表表頭的指針。
分區分配與回收
分配:設請求的分區大小為u.size,表中每個空閑分區的大小可表示為m.size,size是事先規定的不再切割的剩余分區的大小。若m.size-u.size≤size,說明多余部分太小,可不再切割,將整個分區分配給請求者;否則(即多余部分超過size),從該分區中按請求的大小划分出一塊內存空間分配出去,余下的部分仍留在空閑分區鏈(表)中。然后,將分配區的首址返回給調用者。

回收:當進程運行完畢釋放內存時,系統根據回收區的首址,從空閑區鏈(表)中找到相應的插入點。會有如下4種情況。
- 回收區與插入點的前一個空閑分區F1相鄰接。此時將兩分區合並,修改其前一分區F1的大小為兩者之和。
- 回收分區與插入點的后一空閑分區F2相鄰接。此時將兩分區合並,用回收區的首址作為新空閑區的首址,大小為兩者之和。
- 回收區同時與插入點的前、后兩個分區鄰接。此時將三個分區合並,使用F1的表項和F1的首址,取消F2的表項,大小為三者之和。
- 回收區既不與F3鄰接,又不與F4鄰接。這時應為回收區單獨建立一新表項,填寫回收區的首址和大小,並根據其首址插入到空閑鏈中的適當位置。

伙伴系統方式是結合固定分區分配和動態分區分配的一種折衷方案。伙伴系統規定,無論已分配分區或空閑分區,其大小均為2 的k 次冪,k 為整數,l≤k≤m,其中:2的1次冪 表示分配的最小分區的大小,2的m次冪 表示分配的最大分區的大小。
哈希算法就是利用哈希快速查找的優點,以及空閑分區在可利用空間表中的分布規律,建立哈希函數,構造一張以空閑分區大小為關鍵字的哈希表,該表的每一個表項記錄了一個對應的空閑分區鏈表表頭指針。
- 動態重定位分區分配:在連續分配方式中,如果在系統中只有若干個小的分區,即使它們容量的總和大於要裝入的程序,但由於這些分區不相鄰接,也無法把該程序裝入內存。可采用的一種方法是將內存中的所有作業進行移動,使它們全都相鄰接,“緊湊”起來。由於經過緊湊后的某些用戶程序在內存中的位置發生了變化,此時若不對程序和數據的地址加以修改(變換),則程序必將無法執行。為此,在每次“緊湊”后,都必須對移動了的程序或數據進行重定位。將相對地址轉換為物理地址的工作,被推遲到程序指令要真正執行時進行。須在系統中增設一個重定位寄存器,用它來存放程序(數據)在內存中的起始地址。程序在執行時,真正訪問的內存地址是相對地址與重定位寄存器中的地址相加而形成的。動態重定位分區分配算法與動態分區分配算法基本上相同,差別僅在於,在這種分配算法中,增加了緊湊的功能,通常,在找不到足夠大的空閑分區來滿足用戶需求時進行緊湊。

、
連續分配方式開銷太大,如何實現離散分配方式呢?就有了分頁和分段。

基本分頁存儲管理
在分頁存儲管理方式中,如果不具備頁面對換功能,則稱為基本的分頁存儲管理方式,或稱為純分頁存儲管理方式,它不具有支持實現虛擬存儲器的功能,它要求把每個作業全部裝入內存后方能運行。
分頁存儲管理是將一個進程的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,並為各頁加以編號,如第0 頁、第1 頁等。相應地,也把內存空間分成與頁面相同大小的若干個存儲塊,稱為(物理)塊或頁框,也同樣為它們加以編號,如0#塊、1#塊等等。在為進程分配內存時,以塊為單位將進程中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於進程的最后一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為“頁內碎片”。簡單說就是一頁對應一個物理塊,一個物理塊內有固定大小的字節,其大小等於頁面大小。頁面大小應該適中,太小可使得碎片減小,提高了內存利用率,但是頁表過長,占用大量內存,降低了換入換出的速度;太大,減小了頁表長度,提高了換入換出的速度,但是碎片增大。頁面大小一般選擇2的冪。
分頁地址結構如下:圖中的地址長度為32 位,其中0~11 位為頁內地址,即每頁的大小為4 KB;12~31 位為頁號,地址空間最多允許有1 M頁。對於某特定機器,其地址結構是一定的。

設邏輯空間地址A,頁面大小為L,則頁號P和頁內地址d可以由如下公式確定:

如何將邏輯上的頁與物理上的塊一一對應呢,這就需要系統為每個進程建立了一張頁面映像表,簡稱頁表。也常在頁表的表項中設置一存取控制字段,用於對該存儲塊中的內容加以保護。

有了這個映射表(也就是頁表),那么就需要有一個地址變換機構來完成從邏輯地址到物理地址的轉換。由於頁面大小和物理塊大小是相同的,所以頁內地址和物理塊內地址是對應好的,地址轉換機構就只需要借助頁表將頁號轉為物理號即可。頁表大多駐留在內存中,在系統中只設置一個頁表寄存器PTR,在其中存放頁表在內存的始址和頁表的長度。平時,進程未執行時,頁表的始址和頁表長度存放在本進程的PCB 中。當調度程序調度到某進程時,才將這兩個數據裝入頁表寄存器中。因此,在單處理機環境下,雖然系統中可以運行多個進程,但只需一個頁表寄存器。

由於頁表是存放在內存中的,這使CPU在每存取一個數據時,都要兩次訪問內存。第一次是訪問內存中的頁表,從中找到指定頁的物理塊號,再將塊號與頁內偏移量W 拼接,以形成物理地址。第二次訪問內存時,才是從第一次所得地址中獲得所需數據(或向此地址中寫入數據)。為了提高地址變換速度,可在地址變換機構中增設一個具有並行查尋能力的特殊高速緩沖寄存器,又稱為“聯想寄存器”,或稱為“快表”。在CPU給出有效地址后,由地址變換機構自動地將頁號P送入高速緩沖寄存器,並將此頁號與高速緩存中的所有頁號進行比較,若其中有與此相匹配的頁號,便表示所要訪問的頁表項在快表中。於是,可直接從快表中讀出該頁所對應的物理塊號,並送到物理地址寄存器中。如在塊表中未找到對應的頁表項,則還須再訪問內存中的頁表,找到后,把從頁表項中讀出的物理塊號送地址寄存器;同時,再將此頁表項存入快表的一個寄存器單元中,亦即,重新修改快表。但如果聯想寄存器已滿,則OS必須找到一個老的且已被認為不再需要的頁表項,將它換出。簡單說快表就是用於記憶之前訪問過的頁號的一個高速緩存,方便下次直接使用,快表實時更新,且當緩存區滿時按照一定規則替換一些。

現在有一個問題就是頁表也需要在內存中存儲呀,那么如果頁表太長采用連續分配方式肯定不行。解決方法有二,一是用相同的方法對頁表進行離散分配存儲,這就出現了兩級頁表和多級頁表,這種方式並沒有減少頁表存儲空間,只是將存儲分散了;二是只將當前需要的部分頁表項調入內存,其余的頁表項仍駐留在磁盤上,需要時再調入,這就是請求調頁。
兩級頁表:對於要求連續的內存空間來存放頁表的問題,可利用將頁表進行分頁,並離散地將各個頁面分別存放在不同的物理塊中的辦法來加以解決,同樣也要為離散分配的頁表再建立一張頁表,稱為外層頁表,在每個頁表項中記錄了頁表頁面的物理塊號。當外層頁表還是過長時,可以對外層頁表在分頁,形成多級頁表。



基本分段存儲管理
在分段存儲管理方式中,作業的地址空間被划分為若干個段,每個段定義了一組邏輯信息。例如,有主程序段MAIN、子程序段X、數據段D 及棧段S等。每個段都有自己的名字,通常可用一個段號來代替段名,每個段都從0開始編址,並采用一段連續的邏輯地址空間。段的長度由相應的邏輯信息組的長度決定,因而各段長度不等。整個作業的地址空間由於是分成多個段,因而是二維的,亦即,其邏輯地址由段號(段名)和段內地址所組成。
引入分段的需求是:
- 方便編程。希望要訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的;
- 信息共享。在實現對程序和數據的共享時,是以信息的邏輯單位為基礎的,而段是信息的邏輯單位;
- 信息保護。信息保護同樣是對信息的邏輯單位進行保護;
- 動態增長。往往有些段,特別是數據段,在使用過程中會不斷地增長,而事先又無法確切地知道數據段會增長到多大;
- 動態鏈接。要運行時,先將主程序所對應的目標程序裝入內存並啟動運行,當運行過程中又需要調用某段時,才將該段(目標程序)調入內存並進行鏈接。可見,動態鏈接也要求以段作為管理的單位。

在該地址結構中,允許一個作業最長有64 K個段,每個段的最大長度為64 KB。
和分頁管理一樣,分段管理也需要段表、地址變換機構、快表等。
系統為每個分段分配一個連續的分區(類似於分頁中每頁對應一個連續的物理塊),而進程中的各個段可以離散地移入內存中不同的分區中。為使程序能正常運行,亦即,能從物理內存中找出每個邏輯段所對應的位置,應像分頁系統那樣,在系統中為每個進程建立一張段映射表,簡稱“段表”。每個段在表中占有一個表項,其中記錄了該段在內存中的起始地址(又稱為“基址”)和段的長度。段表可以存放在一組寄存器中,這樣有利於提高地址轉換速度,但更常見的是將段表放在內存中。


信息共享
分段存儲管理允許若干個進程共享一個或多個分段,且對段的保護也十分簡單易行。在分頁系統中,雖然也能實現程序和數據的共享,但遠不如分段系統來得方便。
例如,有一個多用戶系統,他們都執行一個文本編輯程序。


分頁 vs. 分段
- 頁是信息的物理單位,分頁是為實現離散分配方式,以消減內存的外零頭,提高內存的利用率,或者說,分頁僅僅是由於系統管理的需要而不是用戶的需要。段則是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是為了能更好地滿足用戶的需要。
- 頁的大小固定且由系統決定,由系統把邏輯地址划分為頁號和頁內地址兩部分,是由機器硬件實現的,因而在系統中只能有一種大小的頁面;而段的長度卻不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時,根據信息的性質來划分。
- 分頁的作業地址空間是一維的,即單一的線性地址空間,程序員只需利用一個記憶符,即可表示一個地址;而分段的作業地址空間則是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。
段頁式存儲管理方式
段頁式系統的基本原理,是分段和分頁原理的結合,即先將用戶程序分成若干個段,再把每個段分成若干個頁,並為每一個段賦予一個段名。
在段頁式系統中,為了獲得一條指令或數據,須三次訪問內存。第一次訪問是訪問內存中的段表,從中取得頁表始址;第二次訪問是訪問內存中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址一起形成指令或數據的物理地址;第三次訪問才是真正從第二次訪問所得的地址中,取出指令或數據。為了提高執行速度,在地址變換機構中增設一個高速緩沖寄存器,每次訪問它時,都須同時利用段號和頁號去檢索高速緩存。



虛擬存儲器
當作業太多或者作業數太多,內存容量無法滿足時,可以從邏輯上擴充內存容量,這正是虛擬存儲器所要解決的主要問題。所謂虛擬存儲器,是指具有請求調入功能和置換功能,利用外存,從邏輯上對內存容量加以擴充的一種存儲器系統。其邏輯容量由內存容量和外存容量之和所決定,其運行速度接近於內存速度,而每位的成本卻又接近於外存。虛擬存儲器具有多次性、對換性和虛擬性三大主要特征。
程序局部性原理:程序在執行時將呈現出局部性規律,即在一較短的時間內,程序的執行僅局限於某個部分;相應地,它所訪問的存儲空間也局限於某個區域。時間局限性。如果程序中的某條指令一旦執行,則不久以后該指令可能再次執行;如果某數據被訪問過,則不久以后該數據可能再次被訪問。產生時間局限性的典型原因是由於在程序中存在着大量的循環操作。空間局限性。一旦程序訪問了某個存儲單元,在不久之后,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址,可能集中在一定的范圍之內,其典型情況便是程序的順序執行。
基於局部性原理,應用程序在運行之前,沒有必要全部裝入內存,僅須將那些當前要運行的少數頁面或段先裝入內存便可運行,其余部分暫留在盤上。程序在運行時,如果它所要訪問的頁(段)已調入內存,便可繼續執行下去;但如果程序所要訪問的頁(段)尚未調入內存(稱為缺頁或缺段),此時程序應利用OS所提供的請求調頁(段)功能,將它們調入內存,以使進程能繼續執行下去。如果此時內存已滿,無法再裝入新的頁(段),則還須再利用頁(段)的置換功能,將內存中暫時不用的頁(段)調至盤上,騰出足夠的內存空間后,再將要訪問的頁(段)調入內存,使程序繼續執行下去。
虛擬存儲器的實現
分頁系統的基礎上,增加了請求調頁功能和頁面置換功能所形成的頁式虛擬存儲系統。主要的硬件支持有:① 請求分頁的頁表機制,它是在純分頁的頁表機制上增加若干項而形成的,作為請求分頁的數據結構;② 缺頁中斷機構,即每當用戶程序要訪問的頁面尚未調入內存時,便產生一缺頁中斷,以請求OS將所缺的頁調入內存;③ 地址變換機構,它同樣是在純分頁地址變換機構的基礎上發展形成的。實現請求分頁的軟件:包括有用於實現請求調頁的軟件和實現頁面置換的軟件。
在分段系統的基礎上,增加了請求調段及分段置換功能后所形成的段式虛擬存儲系統。主要的硬件支持有:(1) 請求分段的段表機制,這是在純分段的段表機制基礎上增加若干項而形成的;(2) 缺段中斷機構,每當用戶程序所要訪問的段尚未調入內存時,產生一個缺段中斷,請求OS將所缺的段調入內存;(3) 地址變換機構。與請求調頁相似,實現請求調段和段的置換功能也須得到相應的軟件支持。
請求分頁存儲管理
請求分頁系統是建立在基本分頁基礎上的,為了能支持虛擬存儲器功能而增加了請求調頁功能和頁面置換功能。需要有頁表機制、缺頁中斷機構、地址變換機構以及請求調頁和置換功能的軟件。
頁表機制,頁表項如下:
![]()
- 狀態位P:用於指示該頁是否已調入內存,供程序訪問時參考。
- 訪問字段A:用於記錄本頁在一段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問,供選擇換出頁面時參考。
- 修改位M:表示該頁在調入內存后是否被修改過。由於內存中的每一頁都在外存上保留一份副本,因此,若未被修改,在置換該頁時就不需再將該頁寫回到外存上,以減少系統的開銷和啟動磁盤的次數;若已被修改,則必須將該頁重寫到外存上,以保證外存中所保留的始終是最新副本。簡言之,M位供置換頁面時參考。
- 外存地址:用於指出該頁在外存上的地址,通常是物理塊號,供調入該頁時參考
缺頁中斷在請求分頁系統中,每當所要訪問的頁面不在內存時,便產生一缺頁中斷,請求OS將所缺之頁調入內存。缺頁中斷作為中斷,它們同樣需要經歷諸如保護CPU環境、分析中斷原因、轉入缺頁中斷處理程序進行處理、恢復CPU環境等幾個步驟。缺頁中斷與一般中斷區別:在指令執行期間產生和處理中斷信號、一條指令在執行期間,可能產生多次缺頁中斷。
地址轉換機構:

內存分配策略和分配算法
在請求調頁存儲管理系統中為進程分配內存時,將涉及到三個問題:第一,最小物理塊數的確定;第二,物理塊的分配策略;第三,物理塊的分配算法。
最小物理塊數,是指能保證進程正常運行所需的最小物理塊數。對於某些簡單的機器,若是單地址指令且采用直接尋址方式,則所需的最少物理塊數為2。其中,一塊是用於存放指令的頁
面,另一塊則是用於存放數據的頁面。
物理塊的分配策略在請求分頁系統中,可采取兩種策略,即固定和可變分配策略。在進行置換時,也可采取兩種策略,即全局置換和局部置換。有了如下組合:
固定分配局部置換,指基於進程的類型(交互型或批處理型等),或根據程序員、程序管理員的建議,為每個進程分配固定數目的物理塊,在整個運行期間都不再改變。采用該策略時,如果進程在運行中發現缺頁,則只能從該進程在內存的n 個頁面中選出一個頁換出,然后再調入一頁,以保證分配給該進程的內存空間不變。
可變分配全局置換,先為系統中的每個進程分配一定數目的物理塊,而OS自身也保持一個空閑物理塊隊列。當某進程發現缺頁時,由系統從空閑物理塊隊列中取出一個物理塊分配給該進程,並將欲調入的(缺)頁裝入其中。這樣,凡產生缺頁(中斷)的進程,都將獲得新的物理塊。僅當空閑物理塊隊列中的物理塊用完時,OS才能從內存中選擇一頁調出,該頁可能是系統中任一進程的頁。
可變分配局部置換,這同樣是基於進程的類型或根據程序員的要求,為每個進程分配一定數目的物理塊,但當最初某進程發現缺頁時,只允許從該進程在內存的頁面中選出一頁換出,這樣就不會影響其它進程的運行。如果進程在運行中頻繁地發生缺頁中斷,則系統須再為該進程分配若干附加的物理塊,直至該進程的缺頁率減少到適當程度為止;反之,若一個進程在運行過程中的缺頁率特別低,則此時可適當減少分配給該進程的物理塊數。
物理塊的分配算法,如何將系統中可供分配的所有物理塊分配給各個進程,可采用下述幾種算法:平均分配算法、 按比例分配算法、考慮優先權的分配算法。
調頁策略
調度時機:預調頁策略、請求調頁策略。
從何處調入:在請求分頁系統中的外存分為兩部分,用於存放文件的文件區和用於存放對換頁面的對換區。通常,由於對換區是采用連續分配方式,而文件區是采用離散分配方式,故對換區的磁盤I/O 速度比文件區的高。
頁面置換算法
那么選擇哪一或者哪些頁面置換出去呢?
最佳置換算法:其所選擇的被淘汰頁面,將是以后永不使用的,或許是在最長(未來)時間內不再被訪問的頁面。采用最佳置換算法,通常可保證獲得最低的缺頁率。但這是一種理想算法,由於人們目前還無法預知一個進程在內存的若干個頁面中,哪一個頁面是未來最長時間內不再被訪問的,因而該算法是無法實現的,但可以利用該算法去評價其它算法。
先進先出(FIFO)頁面置換算法:該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。
最近最久未使用(LRU,Least Recently Used)置換算法:選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間t,當須淘汰一個頁面時,選擇現有頁面中其t 值最大的,即最近最久未使用的頁面予以淘汰。為了記錄某進程在內存中各頁的使用情況,須為每個在內存中的頁面配置一個移位寄存器,可表示為R = Rn-1Rn-2Rn-3 … R2R1R0。當進程訪問某物理塊時,要將相應寄存器的Rn-1 位置成1。此時,定時信號將每隔一定時間(例如100 ms)將寄存器右移一位。

可利用一個特殊的棧來保存當前使用的各個頁面的頁面號。每當進程訪問某頁面時,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最新被訪問頁面的編號,而棧底則是最近最久未使用頁面的頁面號。

Clock置換算法:LRU 算法是較好的一種算法,但由於它要求有較多的硬件支持,故在實際應用中,大多采用LRU的近似算法,Clock算法就是用得較多的一種LRU近似算法。當采用簡單Clock算法時,只需為每頁設置一位訪問位,再將內存中的所有頁面都通過鏈接指針鏈接成一個循環隊列。當某頁被訪問時,其訪問位被置1。置換算法在選擇一頁淘汰時,只需檢查頁的訪問位。如果是0,就選擇該頁換出;若為1,則重新將它置0,暫不換出,而給該頁第二次駐留內存的機會,再按照FIFO 算法檢查下一個頁面。當檢查到隊列中的最后一個頁面時,若其訪問位仍為1,則再返回到隊首去檢查第一個頁面。

在將一個頁面換出時,如果該頁已被修改過,便須將該頁重新寫回到磁盤上;但如果該頁未被修改過,則不必將它拷回磁盤。在改進型Clock算法中,除須考慮頁面的使用情況外,還須再增加一個因素,即置換代價。由訪問位A和修改位M可以組合成下面四種類型的頁面:

改進型clock算法步驟:
- 從指針所指示的當前位置開始,掃描循環隊列,尋找A=0且M=0的第一類頁面,將所遇到的第一個頁面作為所選中的淘汰頁。在第一次掃描期間不改變訪問位A。
- 如果第一步失敗,即查找一周后未遇到第一類頁面,則開始第二輪掃描,尋找A=0且M=1的第二類頁面,將所遇到的第一個這類頁面作為淘汰頁。在第二輪掃描期間,將所有掃描過的頁面的訪問位都置0。
- 如果第二步也失敗,亦即未找到第二類頁面,則將指針返回到開始的位置,並將所有的訪問位復0。然后重復第一步,如果仍失敗,必要時再重復第二步,此時就一定能找到被淘汰的頁。
最少使用(LFU:Least Frequently Used)置換算法:在采用最少使用置換算法時,應為在內存中的每個頁面設置一個移位寄存器,用來記錄該頁面被訪問的頻率。
頁面緩沖算法(PBA:Page Buffering Algorithm):它采用了前述的可變分配和局部置換方式,置換算法采用的是FIFO。該算法規定將一個被淘汰的頁放入兩個鏈表中的一個,即如果頁面未被修改,就將它直接放入空閑鏈表中;否則,便放入已修改頁面的鏈表中。當需要讀入一個頁面時,便可利用空閑物理塊鏈表中的第一個物理塊來裝入該頁。當有一個未被修改的頁要換出時,實際上並不將它換出內存,而是把該未被修改的頁所在的物理塊掛在自由頁鏈表的末尾。類似地,在置換一個已修改的頁面時,也將其所在的物理塊掛在修改頁面鏈表的末尾。
請求分段存儲管理
請求分段管理所需的硬件支持有段表機制、缺段中斷機構,以及地址變換機構。

- 存取方式:用於標識本分段的存取屬性是只執行、只讀,還是允許讀/寫。
- 訪問字段A:其含義與請求分頁的相應字段相同,用於記錄該段被訪問的頻繁程度。
- 修改位M:用於表示該頁在進入內存后是否已被修改過,供置換頁面時參考。
- 存在位P:指示本段是否已調入內存,供程序訪問時參考。
- 增補位:這是請求分段式管理中所特有的字段,用於表示本段在運行過程中是否做過動態增長。
- 外存始址:指示本段在外存中的起始地址,即起始盤塊號。
缺段中斷機構

地址轉換機構

分段共享
為了實現分段共享,可在系統中配置一張共享段表,所有各共享段都在共享段表中占有一表項。表項中記錄了共享段的段號、段長、內存始址、存在位等信息,並記錄了共享此分段的每個進程的情況。

共享段的分配:在為共享段分配內存時,對第一個請求使用該共享段的進程,由系統為該共享段分配一物理區,再把共享段調入該區,同時將該區的始址填入請求進程的段表的相應項中,還須在共享段表中增加一表項,填寫有關數據,把count 置為1;之后,當又有其它進程需要調用該共享段時,由於該共享段已被調入內存,故此時無須再為該段分配內存,而只需在調用進程的段表中增加一表項,填寫該共享段的物理地址;在共享段的段表中,填上調用進程的進程名、存取控制等,再執行count :=count+1 操作,以表明有兩個進程共享該段。
共享段的回收:當共享此段的某進程不再需要該段時,應將該段釋放,包括撤消在該進程段表中共享段所對應的表項,以及執行count :=count-1 操作。若結果為0,則須由系統回收該共享段的物理內存,以及取消在共享段表中該段所對應的表項,表明此時已沒有進程使用該段;否則(減1 結果不為0),只是取消調用者進程在共享段表中的有關記錄。
分段保護
在分段系統中,由於每個分段在邏輯上是獨立的,因而比較容易實現信息保護。目前,常采用以下幾種措施來確保信息的安全:越界檢查、存取控制檢查、環保護機構。
環保護機構規定:低編號的環具有高優先權。OS核心處於0 環內;某些重要的實用程序和操作系統服務占居中間環;而一般的應用程序則被安排在外環上。
在環系統中,程序的訪問和調用應遵循以下規則:
- 一個程序可以訪問駐留在相同環或較低特權環中的數據。
- 一個程序可以調用駐留在相同環或較高特權環中的服務。

