本文主要參考《計算機作業系統(第四版)》(西安電子科技大學出版社)以及清華大學作業系統公開課(向勇、陳渝),整理作業系統的基本概念,供自己複習查閱。
記憶體配置設定
為了能将使用者的程式裝入記憶體,必須給其配置設定一定的記憶體空間。連續配置設定就是最直覺的一種配置設定方式。但目前的作業系統普遍采用基于離散配置設定的分頁和分段機制的虛拟記憶體機制,該方式更為合理高效。
連續配置設定存儲管理
連續配置設定可以分為四類:單一連續配置設定、固定分區配置設定、動态分區配置設定、動态可重定位分區配置設定。
單一連續配置設定
在單道程式環境下,記憶體分為系統區和使用者區。使用者區僅裝有一個使用者程式,即整個記憶體都被該程式獨占。
固定分區配置設定
即在單一連續配置設定的基礎上,把使用者空間劃分為若幹個固定大小的區域,每個分區可以裝入一道作業。這是最早出現的可用于多道程式系統的存儲管理方式,這種方式顯然會造成較大的記憶體空間浪費,故現在很少用于通用的OS中。
動态分區配置設定
動态分區配置設定又稱可變分區配置設定,即根據程序的需要動态配置設定記憶體空間,會涉及到分區配置設定所用的資料結構、分區配置設定算法以及分區的配置設定和回收三個問題。
動态分區配置設定所用的資料結構
為了實作動态分區配置設定,通常會使用空閑分區表或空閑分區鍊記錄分區的情況。
動态分區配置設定算法
分區配置設定操作的性能直接影響系統的性能,故出現了許多分區配置設定算法。大體上,分區配置設定算法可分為兩類:順序式搜尋算法和索引式搜尋算法。細緻劃分即:
順序式搜尋算法:
- 首次适應算法
- 循環首次适應算法
- 最佳适應算法
- 最壞适應算法
索引式搜尋算法:
- 快速适應算法
- 夥伴系統
- 雜湊演算法
首次适應算法
以使用空閑分區鍊為資料結構的配置設定為例,首次适應(First Fit,FF)算法要求空閑分區鍊的位址為增序,在配置設定位址時從鍊首開始查找,找到第一個大小可滿足的空閑分區為止,再按作業大小從該分區分出一塊記憶體,其餘部分仍作為空閑區留在空閑鍊中;整條鍊内都無法找到滿足的分區即配置設定失敗。顯然該算法傾向于優先利用低位位址的空閑分區,保留了高位位址的大空閑區,為大作業預留了空間,但同時也會造成低址部分留下大量記憶體碎片。
循環首次适應算法
為了避免低址存在大量的記憶體碎片,改進FF得到循環首次适應(Next Fit,NF)算法。使用額外的指針保留上一次找到的空閑分區的下一分區的位址,下次查找時從此位址開始查找,并且采用循環查找方式。
最佳适應算法
所謂最佳适應(Best Fit,BF)算法即總是把能滿足要求的、最小的空閑分區配置設定給作業。看似是每次配置設定均為最佳,但實際上這樣做的後果是:每次配置設定後剩餘的部分也是最小的,即産生許多難以利用的記憶體碎片。
最壞适應算法
最壞适應(Worst Fit,WF)算法與最佳适應相反,即每次都選取最大的空閑分區,它的優點是使每次産生的碎片不至于過小,對中、小作業比較有利;同時,由于該算法要求空閑分區按從大到小的順序排序,故其查找效率也比較高(隻需檢視第一個分區即可)。
快速适應算法
快速适應(Quick Fit,QF)算法又稱為分類搜尋法,即把具有相同容量的所有空閑分區單獨設定一個空閑分區連結清單,再設立一張管理索引表管理所有分區表。在進行配置設定時,先根據程序長度從索引表找到能容納它的最小空閑區大小對應的連結清單,然後直接取出其中的第一塊即可,注意此做法并不分割分區。優點即不産生碎片,查找效率高;但為了有效合并分區,分區歸還的算法很複雜,系統開銷大。
夥伴系統
夥伴系統(Buddy System)基于QF算法,并規定分區大小必須為2的幂。當需要為程序配置設定記憶體時,也是先找到能容納該程序的、最小的空閑分區。若此時該分區能容納至少兩個該程序,則将該分區分割成兩個等大分區,并把其中一個歸到上一級空閑分區鍊,另一個用于配置設定;若分割後仍能容納至少兩個該程序,則重複此法直到分區大小為能容納該程序的最小的2的幂。與配置設定時類似,在回收記憶體時,若存在與待回收分區相同大小的分區則合并這兩個分區,并把合并分區歸入下一級分區鍊,若下一級分區同樣存在該情況,則依次合并。由于在回收時需要進行合并操作,其時間性能會比QF稍差;但由于采用索引搜尋,它的性能又會優于順序搜尋。在空間性能上,合并操作減少了小空閑分區,提高了空閑分區的使用率,優于QF算法,但比順序搜尋算法差。
雜湊演算法
當空閑分區分類較細時,索引表項較多,搜尋時間開銷也會顯著增大。雜湊演算法則利用哈希快速查找的優點,以空閑分區大小為關鍵字建構哈希表,進而在分區配置設定時快速得出分區連結清單表頭指針。
可重定位分區配置設定
可重定位分區配置設定法與動态分區配置設定法基本一緻,差别僅在于:該方法加入了緊湊(Compact)功能。緊湊即當目前的空閑分區無法滿足使用者需求時,讓目前所有作業都進行移動,使它們相鄰接,最後形成一個大空閑分區。緊湊使程序的實體位址發生了改變,也就迫使我們修改程式和資料的位址。而運作時動态連結則可以解決這一性能問題,重定位寄存器的存在使得緊湊操作僅需修改寄存器儲存的程式起始位址即可,這就是動态重定位。
離散配置設定存儲管理
連續配置設定方式都無法避免記憶體碎片的産生,緊湊可以解決這一問題但開銷很大。如果允許一個程序分散裝入不同的分區,便能充分利用空間,由此即産生了離散配置設定方式。根據配置設定位址空間的基本機關的不同,基本的離散配置設定方式有分頁式和分段式。同時還可以結合兩者優點形成段頁式,這也是目前應用較廣泛的形式。
分頁存儲管理
該方式把使用者程式的位址空間分為若幹固定大小的稱為“頁”的區域,同時把記憶體空間分為若幹實體塊,頁塊大小相同。
頁和塊
邏輯位址分為若幹頁并編号,記憶體的實體位址空間分為若幹塊并編号。在為程序配置設定記憶體時以塊為機關,可以把程序的若幹頁裝入不相鄰的實體塊中,無法裝滿的塊即頁内碎片。
在選擇頁面大小時也要注意。頁面過小可以減少記憶體碎片,但也會使程序占用的頁數變多,導緻程序頁表過長,使頁表占用記憶體變大,降低換入換出效率。而頁面過大雖然可以減小頁表長度,但又會使頁内碎片增大。
位址結構
以32位位址為例,假設位址前20位為頁号,剩餘部分為頁内位址(位移量)。12位的頁内位址即每頁的大小為\(2^{12}B=4KB\);20位頁号即位址空間最多有\(2^{20}=1M\)頁。

對于給定的邏輯空間位址A以及其頁面的大小L,均可以計算出對應的頁号P以及頁内位址d:
\[P=\lfloor {A\over L} \rfloor,\space d=A\space mod\space L
\]
頁表
為保證離散配置設定後的程序仍能正常運作,系統還應為每個程序建立一張頁面映像表,即頁表。頁表的作用是實作從頁号到實體塊号的映射,同時還可以在頁表設定一個存取控制字段,對塊中内容加以保護。
位址變換機構
位址變換機構的任務即把邏輯位址轉換為記憶體中的實體塊号,是借助頁表完成的。由于頁表可能很大,即頁表項數很多,故頁表大多駐留在記憶體中,在系統中設定一頁表寄存器(Page Table Register,PTR)存放頁表的起始位址和頁表長度。程序未執行時,起始位址和頁表長度一般位于本程序的PCB中。
快表
由于頁表存放在記憶體中,CPU每次通路資料都要通路兩次記憶體,即-先通路頁表擷取實體塊号,再把其與頁内位址拼接成實體位址,再通路實體位址中的資料。顯然這會使計算機處理速度下降近一半。為了提高位址變換速度,可以在位址變換機構中增設一個具有并行查詢能力的特殊高速緩沖寄存器,即快表(Associative Memory)。快表用于存放那些目前正在通路的頁表項。配備快表後,每當需要通路資料時,首先在快表中尋找是否存在相比對的頁号,有則直接讀取;否則繼續在記憶體中尋找頁号,并将此頁表項存入快表。若快表已滿,則選取一個被認為是不再需要的快表項并替換。
記憶體的有效通路時間
從程序發出通路邏輯位址的請求開始,經過位址變換,到在記憶體中找到對應的實際實體位址單元并取出資料所花費的總時間即記憶體的有效通路時間(Effective Access Time,EAT)。設通路一次記憶體的時間為\(t\),則在引入快表前:\(EAT=2t\);引入快表後:\(EAT=a\times \lambda+(t+\lambda)(1-a)+t=2t+\lambda-t\times a\),其中\(\lambda\)為查詢快表所需的時間,\(a\)為快表命中率。采用合适的算法保證命中率可使引入快表的CPU通路速度大幅提高。如當\(\lambda={t\over 5}\)時,若命中率能達到90%,則整體通路時間可縮短至\(1.3t\)。
多級頁表
現代作業系統大多支援非常大的邏輯位址空間。對于頁面大小為4KB的32位邏輯位址,頁表項數最高可達1M,這就意味着對應程序的頁表就會占用1MB的連續記憶體。為了解決這一問題,我們可以沿用離散配置設定的思路,把頁表也進行離散配置設定,并且隻把目前需要的頁表項調入記憶體,其餘駐留磁盤,這就是多級頁表。
以二級頁表為例,同樣是32為邏輯位址,可以作如下劃分:
為了實作,同時在位址變換機構增設一個外層頁表寄存器,用于存放外層頁表的起始位址。隻是多級劃分并沒有解決頁表的記憶體占用問題,真正解決問題的是配合多級頁表實作目前不用的頁表駐留磁盤。為此,還應在外層頁表中為每一個内層頁表增設狀态位S,以說明此頁表是否在記憶體上。
分段存儲管理
一方面,通常的程式都可以劃分為若幹段,如主程式段、子程式段、資料段、棧段等,每個段都是一個相對獨立的邏輯機關;另一方面,這些段也是實作資訊共享、資訊保護、動态連結以及資訊動态增長的基本機關。顯然,分段更符合實際需求,由此也就引入了分段存儲管理方式。
分段
在這種管理方式中,作業的位址空間被劃分為若幹段每個段都具有實際意義,友善起見為段編号,各段從0開始編址且位址空間連續,段長度由相應的邏輯資訊組決定,是以各段的長度很可能各不相同。
段表
與分頁管理類似,分段管理系統也會為每個分段配置設定一個連續分區,并為每個程序建立一張段映射表,即段表。段表的作用即建立邏輯段到實體記憶體區的映射,每個段在表中都有一個表項,用于記錄段的起始位址以及段的長度。
位址變換機構
為了實作位址變換,同樣也要在系統中設定段表寄存器,用于存放段表起始位址以及段長度。在通路時需要檢測是否發生段表越界或段内越界。同樣,增設聯想存儲器儲存最近使用的段表項。由于段一般比頁大,段表項數目較少,其聯想存儲器規模也相對較小,存取速度較快。
分段與分頁的差別
- 頁是資訊的實體機關,其對使用者是不可見的;段是資訊的邏輯機關,為了使用者的需要而劃分。
- 頁的大小固定且由系統決定;段的長度不固定且由使用者決定。
- 由于分頁是系統行為,頁位址空間是線性的,即通過一個邏輯位址就可以計算出對應的實體位址;而分段是使用者行為,其位址空間是二維的,即需要提供段号以及段内位址才可以得到實際位址。
段頁式存儲管理
對兩種配置設定方式各取所長即得到段頁式存儲管理方式,它既具有分段系統便于實作、分段可共享、易于保護、可動态連結的優點,又能像分頁系統一樣解決記憶體外部碎片的問題。
基本原理
段頁式存儲管理即先把使用者程式分為若幹段,并為每個段賦予一個段名,再把每個段分為若幹頁。其位址結構由三部分組成:段号、段内頁号、頁内位址。為了實作從邏輯位址到實體位址的轉換,系統中需同時配置段表和頁表。段的内容不再是記憶體起始位址以及段長,而是頁表的起始位址以及頁表長度。
位址變換
在段頁式系統中,擷取系統中配有一段表寄存器,在進行位址變換時,首先判斷段号是否越界,未越界則利用段表起始位址以及段号求出該段對應項在段表中的位置,從中得出該段的頁表起始位址,再利用邏輯位址中的段内頁号擷取對應頁的頁表項所在位置并從中讀取實體塊号,再利用塊号和頁内位址計算實體位址。顯然,在一次資料或指令通路中,需要通路三次記憶體。為了提高執行速度,同樣可以設定高速緩沖寄存器。