操作系統:虛擬存儲器


引入虛擬存儲器的動機

傳統存儲器管理方式

無論是連續還是離散的存儲器管理方式,統稱為傳統存儲器管理方式,它們全都具有如下兩個共同的特征。第一個是一次性,是指作業必須一次性地全部裝入內存后方能開始運行。第二個是駐留性,是指作業被裝入內存后,整個作業都一直駐留在內存中,其中任何部分都不會被換出,直至作業運行結束。盡管運行中的進程可能會被阻塞,或者有的程序模塊在運行過一次后就不再需要(運行)了,它們都仍將繼續占用的內存資源。部裝入內存后方能運行。由於這 2 個性質,可能會導致兩種情況:

  1. 有的作業很大,其所要求的內存空間超過了內存總容量,作業不能全部被裝入內存使該作業無法運行;
  2. 有大量作業要求運行,但由於內存容量不足以容納所有這些作業,只能將少數作業裝入內存先運行,將其它大量的作業留在外存上等待。

出現上述兩種情況的原因都是由於內存容量不夠大,如果從物理上增加內存容量,往往會受到機器自身的限制而且要增加成本,另一種方法是從邏輯上擴充內存容量。

局部性原理

程序在執行時將呈現出局部性規律,即在一較短的時間內程序的執行僅局限於某個部分,相應地所訪問的存儲空間也局限於某個區域。局限性表現在下述兩個方面:

  1. 時間局部性:如果程序中的某條指令被執行,則不久以后該指令可能再次執行;如果某數據被訪問過,則不久以后該數據可能再次被訪問,典型例子是程序中的循環結構;
  2. 空間局部性:一旦程序訪問了某個存儲單元,在不久之后其附近的存儲單元也將被訪問,典型例子是是程序的順序執行或數組的遍歷。

虛擬存儲器

虛擬存儲器的定義

基於局部性原理可知,應用程序運行時僅須將當前要運行的少數頁面或段先裝入內存便可,其余部分暫留在盤上。在程序執行過程中,當所訪問的信息不在內存時,由操作系統負責將所需信息從外存調入內存,然后繼續執行程序。若內存空間不夠,由操作系統負責將內存中暫時用不到的信息換出到外存。這樣使一個大的用戶程序在較小的內存空間中運行,也可在內存中同時裝入更多的進程,使它們並發執行。
在操作系統的管理下,在用戶看來似乎有一個比實際內存大得多的內存,這就是虛擬內存。虛擬存儲器是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。它的運行速度接近於內存速度,而每位的成本卻又接近於外存。虛擬內存的最大容量是由計算機的 CPU 尋址范圍確定的,實際容量是內存和外存容量之和和 CPU 尋址范圍之間的最小值。例如某計算機地址結構為 32 位,按字節編址,內存大小為 512 MB,外存大小為 2 GB。則虛擬內存的最大容量為 2^32 B = 4 GB,虛擬內存的實際容量 = min(2^32 B, 512 MB + 2 GB) = 2 GB + 512 MB

虛擬存儲器的特征

虛擬內存有一下三個主要特征:

  • 多次性:無需在作業運行時一次性全部裝入內存,而是允許被分成多次調入內存。
  • 對換性:在作業運行時無需一直常駐內存,而是允許在作業運行過程中將作業換入、換出。
  • 虛擬性:從邏輯上擴充了內存的容量,使用戶看到的內存容量遠大於實際的容量。

虛擬存儲器的實現

在虛擬存儲器中,允許將一個作業分多次調入內存。如果采用連續分配方式,必須事先為作業一次性地申請一個足以容納整個作業的內存空間,這樣無法、也無意義再從邏輯上擴大內存容量。所以虛擬存儲器的實現,都建立在離散分配存儲管理方式的基礎上。

分頁請求系統

分頁請求系統是在分頁系統的基礎上,增加請求調頁功能和頁面置換功能,形成頁式虛擬存儲系統。它允許用戶程序只裝入少數頁面的程序(及數據)即可啟動運行,再通過調頁功能及頁面置換功能陸續地把即將運行的頁面調入內存,同時把暫不運行的頁面換出到外存上。

請求分段系統

請求分段系統是在分段系統的基礎上,增加了請求調段及分段置換功能,形成段式虛擬存儲系統。它允許用戶程序只要裝入少數段(而非所有的段)的程序和數據即可啟動運行,以后通過調段功能和段的置換功能將暫不運行的段調出,再調入即將運行的段。

請求分頁存儲的硬件支持

計算機系統除了要求一定容量的內存和外存外,還需要有請求頁表機制、缺頁中斷機構以及地址變換機構。

請求頁表機制

在請求分頁系統中需要的主要數據結構是請求頁表,作用仍然是將邏輯地址映射為物理地址。為了滿足頁面換進換出的需要,在請求頁表中又增加了四個字段。

字段 說明
狀態位 P 指示該頁是否已調入內存,供程序訪問時參考
訪問字段 A 記錄本頁在一段時間內被訪問的次數,供置換頁面時參考
修改位 M 標識該頁在調入內存后是否被修改過,供置換頁面時參考
外存地址 用於指出該頁在外存上的地址,通常是物理塊號,供調入該頁時參考

缺頁中斷機構

在請求分頁系統中,每當要訪問的頁面不在內存時,便產生一個缺頁中斷,然后由操作系統的缺頁中斷處理程序處理中斷。此時缺頁的進程阻塞,放入阻塞隊列,調頁完成后再將其喚醒放回就緒隊列。如果內存中有空閑塊,則為進程分配一個空閑塊,將所缺頁面裝入該塊,並修改頁表中相應的頁表項。如果內存中沒有空閑塊,則由頁面置換算法選擇一個頁面淘汰,若該頁面在內存期間被修改過,則要將其寫回外存。未修改過的頁面不用寫回外存。

缺頁中斷是一種特殊的中斷,它是在指令執行期間產生和處理中斷信號。一條指令在執行期間可能產生多次缺頁中斷,例如“copy A to B”將邏輯地址 A 中的數據復制到邏輯地址 B,而 A、B 屬於不同的頁面就有可能產生兩次中斷。

地址變換機構

請求分頁系統中的地址變換機構是在分頁系統地址變換機構的基礎上,再增加了某些功能所形成的,如產生和處理缺頁中斷以及從內存中換出一頁的功能等。在進行地址變換時,首先檢索快表,試圖從中找出所要訪問的頁。若找到便修改頁表項中的訪問位,對於寫指令還須將修改位置成“1”,表示該頁在調入內存后已被修改。然后利用頁表項中給出的物理塊號和頁內地址形成物理地址,地址變換過程到此結束。如果在快表中未找到該頁的頁表項,則應到內存中去查找頁表,再從找到的頁表項中的狀態位 P 來了解該頁是否已調入內存。若該頁已調入內存,這時應將該頁的頁表項寫入快表。當快表已滿時,則應先調出按某種算法所確定的頁的頁表項,然后再寫入該頁的頁表項。若該頁尚未調入內存,這時應產生缺頁中斷,請求 OS 從外存把該頁調入內存。

分頁管理的內存分配

在為進程分配內存時,將涉及到為保證進程能正常運行需要多少物理塊數,以及在為每個進程分配物理塊時應采取什么樣的分配策略的問題。

駐留集

駐留集指請求分頁存儲管理中給進程分配的物理塊的集合,在采用了虛擬存儲技術的系統中,駐留集大小一般小於進程的總大小。若駐留集太小,會導致缺頁頻繁,系統要花大量的時間來處理缺頁,實際用於進程推進的時間很少。駐留集太大,又會導致多道程序並發度下降,資源利用率降低。所以應該選擇一個合適的駐留集大小。

內存分配策略

在請求分頁系統中分配內存時,可采取固定或可變分配兩種策略。

分配策略 說明
固定分配 操作系統為每個進程分配一組固定數目的物理塊,在進程運行期間不再改變
可變分配 先為每個進程分配一定數目的物理塊,在進程運行期間,可根據情況做適當的增加或減少

在進行置換時,也可采取全局置換或局部置換兩種策略。

分配策略 說明
局部置換 發生缺頁時只能選進程自己的物理塊進行置換
全局置換 可以將操作系統保留的空閑物理塊分配給缺頁進程,也可以將別的進程持有的物理塊置換到外存

通過分配策略和置換策略的組合,可組合出以下三種適用的策略。簡單地說可變分配全局置換是只要缺頁就給分配新物理塊,可變分配局部置換是要根據發生缺頁的頻率來動態地增加或減少進程的物理塊。

策略 說明
固定分配局部置換 系統為每個進程分配一定數量的物理塊,在整個運行期間都不改變。若進程在運行中發生缺頁,則只能從該進程在內存中的頁面中選出一頁換出,然后再調入需要的頁面。這種策略的缺點是,很難在剛開始就確定應為每個進程分配多少個物理塊才算合理。
可變分配全局置換 剛開始會為每個進程分配一定數量的物理塊,操作系統會保持一個空閑物理塊隊列。當某進程發生缺頁時,從空閑物理塊中取出一塊分配給該進程。若已無空閑物理塊,則可選擇一個未鎖定的頁面換出外存,再將該物理塊分配給缺頁的進程。只要某進程發生缺頁,都將獲得新的物理塊,僅當空閑物理塊用完時,系統才選擇一個未鎖定的頁面調出。被選擇調出的頁可能是系統中任何一個進程中的頁,因此這個被選中的進程擁有的物理塊會減少,缺頁率會增加。
可變分配局部置換 剛開始會為每個進程分配一定數量的物理塊。當某進程發生缺頁時,只允許從該進程自己的物理塊中選出一個進行換出外存。如果進程在運行中頻繁地缺頁,系統會為該進程多分配幾個物理塊,直至該進程缺頁率趨勢適當程度。反之如果進程在運行中缺頁率特別低,則可適當減少分配給該進程的物理塊。

沒有固定分配全局置換的原因是,全局置換意味着一個進程擁有的物理塊數量必然會改變,因此不可能是固定分配。

物理塊分配算法

在采用固定分配策略時,如何將系統中可供分配的所有物理塊分配給各個進程,可采用下述幾種算法:

  1. 平均分配算法:即將系統中所有可供分配的物理塊平均分配給各個進程;
  2. 按比例分配算法:即根據進程的大小按比例分配物理塊;
  3. 考慮優先權的分配算法:為了照顧到重要的、緊迫的作業能盡快地完成,應為它分配較多的內存空間。

頁面調入策略

為使進程能夠正常運行,必須事先將要執行的那部分程序和數據所在的頁面調入內存。

調入頁面的時機

為了確定系統將進程運行時所缺的頁面調入內存的時機,可采取預調頁策略或請求調頁策略。預調頁策略是采用一種以預測為基礎的預調頁策略,將那些預計在不久之后便會被訪問的頁面預先調入內存。如果預測較准確能有效改善性能,但目前預調頁的成功率僅約 50%。
請求調頁策略是進程在運行中需要訪問某部分程序和數據時,若發現其所在的頁面不在內存便立即提出請求,由 OS 將其所需頁面調入內存。由請求調頁策略所確定調入的頁是一定會被訪問的,且請求調頁策略比較易於實現,故在目前的虛擬存儲器中大多采用此策略。但這種策略每次僅調入一頁,故須花費較大的系統開銷,增加了磁盤 I/O 的啟動頻率。

調入頁面的區域

將請求分頁系統中的外存分為兩部分,一部分是用於存放文件的文件區,一部分是用於存放對換頁面的對換區。通常由於對換區是采用連續分配方式,而文件區是采用離散分配方式,所以對換區的數據存取(磁盤 I/O)速度比文件區的高。每當發生缺頁請求時,系統應從何處將缺頁調入內存有以下情況:
第一種情況,當系統擁有足夠的對換區空間,這時可以全部從對換區調入所需頁面,以提高調頁速度。在進程運行前,便須將與該進程有關的文件從文件區拷貝到對換區。

第二種情況,系統缺少足夠的對換區空間,這時凡是不會被修改的文件,都直接從文件區調入,這些頁面由於它們未被修改,不必再將它們重寫到磁盤(換出)。以后再調入時,仍從文件區直接調入。但對於那些可能被修改的部分,在將它們換出時便須調到對換區,以后需要時再從對換區調入。

第三種情況可以使用 UNIX 方式,凡是未運行過的頁面,都應從文件區調入。而對於曾經運行過但又被換出的頁面,由於是被放在對換區,因此在下次調入時應從對換區調入。

頁面調入的過程

每當程序所要訪問的頁面未在內存時(存在位為“0”),便向 CPU 發出一缺頁中斷,中斷處理程序首先保留 CPU 環境,分析中斷原因后轉入缺頁中斷處理程序。該程序通過查找
頁表得到該頁在外存的物理塊后,如果此時內存能容納新頁,則啟動磁盤 I/O,將所缺之頁調入內存,然后修改頁表。如果內存已滿,則須先按照某種置換算法,從內存中選出一頁准備換出。如果該頁未被修改過(修改位為“0”),可不必將該頁寫回磁盤;但如果此頁已被修改(修改位為“1”),則必須將它寫回磁盤,然后再把所缺的頁調入內存,並修改頁表中的相應表項,置其存在位為“1”,並將此頁表項寫入快表中。在缺頁調入內存后,利用修改后的頁表形成所要訪問數據的物理地址,再去訪問內存數據。

缺頁率

假設一個進程的邏輯空間為 n 頁,系統為其分配的內存物理塊數為 m(m ≤ n)。如果在進程的運行過程中,訪問頁面成功的次數為 S,訪問頁面失敗的次數為 F,則該進程總的頁面訪問次數和缺頁率 f 的計算公式為:

A = S + F
f = F / A

通常缺頁率受到以下幾個因素的影響:

  1. 頁面大小:頁面划分較大則缺頁率較低,反之缺頁率較高。
  2. 進程所分配物理塊的數目:所分配的物理塊數目越多缺頁率越低,反之則越高。
  3. 頁面置換算法:算法的優劣決定了進程執行過程中缺頁中斷的次數
  4. 程序固有特性:程序編制的局部化程度越高,相應執行時的缺頁程度越低。

事實情況下沒有修改過的頁面可以直接放棄,而修改過的頁面則必須進行保存,所以處理這兩種情況時的時間也是不同的。假設被置換的頁面被修改的概率是 β,其缺頁中斷處理時間為 ta,被置換頁面沒有被修改的缺頁中斷時間為 ts,那么缺頁中斷處理時間的計算公式為:

t = β × ta + (1 - β) × tb

抖動和工作集

抖動

頻繁的頁面調度行為稱為抖動(Thrashing)或顛簸,表現為剛剛換出的頁面馬上又要換入內存,剛剛換入的頁面馬上又要換出外存。產生抖動的主要原因是進程頻繁訪問的頁面數目高於可用的物理塊數,也就是分配給進程的物理塊不夠。

工作集

工作集指在某段時間間隔里,進程實際訪問頁面的集合。
操作系統會根據“窗口尺寸”來算出工作集,工作集大小可能小於窗口尺寸。實際應用中操作系統可以統計進程的工作集大小,根據工作集大小給進程分配若干內存塊。例如窗口尺寸為 5,經過一段時間的監測發現某進程的工作集最大為 3,那么可以給這個進程分配 3 個以上的內存塊滿足運行需要。一般來說,駐留集大小不能小於工作集大小,否則進程運行過程中將頻繁缺頁。

防止抖動的方法

為了保證系統具有較大的吞吐量,必須防止“抖動”的發生,下面是幾個較常用的預防“抖動”發生的方法。

  1. 采取局部置換策略:當某進程發生缺頁時,只能在分配給自己的內存空間內進行置換,不允許從其它進程去獲得新的物理塊;
  2. 把工作集算法融入到處理機調度中:在調度程序從外存調入作業之前,必須先檢查每個進程在內存的駐留頁面是否足夠多。如果都已足夠多,此時便可以從外存調入新的作業,反之則應首先為那些缺頁率居高的作業增加新的物理塊;
  3. 利用“L = S”准則調節缺頁率:L 是缺頁之間的平均時間,S 是置換一個頁面所需的時間。如果是 L 遠比 S 大說明很少發生缺頁,反之則說明頻繁發生缺頁。理論和實踐證明利用“L = S”准則,對於調節缺頁率十分有效;
  4. 選擇暫停的進程:當多道程序度偏高時,基於某種原則選擇暫停某些當前活動的進程,將它們調出到磁盤上,以便把騰出的內存空間分配給缺頁率發生偏高的進程。

頁面置換算法

內存已無空閑空間時,為了保證該進程能正常運行,系統必須從內存中調出一頁程序或數據送到磁盤的對換區中。應將哪個頁面調出,須根據一定的算法來確定,選擇換出頁面的算法稱為頁面置換算法(Page-Replacement Algorithms)。置換算法的好壞將直接影響到系統的性能,不適當的算法可能會導致進程發生“抖動”,一個好的頁面置換算法應具有較低的頁面更換頻率

最佳置換算法

最佳置換算法是一種理論上的算法,其所選擇的被淘汰頁面將是以后永不使用或在最長未來時間內不再被訪問的頁面。采用最佳置換算法通常可保證獲得最低的缺頁率,但由於無法預知哪一個頁面是未來最長時間內不再被訪問的,因而該算法無法實現,但可以利用該算法去評價其它算法。
假定系統為某進程分配了三個物理塊,有以下的頁面號引用串。

7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

進程運行時先將 7,0,1 三個頁面裝入內存,當進程要訪問頁面 2 時將會產生缺頁中斷。此時 OS 根據最佳置換算法將選擇頁面 7 淘汰,這是因為頁面 0 將作為第 5 個被訪問的頁面,頁面 1 是第 14 個被訪問的頁面,而頁面 7 則要在第18次頁面訪問時才需調入。以此類推,得到采用最佳置換算法在各個頁面引用時的狀態。由表格可看出,采用最佳置換算法發生了 6 次頁面置換。

先進先出頁面置換算法

FIFO 算法總是淘汰最先進入內存的頁面,也就是選擇在內存中駐留時間最久的頁面予以淘汰。該算法實現簡單,但該算法與進程實際運行的規律不相適應,因為在進程中有些頁面經常被訪問,FIFO 算法並不能保證這些頁面不被淘汰。
假定系統為某進程分配了三個物理塊,有以下的頁面號引用串。

7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

采用 FIFO 算法進,當進程第一次訪問頁面 2 時將把第 7 頁換出,因為它是最先被調入內存的。在第一次訪問頁面 3 時,又將把第 0 頁換出,因為它在現有的 2、0、1 三個頁面中是最老的頁。利用 FIFO 算法時,進行了 12 次頁面置換,比最佳置換算法正好多一倍。

最近最久未使用置換算法

最近最久未使用 LRU(Least Recently Used)置換算法根據頁面調入內存后的使用情況做出決策的,LRU 算法是選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 t。當需淘汰一個頁面時,選擇現有頁面中其 t 值最大的頁面淘汰。LRU 置換算法雖然是一種比較好的算法,但要求系統有較多的支持硬件。可以為每個在內存中的頁面配置一個移位寄存器記錄未使用時間,也可以利用一個特殊的棧保存當前使用的各個頁面的頁面號。
假定系統為某進程分配了三個物理塊,有以下的頁面號引用串。

7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

當進程第一次對頁面 2 進行訪問時,由於頁面 7 是最近最久未被訪問的,故將它置換出去。當進程第一次對頁面 3 進行訪問時,第 1 頁成為最近最久未使用的頁,將它換出。利用 LRU 算法時,進行了 9 次頁面置換。

Clock 置換算法

時鍾置換算法是一種性能和開銷較均衡的算法,又稱 CLOCK 算法或最近未用(NRU,NotRecently Used)算法。

簡單的 CLOCK 算法

簡單的 CLOCK 算法為每個頁面設置一個訪問位,再將內存中的頁面都通過鏈接指針鏈接成一個循環隊列。當某頁被訪問時其訪問位為 1,當需要淘汰一個頁面時,只需檢查頁的訪問位。如果是 0 就選擇該頁換出,如果是 1 則將它置為 0,暫不換出並繼續檢查下一個頁面。若第一輪掃描中所有頁面都是 1,則將這些頁面的訪問位依次置為 0 后,再進行第二輪掃描。

改進的 CLOCK 算法

在將一個頁面換出時,如果該頁已被修改過,便須將該頁重新寫回到磁盤上。但如果該頁未被修改過,則不必將它拷回磁盤。對於修改過的頁面,在換出時所付出的開銷比未修改過的頁面大。在改進型 Clock 算法中,還須再增加一個置換代價的因素,這樣選擇頁面換出時,未使用過和未被修改過的頁面要綜合考慮。由訪問位 A 和修改位 M 可以組合成下面四種類型的頁面:

  1. A = 0,M = 0:該頁最近既未被訪問,又未被修改,是最佳淘汰頁。
  2. A = 0,M = 1:該頁最近未被訪問,但已被修改,並不是很好的淘汰頁。
  3. A = 1,M = 0:最近已被訪問,但未被修改,該頁有可能再被訪問。
  4. A = 1,M = 1:最近已被訪問且被修改,該頁可能再被訪問。

在進行頁面置換時,與簡單 Clock 算法的差別在於該算法須同時檢查訪問位 A 與修改位 M。其執行過程可分成以下三步:

  1. 從指針所指示的當前位置開始掃描循環隊列,尋找第一類頁面。將所遇到的第一個頁面作為所選中的淘汰頁,第一次掃描期間不改變訪問位 A;
  2. 如果第一步失敗則開始第二輪掃描,尋找第二類頁面,將所遇到的第一個這類頁面作為淘汰頁。在第二輪掃描期間,將所有掃描過的頁面的訪問位都置 0;
  3. 如果第二步也失敗則將指針返回到開始的位置,並將所有的訪問位復 0 然后重復第一步。如果仍失敗就再重復第二步,此時就一定能找到被淘汰的頁。

改進后的算法與簡單 Clock 算法比較,可減少磁盤的 I/O 操作次數。但為了找到一個可置換的頁,可能須經過幾輪掃描。

頁面緩沖算法

對於已經被修改過的頁面,在將其換出時應當寫回磁盤。如果每當有一個頁面要被換出時就將它寫回磁盤,這意味着每換出一個頁面,便需要啟動一次磁盤。頁面緩沖算法 PBA在系統中建立了一個已修改換出頁面的鏈表,對每一個要被換出的頁面(已修改),系統可暫不把它們寫回磁盤,而是將它們掛在已修改換出頁面的鏈表上。僅當被換出頁面數目達到一定值時,再將它們一起寫回到磁盤上,這樣就顯著地減少了磁盤 I/O 的操作次數。如果有進程在這批數據還未寫回磁盤時需要再次訪問這些頁面時,就不需從外存上調入,而直接從已修改換出頁面鏈表中獲取,這樣也可以減少將頁面從磁盤讀入內存的頻率。

請求分段存儲管理方式

請求分段存儲的硬件支持

與請求分頁系統相似,在請求分段系統中所需的硬件支持有段表機制、缺段中斷機構,以及地址變換機構。

請求段表

在請求分段式管理中所需的主要數據結構是請求段表,除了具有請求分頁機制中有的訪問字段 A、修改位 M、存在位 P 和外存始址四個字段外,還增加了存取方式字段和增補位,這些字段供程序在調進、調出時參考。

字段 說明
存取方式 可根據段的屬性對它實施保護,如果該字段為兩位,則存取屬性是只執行、只讀和允許讀/寫。
狀態位 P 指示該頁是否已調入內存,供程序訪問時參考
訪問字段 A 記錄本頁在一段時間內被訪問的次數,供置換頁面時參考
修改位 M 標識該頁在調入內存后是否被修改過,供置換頁面時參考
增補位 用於表示本段在運行過程中是否做過動態增長
外存地址 用於指出該頁在外存上的地址,通常是物理塊號,供調入該頁時參考

缺段中斷機構

在請求分段系統中采用的是請求調段策略,每當發現運行進程所要訪問的段尚未調入內存時,便由缺段中斷機構產生缺段中斷信號,進入 OS 后由缺段中斷處理程序將所需的段調入內存。與缺頁中斷機構類似,但由於分段是信息的邏輯單位,因而不可能出現一條指令被分割在兩個分段中和一組信息被分割在兩個分段中的情況。由於段不是定長的,這使對缺段中斷的處理要比對缺頁中斷的處理復雜。

地址變換機構

因為被訪問的段並非全在內存,所以在地址變換時若發現所要訪問的段不在內存,必須先將所缺的段調入內存並修改段表,然后才能再利用段表進行地址變換。為此在地址變換機構中又增加了某些功能,如缺段中斷的請求及處理等。

分段共享

分段存儲管理方式的優點是便於實現分段的共享與保護,實現分段共享可在系統中配置一張共享段表,所有各共享段都在共享段表中占有一表項。在表項的上面記錄了共享段的段號、段長、內存始址、狀態(存在)位、外存始址以及共享計數等信息,接下去就是記錄了共享此分段的每個進程的情況。

字段 說明
共享進程計數 count 記錄有多少進程正在共享該分段,當所有共享該段的進程全都不需要分段時才回收該段所占內存區
存取控制字段 對於一個共享段,應為不同的進程賦予不同的存取權限
段號 對於一個共享段,在不同的進程中可以具有不同的段號,每個進程可用自己進程的段號去訪問該共享段

在為共享段分配內存時,對第一個請求使用該共享段的進程,由系統為該共享段分配一物理區,再把共享段調入該區,同時將該區的始址填入請求進程的段表的相應項中。還須在共享段表中增加一表項,填寫請求使用該共享段的進程名、段號和存取控制等有關數據,把 count置為 1。當又有其它進程需要調用該共享段時,由於該共享段已被調入內存,故此時無須再為該段分配內存,而只需在調用進程的段表中增加一表項,再執行 count = count + 1 操作表明有兩個進程共享該段。
當共享此段的某進程不再需要該段時,應將該段釋放,包括撤消在該進程段表中共享段所對應的表項,以及執行 count = count - 1 操作。若結果為 0 則須由系統回收該共享段的物理內存,以及取消在共享段表中該段所對應的表項,否則只是取消調用者進程在共享段表中的有關記錄。

分段保護

在分段系統中,由於每個分段在邏輯上是相對獨立的,因而比較容易實現信息保護。目前常采用以下幾種措施:

  1. 越界檢查:在進行地址變換時,首先將邏輯地址空間的段號與段表長度進行比較,如果段號等於或大於段表長度,將發出地址越界中斷信號。此外還在段表中為每個段設置有段長字段,在進行地址變換時,還要檢查段內地址是否等於或大於段長,若大於段長,將產生地址越界中斷信號;
  2. 存取控制檢查:在段表的每個表項中都設置了一個“存取控制”字段,用於規定對該段的訪問方式,通常的訪問方式有只讀、只執行、讀/寫;
  3. 環保護機構:在該機制中規定:低編號的環具有高優先權,OS 核心處於 0 號環內,某些重要的實用程序和操作系統服務占居中間環,而一般的應用程序則被安排在外環上。

參考資料

《計算機操作系統(第四版)》,湯小丹 梁紅兵 哲鳳屏 湯子瀛 編著,西安電子科技大學出版社


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM