一、段頁式內存管理的概念
頁式存儲管理能有效地提高內存利用率,而分段存儲管理能反映程序的邏輯結構並有利於段的共享。如果將這兩種存儲管理方法結合起來,就形成了段頁式存儲管理方式。
段頁式管理就是將程序分為多個邏輯段,在每個段里面又進行分頁,即將分段和分頁組合起來使用。這樣做的目的就是想同時獲得分段和分頁的好處,但又避免了單獨分段或單獨分頁的缺陷。
如果我們將每個段看做一個單獨的程序,則邏輯分段就相當於同時加載多個程序。
二、段頁式內存管理的實現
在段頁式系統中,作業的邏輯地址分為三部分:段號、頁號和頁內偏移量,如圖所示。 為了實現地址變換,系統為每個進程建立一張段表,而每個分段有一張頁表(在一個進程中,段表只有一個,而頁表可能有多個)。段表表項中至少包括段號、頁表長度和頁表起始地址,頁表表項中至少包括頁號和塊號。此外,系統中還應有一個段表寄存器,指出作業的段表起始地址和段表長度。
在進行地址變換時,首先通過段表查到頁表起始地址,然后通過頁表找到頁幀號,最后形成物理地址。如圖所示,進行一次訪問實際需要三次訪問主存,這里同樣可以使用快表以加快查找速度,其關鍵字由段號、頁號組成,值是對應的頁幀號和保護碼。
頁式管理的基本概念
頁框(頁幀):將內存空間分成一個個大小相等的分區,每個分區就是一個頁框。頁框號:每一個頁框有一個編號,這個編號就是頁框號,從0開始
頁(頁面):將進程分割成和頁框大小相等的一個個區域,也叫頁頁號:每一二個頁面有一個編號,叫做頁號,從0開始注意:由於最后一個頁面可能沒有頁框那么大,所以頁框不可以太大,否則會產生過大的內存碎片
操作系統會以頁框為單位為各個進程分配內存空間,進程的每一個頁面分別放入一個頁框中,也就是進程的頁面和內存的頁框具有一一對應的關系
注意:各個頁面不需要連續存放,可以放到不相鄰的各個頁框中
如何實現地址的轉化
1.首先需要知道一個進程內的頁對應物理內存中的起始地址a是多少2.其次要知道進程頁內地址b是多少3.邏輯地址對應的實際物理地址就是c=a+b
如何計算?比如邏輯地址80確定頁號:頁號=邏輯地址/頁面長度 1=80/50頁內偏移量:頁內偏移量=邏輯地址%頁面長度 30=80%50每個進程頁面對應物理內存中頁框的首地址:這是通過頁表查詢到的,比如查詢到對應物理內存首地址是4500那么對應最終物理地址就是4500+30=4530
頁表
頁表的存在是為了讓我們知道進程中的一個頁的頁號對應它存放在物理內存中的頁框號,進而求出頁框號對應的首地址
邏輯地址的結構
假如頁號有k位,那么頁數就是2^k個假如頁內地址m位,那么頁內地址有2^m個
靜態頁面管理
在作業或進程開始執行之前,把作業或進程的程序段和數據全部裝入內存的各個頁面中,並通過頁表(page mapping table)和硬件地址變換機構實現虛擬地址到內存物理地址的地址映射。
內存頁面分配與回收
靜態分頁管理的第一步是為要求內存的作業或進程分配足夠的頁面。
依賴數據結構:
頁表:1.頁表在內存中占有一塊固定的存儲區。頁表的大小由進程或作業的長度決定。2.對於一個每頁長1K,大小為20K的進程來說,如果一個內存單元存放一個頁表項,需要分配給該頁表20個存儲單元。3.頁式管理時每個進程至少擁有一個頁表。
請求表:1.用來確定作業或進程虛擬空間的各頁在內存中的實際對應位置。為此,系統必須知道每個作業或進程的頁表起始地址和長度。2.此外,請求表還包括每個作業或進程要求的頁面數。請求表整個系統一張
存儲頁面表:
記錄內存各頁面是否已被分配出去,以及未分配頁面的總數。
位示圖法:在內存中划分一塊固定區域,每個單元的每個比特代表一個頁面。如果該頁面已被分配,則對應比特位置1,否則置0。一個划分為1024個頁面的內存,如果內存單元長20比特,則位示圖要占據1024/20=52個內存單元。
空閑頁面鏈法:1.空閑頁面鏈中,隊首頁面的第一個單元和第二個單元分別放入空閑頁面總數與指向下一個空閑頁面的指針。其他頁面的第一個單元分別存放指向下一個頁面的指針。2.空閑頁面鏈的方法使用空閑頁面本身的單元存放指針,因此不占據額外的內存空間。
2.分配算法
1.首先,基於請求表獲取進程或作業要求的頁面數。2.然后,基於存儲頁面表檢查是否有足夠的空閑頁面。3.如果沒有,則本次無法分配。4.如果有則分配設置頁表,填寫請求表中的相應表項;按一定查找算法搜索出所要求的空閑頁面,並將對應的頁面號填入頁表中。
3.地址變換
地址變換過程全部由硬件地址變換機構自動完成。
設一個3頁長的進程頁號為0、1、2,其對應的頁面號分別為2、3、8。設每個頁面長度為1K,指令LOAD 1,2500的虛地址為100。
1.首先,需要一個保存頁表始址和頁表長度用的控制寄存器。系統把所調度執行的進程的頁表始址和長度從請求表中取出置入控制寄存器中。2.然后,由控制寄存器的頁表始址,找到頁表所在位置。並由虛地址100可知,指令LOAD 1,2500在第0頁的第100單元。由於第0頁與第2個頁面相對應,因此,該指令在內存中的地址為2048+100=2148。3.當CPU執行到第2148單元的指令時,CPU要從有效地址2500中取數據放入1號寄存器中。為了找出2500對應的實際物理地址,地址變換機構首先將2500轉換為頁號與頁內相對地址組成的地址形式。即p=2,w=452。4.由頁表,可知第2頁對應的頁面號等於8。最后,將頁面號8與頁內相對地址w=452相連,得到待訪問的物理內存地址8644。
快表:
取一個數據或指令至少要訪問內存兩次以上。1.一次訪問頁表以確定所取數據或指令的物理地址2.另一次是根據地址取數據或指令
提高速度:1.把頁表放在寄存器中,但寄存器價格太貴。2.在地址變換機構中加入一個高速聯想存儲器,構成一張快表。在快表中,存入那些當前執行進程中最常用的頁號與對應的頁面號,從而提高查找速度。
靜態頁式管理的問題
動態頁式管理分為請求頁式管理和預調入頁式管理。1.由於靜態頁式管理要求進程或作業在執行前全部裝入內存,如果可用頁面數小於用戶要求時,該作業或進程只好能等待。2.而且,作業或進程的大小仍受內存可用頁面數的限制。
動態頁式管理
請求頁式管理和預調入頁式管理在作業或進程開始執行之前,不把作業或進程的程序段和數據段一次性地全部裝入內存,而只裝入經常反復執行和調用的工作區部分。其他部分在執行過程中動態裝入。
請求調入
需要執行的某條指令不在內存,或執行某條指令需要訪問的其他數據或指令不在內中,則發生缺頁中斷,系統將外存中相應的頁面調入內存。
請求頁式管理只允許進程或作業的部分程序和數據駐留在內存中,因此,執行過程不可避免地會出現某些虛頁不在內存中的問題。
怎樣發現不在內存中的虛頁以及怎樣處理這種情況,是請求頁式管理必須解決的兩個基本問題。
怎樣發現不在內存中的虛頁
擴充頁表:即除了頁面號之外,每個虛頁號再增設該頁是否在內存的中斷位以及該頁在外存中的副本起始地址。
虛頁不在內存時的處理
1)采用何種方式把所缺的頁調入內存。
根據內存中的程序是否被修改過,決定是否寫回到外存。如何確定是否修改過,是通過頁表新加的改變位
如果內存中被淘汰的某一頁,曾因程序的執行而被修改,則該頁應該重新寫到外存上加以保存。而那些未被訪問修改的頁,因為外存已保留有相同的副本,沒有必要寫回外存。因此,在頁表中還應增加一項以記錄該頁是否曾被改變。
2)如果內存中沒有空閑頁面,調進來的頁放在什么地方。即采用什么策略淘汰已占據內存的頁。
- 內存頁面置換算法直接影響內存利用率和系統效率。
- 如果置換算法選擇不當,有可能剛被調出內存的頁又馬上被調回內存,調回內存不久又馬上被調出內存。
- 這使得整個系統的頁面調度非常頻繁,以致大部分時間花費在主存和輔存之間的來回調入調出上。這種現象被稱為**抖動(thrashing)**現象。
整個流程:
- 其中有關地址變換部分由硬件自動完成。
- 當硬件變換機構發現所要求的頁不在內存時,產生缺頁中斷信號,由中斷處理程序做出相應的處理。
- 中斷處理程序由軟件實現。
請求調入的缺點:請求頁式管理是一個十分復雜的處理過程,犧牲系統開銷提高內存利用率。原因:除了在沒有空閑頁面時要按照置換算法選擇被淘汰頁面之外,還要從外存讀入所需要的虛頁。這個過程要啟動相應的外存和涉及到文件系統。
請求頁式管理中的置換算法
1.隨機淘汰算法(random glongram):在無法確定哪些頁被訪問的概率較低時,隨機選擇某個用戶的頁面將其換出。
2.輪轉法(round robin): 循環換出內存可用區內一個可以被換出的頁,無論該頁是剛被換進或已換進內存很長時間。
- 內存利用率不高
3.先進先出算法(FIFO):選擇在內存駐留時間最長的一頁將其淘汰。
-
內存利用率不高
-
陷阱現象:一般來說,給任一作業或進程分配的內存頁面數越接近於它所要求的頁面數,則發生缺頁的次數會越少。極限情況下,這個推論是成立的。使用FIFO算法時,在未給進程或作業分配足它所要求頁面數的情況下,有時會出現分配的頁面數增多,缺頁次數反而增加的奇怪現象。這種現象稱為Belady現象
Belady現象的例子:
設進程P有8頁,且已在內存中分配3個頁面,程序訪問內存的順序(訪問串)為7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1。下表給出內存中進程P所建的程序和數據的各頁面變化情況。
內存中給這個進程分配了三個頁面,程序訪問的頁號依次是7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1一開始的時候三個頁面都是空的,它要求7號頁,7號頁不在內存中,所以要從外存調入一次缺頁中斷,0同理不在內存中調入,兩次缺頁了,1也不在,3次缺頁,2頁不在,但是現在內存滿了,7由於最先到的,先淘汰它,2號進來,4次缺頁,0號在內存中不發生缺頁,之后依次是3,0,4,2,3,0,3,2,1,2,0,1號頁。同理可得圖片中黃色代表缺頁了,缺頁12次,訪問17次,缺頁率12/17=70.5%。
如果給進程P分配4個頁面,則在其執行過程中內存頁面的變化情況如下表所示。進程P在擁有4個內存頁面時,共發生9次缺頁,其缺頁率為9/17=52.9%。
設進程P可分為5頁,訪問串為1,2,3,4,1,2,5,1,2,3,4,5。當進程P分得3個頁面時,執行過程中內存頁面變化如下表所示。進程P在執行過程中共缺頁9次,其缺頁率為9/12=75%。
如果為進程P分配4個內存頁面,是否缺頁率會變小呢?進程P分得4個頁面時,執行過程中內存頁面的變化情況如下表。當進程P分得4個頁面時,執行過程中的缺頁次數為10次。即缺頁率=10/12=83.3%。先進先出算法產生Belady現象的原因在於它沒有考慮程序執行的動態特征。
4.最近最久未使用頁面置換算法(least recently used)
基本思想:當需要淘汰某一頁時,選擇離當前時間最近的一段時間內最久沒有使用過的頁先淘汰。該算法的主要出發點是,如果某頁被訪問了,則它可能馬上還要被訪問。或者反過來說,如果某頁很長時間未被訪問,則它在最近一段時間也不會被訪問。缺點:要完全實現LRU算法是一件十分困難的事情。因為要找出最近最久未被使用的頁面,必須對每一個頁面設置訪問記錄項,而且每一次訪問都必須更新這些記錄,這需要花費巨大的系統開銷。因此,在實際系統中往往使用LRU的近似算法。
5.最不經常使用頁面淘汰算法LFU(least frequently used)。該算法在需要淘汰某一頁時,首先淘汰到當前時間為止,被訪問次數最少的那一頁。在頁表中給每一頁增設一個訪問計數器即可實現。某頁被訪問時,該頁訪問計數器加1,發生缺頁中斷時,淘汰計數值最小的那一頁,並將所有的計數器清零。
6.最近沒有使用頁面淘汰算法NUR。該算法在需要淘汰某一頁時,從那些最近一個時期內未被訪問的頁中任選一頁淘汰。在頁表中增設一個訪問位即可實現。當某頁被訪問時,訪問位置1。否則,訪問位置0。系統周期性地對所有訪問位清零。需淘汰一頁時,從那些訪問位為零的頁中選一頁淘汰。
7.理想型淘汰算法OPT(optimal replacement algorithm)該算法淘汰在訪問串中將來再也不出現的或是在離當前最遠的位置上出現的頁。淘汰掉該頁不會造成因需要訪問該頁又立即把它調入的現象。這種算法無法實現,因為它要求必須預先知道每一個進程的訪問串。
預調入
系統對外存中的頁進行調入順序計算,估計這些頁中指令和數據的執行和被訪問順序,並按此順序將它們順次調入和調出內存。
頁式管理存儲保護
- 地址越界保護:地址變換機構中的控制寄存器的頁表長度 VS. 要訪問的虛地址。
- 存儲控制保護:在頁表中增加保護位用於控制內存信息的存取操作方式:。
頁式管理的優缺點
優點:
- 不要求作業或進程的程序段和數據在內存中連續存放,有效地解決了碎片問題。
- 動態頁式管理提供內存和外存統一管理的虛存實現方式,大大增加用戶可以利用的存儲空間。既提高了主存的利用率,又有利於組織多道程序執行。
缺點:
- 要求相應硬件支持。例如地址變換機構,缺頁中斷的產生等都要求有相應的硬件支持。增加了機器成本。
- 增加了系統開銷,例如缺頁中斷處理等。
- 請求調頁的算法如選擇不當,有可能產生抖動現象。
- 雖然消除了碎片,但每個作業或進程的最后一頁內總有一部分空間得不到利用。如果頁面較大,這一部分的損失較大。
一、分頁系統的缺點
分頁系統存在的一個無法容忍,同時也是分頁系統無法解決的一個缺點就是:一個進程只能占有一個虛擬地址空間。在此種限制下,一個程序的大小至多只能和虛擬空間一樣大,其所有內容都必須從這個共同的虛擬空間內分配。
二、分段管理系統
1、分段管理的概念
分段管理就是將一個程序按照邏輯單元分成多個程序段,每一個段使用自己單獨的虛擬地址空間。例如,對於編譯器來說,我們可以給其5個段,占用5個虛擬地址空間,並分配一段連續的地址空間(段內要求連續,段間不要求連續,因此整個作業的地址空間是二維的)。其邏輯地址由段號S與段內偏移量W兩部分組成。如下圖所示: 如此,一個段占用一個虛擬地址空間,不會發生空間增長時碰撞到另一個段的問題,從而避免因空間不夠而造成編譯失敗的情況。如果某個數據結構對空間的需求超過整個虛擬之地所能夠提供的空間,則編譯仍將失敗。不過出現這種可能的概率恐怕不會比太陽從西邊出來的概率高出多少。
在頁式系統中,邏輯地址的頁號和頁內偏移量對用戶是透明的,但在段式系統中,段號和段內偏移量必須由用戶顯示提供,在髙級程序設計語言中,這個工作由編譯程序完成。
https://img-blog.csdn.net/20150923210221157
2、段表
每個進程都有一張邏輯空間與內存空間映射的段表,其中每一個段表項對應進程的一個段,段表項記錄該段在內存中的起始地址和段的長度。 在配置了段表后,執行中的進程可通過查找段表,找到每個段所對應的內存區。可見,段表用於實現從邏輯段到物理內存區的映射,如圖3-14所示。
https://img-blog.csdn.net/20150923210354908
https://img-blog.csdn.net/20150923210436674
3、信息共享
分段系統的一個突出優點,是易於實現段的共享,對段的保護也十分簡單。
4、分段內存管理的優缺點
【優點】:
- 每個邏輯單元可單獨占用一個虛擬地址空間,這樣使得編寫程序的空間大為增長。
- 由於段式按邏輯關系划分,因此信息共享起來十分方便。
- 對於空間稀疏的程序來說,分段管理將節省大量的空間。
【缺點】:
- 存在外部碎片,一個段必須全部加載到內存。
三、分頁與分段的主要區別
- 頁式系統中,邏輯地址的頁號和頁內偏移量對用戶是透明的,但在段式系統中,段號和段內偏移量必須由用戶顯示提供。
- 分頁是一維地址空間,分段是二維的(段內和段間)。
- 頁的大小不可變,段的大小可以動態改變。
- 頁和段都有存儲保護機制。但存取權限不同:段有讀、寫和執行三種權限;而頁只有讀和寫兩種權限。