一.虛擬內存的由來
1.問題提出:
當直接讓進程使用直接的物理內存時,當對物理內存操作時會出現混亂。比如進程A裝在0-30的物理內層,在29處是一條ADD指令。而進程B裝在30-40處第一條指令為JMP 29.沒有使用虛擬內存的話,進程B將直接跳到進程A從而使兩者程序都破壞掉。
2.解決辦法:
有兩種解決這個問題:一種通過基址寄存器和界線寄存器形成地址空間,通過交換技術解決內存超載。另外一種就是基於分頁的虛擬地址技術。
1)交換技術:把一個進程完整調入內存運行一段時間,然后把他存回磁盤,空閑進程主要存儲在磁盤上。缺點:當進程空間大於內存時,不能使用。
2)虛擬內存:把一個進程的一部分調入內存中運行,當內存沒有空閑空間時,將新的覆蓋舊的頁,同時將舊 是寫入磁盤。虛擬內存主要使用分頁存儲管理模式。
二. 分頁存儲管理
實際上存儲在物理內存上(磁盤上),運行時一頁一頁讀取;
1.基本思想
用戶程序的地址空間被划分成若干固定大小的區域,稱為“頁”,相應地,內存空間分成若干個物理塊,頁和塊的大小相等。可將用戶程序的任一頁放在內存的任一塊中,實現了離散分配。
1) 等分內存
頁式存儲管理將內存空間划分成等長的若干物理塊,成為物理頁面也成為物理塊,每個物理塊的大小一般取2的整數冪。內存的所有物理塊從0開始編號,稱作物理頁號。
2) 邏輯地址
系統將程序的邏輯空間按照同樣大小也划分成若干頁面,稱為邏輯頁面也稱為頁。程序的各個邏輯頁面從0開始依次編號,稱作邏輯頁號或相對頁號。每個頁面內從0開始編址,稱為頁內地址。程序中的邏輯地址由兩部分組成:頁號P和頁內位移量W。
在執行一個程序之前,內存管理器需要的准備工作:
1) 確定程序的頁數
2) 在主存中留出足夠的空閑頁面
3) 將程序的所有頁面載入主存里。(靜態的分頁,頁面無需連續)
2. 分頁存儲管理的地址機構
頁號x位,每個作業最多2的x次方頁,頁內位移量的位數表示頁的大小,若頁內位移量y位,則2的y次方,即頁的大小,頁內地址從000000000000開始到2的y次方
若給定一個邏輯地址為A,頁面大小為L,則
頁號P=INT[A/L],頁內地址W=A MOD L
3.內存分配
相鄰的頁面在內存中不一定相鄰,即分配給程序的內存塊之間不一定連續。對程序地址空間的分頁是系統自動進行的,即對用戶是透明的。由於頁面尺寸為2的整數次冪,故相對地址中的高位部分即為頁號,低位部分為頁內地址。
4. 頁表
分頁系統中,允許將進程的每一頁離散地存儲在內存的任一物理塊中,為了能在內存中找到每個頁面對應的物理塊,系統為每個進程建立一張頁表,用於記錄進程邏輯頁面與內存物理頁面之間的對應關系。頁表的作用是實現從頁號到物理塊號的地址映射,地址空間有多少頁,該頁表里就登記多少行,且按邏輯頁的順序排列,形如:
5. 地址變換(MMu)
頁式虛擬存儲系統的邏輯地址是由頁號和頁內地址兩部分組成,地址變換過程如圖7-3所示。假定頁面的大小為4K,圖7-3中所示的十進制邏輯地址8203經過地址變換后,形成的物理地址a應為十進制。
頁號: 8203/4096 = 2;頁內偏移:8203%4096= 11;物理地址:物理塊號*頁面大小+ 頁內偏移= 28683。
6. 具有快表的地址變換機構
分頁系統中,CPU每次要存取一個數據,都要兩次訪問內存(訪問頁表、訪問實際物理地址)。為提高地址變換速度,增設一個具有並行查詢能力的特殊高速緩沖存儲器,稱為“聯想存儲器”或“快表”,存放當前訪問的頁表項。
7.頁面的共享與保護
當多個不同進程中需要有相同頁面信息時,可以在主存中只保留一個副本,只要讓這些進程各自的有關項中指向內存同一塊號即可。同時在頁表中設置相應的“存取權限”,對不同進程的訪問權限進行各種必要的限制。
8.頁面置換:
當進程在物理內存中運行時,調用到不在物理內存中的虛擬頁面時,MMU注意到該頁面沒有被映射到物理內存,於是cpu陷入到操作系統,這個陷阱稱為缺頁中斷,操作系統找到一個很少使用的頁框且把他的內容寫入磁盤備份。隨后把需要訪問的虛擬頁面讀到剛才回收的頁框中,修改映射關系,然后重新啟動引起陷阱的指令。
主要的頁面置換算法有:
三.分段存儲管理
1.基本思想
頁面是主存物理空間中划分出來的等長的固定區域。分頁方式的優點是頁長固定,因而便於構造頁表、易於管理,且不存在外碎片。但分頁方式的缺點是頁長與程序的邏輯大小不相關。例如,某個時刻一個子程序可能有一部分在主存中,另一部分則在輔存中。這不利於編程時的獨立性,並給換入換出處理、存儲保護和存儲共享等操作造成麻煩。
另一種划分可尋址的存儲空間的方法稱為分段。段是按照程序的自然分界划分的長度可以動態改變的區域。通常,程序員把子程序、操作數和常數等不同類型的數據划分到不同的段中(寫c程序時會用到),並且每個程序可以有多個相同類型的段。
段表本身也是一個段,可以存在輔存中,但一般是駐留在主存中。
將用戶程序地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯信息。存儲分配時,以段為單位,段與段在內存中可以不相鄰接,也實現了離散分配。
2. 分段地址結構
作業的地址空間被划分為若干個段,每個段定義了一組邏輯信息。例程序段、數據段等。每個段都從0開始編址,並采用一段連續的地址空間。段的長度由相應的邏輯信息組的長度決定,因而各段長度不等。整個作業的地址空間是二維的。
在段式虛擬存儲系統中,虛擬地址由段號和段內地址組成,虛擬地址到實存地址的變換通過段表來實現。每個程序設置一個段表,段表的每一個表項對應一個段,每個表項至少包括三個字段:有效位(指明該段是否已經調入主存)、段起址(該段在實存中的首地址)和段長(記錄該段的實際長度)。
3. 地址變換
針對每一個虛擬地址,存儲管理部件首先以段號S為索引訪問段表的第S個表項。若該表項的有效位為1,則將虛擬地址的段內地址D與該表項的段長字段比較;若段內地址較大則說明地址越界,將產生地址越界中斷;否則,將該表項的段起址與段內地址相加,求得主存實地址並訪存。如果該表項的有效位為0,則產生缺頁中斷,從輔存中調入該頁,並修改段表。段式虛擬存儲器虛實地址變換過程如圖所示。
絕對地址=根據段號找到段表中的起始地址+段內地址 (如果段內地址超過限長則產生“地址越界”程序性中斷事件達到存儲保護)
4. 分段存儲方式的優缺點
分頁對程序員而言是不可見的,而分段通常對程序員而言是可見的,因而分段為組織程序和數據提供了方便。與頁式虛擬存儲器相比,段式虛擬存儲器有許多優點:
(1) 段的邏輯獨立性使其易於編譯、管理、修改和保護,也便於多道程序共享。
(2) 段長可以根據需要動態改變,允許自由調度,以便有效利用主存空間。
(3) 方便編程,分段共享,分段保護,動態鏈接,動態增長
因為段的長度不固定,段式虛擬存儲器也有一些缺點:
(1) 主存空間分配比較麻煩。
(2) 容易在段間留下許多碎片,造成存儲空間利用率降低。
(3) 由於段長不一定是2的整數次冪,因而不能簡單地像分頁方式那樣用虛擬地址和實存地址的最低若干二進制位作為段內地址,並與段號進行直接拼接,必須用加法操作通過段起址與段內地址的求和運算得到物理地址。因此,段式存儲管理比頁式存儲管理方式需要更多的硬件支持。
四.段頁式存儲
1. 段頁式存儲管理的基本思想
段頁式存儲組織是分段式和分頁式結合的存儲組織方法,這樣可充分利用分段管理和分頁管理的優點。
(1) 用分段方法來分配和管理虛擬存儲器。程序的地址空間按邏輯單位分成基本獨立的段,而每一段有自己的段名,再把每段分成固定大小的若干頁。
(2) 用分頁方法來分配和管理實存。即把整個主存分成與上述頁大小相等的存儲塊,可裝入作業的任何一頁。程序對內存的調入或調出是按頁進行的。但它又可按段實現共享和保護。
地址空間圖
(3) 邏輯地址結構。一個邏輯地址用三個參數表示:段號S;頁號P;頁內地址d。
邏輯地址結構
(4)段表、頁表、段表地址寄存器。為了進行地址轉換,系統為每個作業建立一個段表,並且要為該作業段表中的每一個段建立一個頁表。系統中有一個段表地址寄存器來指出作業的段表起始地址和段表長度。
2.地址變換過程
一個邏輯地址為:基地址x、段號s、頁號p和頁內地址d,求物理地址:(((x)+s)+p)*2^(11)+d
在段頁式系統中,為了便於實現地址變換,須配置一個段表寄存器,其中存放段表始址和段表長TL。
1) 進行地址變換時,首先利用段號S,將它與段表長TL進行比較。若S<TL,表示未越界
2) 於是利用段表始址和段號來求出該段所對應的段表項在段表中的位置,從中得到該段的頁表始址
3) 利用邏輯地址中的段內頁號P來獲得對應頁的頁表項位置,從中讀出該頁所在的物理塊號b
4) 再利用塊號b和頁內地址來構成物理地址。
上圖示出了段頁式系統中的地址變換機構。在段頁式系統中,為了獲得一條指令或數據,須三次訪問內存。第一次訪問是訪問內存中的段表,從中取得頁表始址;第二次訪問是訪問內存中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址一起形成指令或數據的物理地址;第三次訪問才是真正從第二次訪問所得的地址中,取出指令或數據。
顯然,這使訪問內存的次數增加了近兩倍。為了提高執行速度,在地址變換機構中增設一個高速緩沖寄存器。每次訪問它時,都須同時利用段號和頁號去檢索高速緩存,若找到匹配的表項,便可從中得到相應頁的物理塊號,用來與頁內地址一起形成物理地址;若未找到匹配表項,則仍須再三次訪問內存。
3.段頁式存儲管理的優缺點
優點
(1) 它提供了大量的虛擬存儲空間。
(2) 能有效地利用主存,為組織多道程序運行提供了方便。
缺點:
(1) 增加了硬件成本、系統的復雜性和管理上的開消。
(2) 存在着系統發生抖動的危險。
(3) 存在着內碎片。
(4) 還有各種表格要占用主存空間。
段頁式存儲管理技術對當前的大、中型計算機系統來說,算是最通用、最靈活的一種方案。