操作系統-存儲管理(4)段頁式虛擬存儲


物理地址:又稱絕對地址,即程序執行所使用的地址空間(處理器執行指令時按照物理地址進行)
邏輯地址:又稱相對地址,即用戶編程所使用的地址空間,從0開始編號,有兩種形式:一維邏輯地址(地址)
                                                                                                                    二維邏輯地址(段號:段內地址)
主存儲器空間的分配與去配:
  • 分配:進程裝入主存時,存儲管理軟件進行具體的主存分配操作,並設置一個表格記錄主存空間的分配情況
  • 去配:當某個進程撤離或主動歸還主存資源時,存儲管理軟件要收回它所占用的全部或者部分存儲空間,調整主存分配表信息
主存儲器空間的共享:
  • 多個進程共享主存儲器資源:多道程序設計技術使若干個程序同時進入主存儲器,各自占用一定數量的存儲空間,共同使用一個主存儲器
  • 多個進程共享主存儲器的某些區域:若干個協作進程有共同的主存程序塊或者主存數據塊
多道程序設計需要復用主存:
  • 按照分區復用:主存划分為多個固定/可變尺寸的分區,一個程序/程序段占用一個分區
  • 按照頁架復用:主存划分成多個固定大小的頁架,一個程序/程序段占用多個頁架

裝載程序/加載器(loader)把可執行程序裝入內存的方式有:
  • 絕對裝載
  • 可重定位裝載
  • 動態運行時裝載
地址轉換:又稱重定位,即把可執行程序邏輯地址轉換成絕對地址,可分為:
  • 靜態地址重定位:由裝載程序實現裝載代碼模塊的加載和地址轉換(無需硬件支持),把它裝入分配給進程的內存指定區域,其中所有指令代碼和數據的邏輯地址在執行前一次全部修改為內存物理地址。早期單任務單用戶OS使用。 
  • 動態地址重地位:由裝載程序實現裝載代碼模塊的加載,把它裝入進程的內存在指定區域,但對鏈接程序處理過的應用程序邏輯地址不做修改,程序內存起始地址被置入重定位寄存器(基址寄存器)。程序執行過程中每當CPU訪問程序和數據引用內存地址時,由硬件地址轉換機構截取此邏輯地址並加上重定位寄存器的值。
  • 運行時鏈接地址重定位
存儲保護:為避免主存中的多個進程相互干擾,必須對主存中的程序和數據進行保護。這一功能需要軟硬件協同完成,CPU檢查是否允許訪問,不允許則產生地址保護異常,由OS進行相應處理。
  • 數據段可指定R/W或RO;程序段可指定R/E或RO
  • 私有主存區中的信息可讀可寫;公共區中的共享信息則需根據授權
  • 非本進程信息、未獲授權的信息(如OS內核、頁表等)不可讀寫
以下情況會發生存儲保護錯:
  • 訪問越權(訪問操作與所擁有的訪問權限不符):頁表中設定訪問(存取)權限
  • 地址越界(轉換得到的物理地址不屬於可訪問范圍)
為了對操作系統的存儲保護提供支持,硬件必須具有以下三種基本功能:
  • 支持至少2種運行模式
                 管理模式:執行系統程序(內核)時處理器所處的模式,或稱管理程序模式,簡稱管態、管理態、核心態、內核態
                 用戶模式:CPU執行非操作系統的用戶程序時,處理器所處的模式,或稱用戶狀態、目標程序狀態,簡稱目態、用戶態
  • 使一部分CPU狀態只能由內核程序用管態指令(特權指令)讀寫而不能由用戶程序讀寫:User/SuperVisor模式位、頁表首地址、TLB等。
  • 提供讓CPU在管理模式和用戶模式相互轉換的機制:異常和陷阱(系統調用)使CPU從用戶態轉到內核態;異常處理中的“返回”指令使CPU從內核態轉到用戶態。
動態重定位、存儲保護等,若無硬件支撐在效率上是無意義、無實現價值的。
                               地址轉換/存儲保護的硬件支撐圖
內存不足的存儲擴充技術:
  • 移動技術:把已在內存中的進程分區連接到一起,也叫內存緊湊。
需要移動的兩種情況:
(1)進程撤銷之后釋放分區時,如果它不與空閑區鄰接,立刻移動使系統只保持一個空閑區
(2)進程裝入分區時,若空閑區總和夠用,但沒有空閑區能容納進程。
  • 對換技術:如果當前一個或多個駐留進程都處於阻塞態,將其暫時移出內存(通常換出時間片耗盡或優先級較低的進程),騰出空間
這一工作需要軟硬件協作完成,對換進程決定對換,硬件機構調入
  • 覆蓋技術:程序執行過程中不同的模塊在內存中相互替代,以達到小內存執行大程序的目的。
實現技術:用戶空間分為固定區和一個或多個覆蓋區,把控制或不可覆蓋部分放在固定區,其余按調用結構及先后關系分段並存放在磁盤上,運行時依次調入。
系統提供覆蓋控制程序及相應系統調用,當程序裝入運行時,由系統根據用戶給出的覆蓋結構進行覆蓋處理,程序員必須指明同時駐留在內存的是哪些程序段,哪些是被覆蓋的程序段(聲明從程序調用結構獲得)
  • 虛擬存儲器:在具有層次結構存儲器的計算機系統中,自動實現部分裝入和部分替換功能,從邏輯上為用戶提供一個比物理內存大得多的、可尋址的虛擬存儲器。
虛擬存儲器是一種地址空間擴展技術,通常意義上對用戶編程是透明的,除非用戶需要進行高性能的程序設計。
虛擬存儲器思想的提出原因:
(1)主存容量限制帶來諸多不便:用戶編寫程序必須考慮主存容量限制、多道程序設計的道數受到限制
(2)用戶編程行為分析:全面考慮各種情況,執行時有互斥性;順序性和循環性等空間局部性行為;某一階段執行的時間局部性行為
因此可以考慮部分調入進程內容
存儲管理把進程全部信息放在輔存中,執行時先將其中一部分裝入主存,以后根據執行行為隨用隨調入。如主存中沒有足夠的空閑空間,存儲管理需要根據執行行為把主存中暫時不用的信息調出到輔存上去。
CPU處理到不在主存的地址,硬件發出虛擬地址異常,OS將其調入,重執指令。
需要建立與自動管理兩個地址空間:(輔存)虛擬地址空間容納進程裝入、(主存)實際地址空間承載進程執行
“主存—輔存”層次與“Cache--主存”層次相比:
  • 頁大小(2KB~64KB)比Cache中的Block大得多,采用全相聯映射:因為缺頁時需要訪問磁盤(約幾百萬個時鍾周期),而cache缺失時訪問主存僅需幾十到幾百個時鍾周期,開銷比Cache缺失開銷大的多。因此,頁命中率比cache命中率更重要!“大頁面”和“全相聯”可提高頁命中率。
  • 通過軟件來處理“缺頁”:缺頁時需要訪問磁盤,慢,不能用硬件實現。
  • 采用Write Back寫策略:避免頻繁的慢速磁盤訪問操作。
  • 地址轉換用硬件實現:加快指令執行

存儲管理是OS管理主存儲器的軟件部分

  • 為獲得更好的處理性能,部分主存程序與數據(特別是關鍵性能數據)被調入Cache,存儲管理需要對其進行管理,甚至包括對聯想存儲器的管理

  • 為獲得更大的虛擬地址空間,存儲管理需要對存放在硬盤、固態硬盤、甚至網絡硬盤上的虛擬存儲器文件進行管理

存儲管理的基本模式可分為:

  • 單連續存儲管理:一維邏輯地址空間的程序占用一個主存固定分區或可變分區

  • 段式存儲管理:段式二維邏輯地址空間的程序占用多個主存可變分區

  • 頁式存儲管理:一維邏輯地址空間的程序占用多個主存頁架區

  • 段頁式存儲管理:段式二維邏輯地址空間的程序占用多個主存頁架區

41E9C181-B4AA-46EB-AD62-E28A2F9C3A76

單連續存儲管理

每個進程占用一個物理上完全連續的存儲空間(區域)

  • 單用戶連續存儲管理

主存區域划分為系統區與用戶區。設置一個柵欄寄存器界分兩個區域,硬件用它在執行時進行存儲保護。

一般采用靜態重定位進行地址轉換。

硬件實現代價低,適用於單用戶單任務操作系統,如DOS。

Image(17)

  • 固定分區存儲管理

支持多個分區,分區數量固定、大小固定。

可用靜態/動態重定位。

存儲保護一定是由硬件來做。

硬件實現代價低,一般為早期OS采用。

屏幕快照 2018-02-26 12.16.58

根據主存分配表進行主存分配與去配

Image(18)

硬件實現機制與動態重定位如圖:

Image(19)

  • 可變分區存儲管理

固定分區存儲管理不夠靈活,既不適應大尺寸程序,又存在內存內零頭,有浪費。

按照進程實際內存需求動態划分分區,創建一個進程時,根據進程所需主存量查看主存中是否有足夠的空閑空間,若有,則按需要量分割一個分區;若無,則令該進程等待主存資源。由於分區大小按照進程實際需要量來確定,因此分區個數是隨機可變的。

但可變分區方式也會隨着進程的內存分配產生一些小的不可用的內存分區,稱為內存外零頭。

Image(20)

根據已分配區表和未分配區表進行主存分配與去配。由於分區數量動態調整,起址也是動態可變的,因此兩張表一定鏈接成鏈表。

Image(21)

硬件實現機制與動態重定位如圖:

E343B1C3-47DB-48F5-A5E2-B28927BE7F98

可變分區方式的內存分配可算法有:

  1. 最先適應(first fit)分配算法:空閑區表按照內存起址先后組織成鏈表,總是在最前面找一個足夠的分區予以分配

  2. 鄰近適應(next fit)分配算法:把空閑區表組織成循環的隊列進行分配

  3. 最優適應(best fit)分配算法:按照分區大小組織成隊列,找一個最小的能夠容納該進程的分區予以分配。最容易產生外零頭。

  4. 最壞適應(worst fit)分配算法

  5. 快速適應(quick fit)分配算法:該算法為那些經常用到的長度的空閑區設立單獨的空閑區鏈表。此算法查找十分快速,只要按照進程長度直接搜索能容納它的最小空閑區鏈表並取第一塊分配,但歸還內存空間時與相鄰空閑區的合並復雜費時,而且存在一定空間浪費。

前四個為順序搜索法,快速適應算法又稱為分類搜索算法。

任何適配算法都不能避免產生外零頭,可以采用移動技術(程序浮動技術)移動分區以解決內存外零頭(需要動態重定位支撐)。

0C9D698C-A055-420B-A48B-EB24129E0497

頁式存儲管理

分頁存儲器將主存划分成多個大小相等的頁架,受頁架尺寸限制,程序的邏輯地址也自然分成頁。不同的頁可以放在不同頁架(不需要連續)中。

        頁式存儲管理的邏輯地址由兩部分組成,邏輯地址形式為頁號:單元號

        頁式存儲管理的物理地址也由兩部分組成:形式為頁架號:單元號

地址轉換可以通過查頁表完成。

4715FA22-DEE3-416A-9ED5-62F933D698AC

管理空閑主存空間:可用一張位示圖來記錄主存分配情況。為每一個頁架建立一個位來記載是否被占用(不需要記載被哪個進程占用);並記錄主存剩余的空閑塊數。

9D99E2B7-4F3D-42AA-8E6E-CF0208F990C3

頁式存儲管理能夠實現多個進程共享程序和數據

  • 數據共享:不同進程可以使用不同頁號共享數據頁

  • 程序共享:不同進程必須使用相同頁號共享代碼頁,共享代碼頁中的JMP <頁內地址>指令,使用不同頁號做不到

頁表放在主存,每次地址轉換必須訪問多次主存,先按頁號讀出頁表中的相應頁架號,再按計算出來的絕對地址進行讀寫,降低了存取速度。因此可以利用Cache存放部分頁表。設置一個專用的高速存儲器,用來存放TLB/快表,這種高速存儲器是聯想存儲器,即按照內容尋址,而非按照地址訪問。

TLB全相聯時,TLB中的頁表項沒有index,只有Tag,頁號需與每個Tag比較;

TLB組相聯時,則頁號高位為Tag,低位為index,用作組索引。

基於快表的地址轉換流程為:

  1. 按邏輯地址中的頁號查快表

  2. 若該頁已在快表中,則由頁架號和單元號形成絕對地址

  3. 若該頁不在快表中,則再查主存頁表形成絕對地址,同時將該頁登記到快表中

  4. 當快表填滿后,又要登記新頁時,則需在快表中按一定策略淘汰一個舊登記項

多道程序環境下需要有進程表登記每個進程的頁表。

每個進程有一個頁表用於維系進程的主存完整性。進程占有處理器運行時,其頁表起始地址和頁表長度送入頁表控制寄存器。

BBD2B54F-11C2-4240-99AA-B5F556D85E08

頁式虛擬存儲管理:把進程全部頁面裝入虛擬存儲器,執行時先把部分頁面裝入實際內存,然后,根據執行行為,動態調入不在主存的頁,同時進行必要的頁面調出,是現代OS的主流存儲管理技術。

首次只把進程第一頁信息裝入主存,稱為請求頁式存儲管理

Image(22)

需要擴產頁表項,其中有裝入位、修改(Dirt)位、替換控制位、訪問權限位、禁止緩存位、頁架號。

一個頁表的項數=虛擬地址空間大小/頁大小。

Image(23)

(1)未分配頁:進程的虛擬地址空間中“空洞”對應的頁(如VP0、VP4)

(2)已分配的緩存頁:有內容對應的已裝入主存的頁(如VP1、VP2、VP5等)

(3)已分配的未緩存頁:有內容對應但未裝入主存的頁(如VP3、VP6)

  • CPU處理地址,若頁駐留,則獲得塊號形成絕對地址;

  • 當裝入位V=0時,頁不在內存發生缺頁,則CPU發出缺頁中斷,當前進程被掛起。缺少的頁從磁盤讀到內存,若內存沒有空間,則還要從內存選擇一頁替換到磁盤上,更新頁表與快表,處理結束回到原指令繼續執行。替換算法類似於Cache,采用回寫法,淘汰時,根據dirty位確定是否要寫回磁盤。

  • 當讀寫操作不符合存取權限(Access Right)時,發生保護違例或訪問違例:在屏幕上顯示“內存保護錯”或“訪問違例”信息;當前指令的執行被阻塞,當前進程被終止

Image(24)

缺頁中斷的處理流程如圖:

Image(25)

當主存空間已滿而又需要裝入新頁時,頁式虛擬存儲管理必須按照一定的算法把已在主存的一些頁調出去。選擇淘汰頁的工作稱為頁面調度 ,選擇淘汰頁的算法稱為頁面調度算法,頁面調度算法設計不當,會出現剛被淘汰的頁面立即又要調入,並如此反復,這種現象稱為抖動或顛簸。

全局頁面替換策略:
  • 最佳頁面替換算法(OPT):理想的調度算法,只可模擬,不可實現。當要調入新頁面時,首先淘汰以后不再訪問的頁,然后選擇距現在最長時間后再訪問的頁。
  • 先進先出頁面調度算法(FIFO):總是淘汰最先調入主存的那一頁,或者說主存駐留時間最長的那一頁(常駐的除外)。模擬的是程序執行的順序性,有一定合理性。會出現Belady現象(如果對—個進程未分配它所要求的全部頁面,有時就會出現分配的頁面數增多但缺頁率反而提高)
  • 最近最少用頁面調度算法(LRU):淘汰最近一段時間內最久未被訪問的那一頁,認為那些剛被使用過的頁面可能還要立即被使用,而那些在較長時間內未被使用的頁面可能不會立即使用。模擬了程序執行的局部屬性,既考慮了循環性又兼顧了順序性,但嚴格實現的代價大(需要維持特殊隊列),模擬實現的方法為:
  1. 最近未使用頁面替換算法(NRU)/引用位法:每頁建一個引用位,供硬件使用;設置一個時間間隔中斷,周期性地把所有頁的引用位置0;地址轉換時,頁引用標志置1;淘汰頁面時,從頁引用標志為0的頁中間隨機選擇。該方法開銷小但時間間隔多長是個難點。
  2. 最不經常使用頁面替換算法(NFU)/計數法:基於時間間隔中斷,並給每一頁設置一個頁引用計數器;時間間隔中斷發生后,所有計數器置0;每訪問頁1次就給計數器加1;淘汰頁面時,選擇計數值最小的頁面淘汰。
  3. 計時法:基於時間間隔中斷,為每頁增設一個計時單元;每當頁面被引用時把當前絕對時間置入計時單元;時間間隔中斷發生后,所有計時單元全部清除;淘汰頁面時,選擇絕對時間最小的頁面淘汰。
  4. 老化算法:基於時間間隔中斷,為每個頁設置一個多位寄存器;每當頁面被訪問時,寄存器最左邊位置0;時間間隔中斷發生后,所有寄存器右移一位;淘汰頁面時,選擇值最小的寄存器對應的頁面淘汰。
  • 第二次機會頁面調度算法(SCR):淘汰最先進入內存的頁面如果最近還在使用,仍然有機會像新調入頁面一樣留在內存中。頁面調入主存時,其引用標志位置1;訪問主存頁面時,其引用標志位置1;淘汰頁面時,從FIFO頁面隊列對首開始掃描,把所遇到的引用標志位是1的頁面的引用標志位清0,並移至隊尾(看作新調入的頁再給一次機會),把所遇到的引用標志位是0的頁面淘汰(其最早進入內存且最久未被使用)。
  • 時鍾頁面替換算法(Clock):采用循環隊列機制構造頁面隊列,形成了一個類似於鍾表面的環形表。隊列指針則相當於鍾表面上的表針,指向可能要淘汰的頁面。使用頁引用標志位。頁面調入主存時,其引用標志位置1;訪問主存頁面時,其引用標志位置1;淘汰頁面時,從指針當前指向的頁面開始掃描循環隊列,把所遇到的引用標志位是1的頁面的引用標志位清0,並跳過,把所遇到的引用標志位是0的頁面淘汰,指針推進一步。

頁表及相關硬件機制在地址轉換、存儲保護、虛擬地址訪問中發揮了關鍵作用

為頁式存儲管理設置專門硬件機構內存管理單元MMU:CPU管理虛擬/物理存儲器的控制線路,把虛擬地址映射為物理地址,並提供存儲保護,必要時確定淘汰頁面

反置頁表IPT:有些操作系統采用反置頁表,它的優點是只需為所有進程維護一張表。針對內存中的每個頁架建立一個IPT表項,按照塊號排序(頁表按照頁號做索引、記的是頁架號,反置頁表則按照頁架號做索引、記進程號和頁號),用來完成內存頁架到訪問進程、頁號的對應,即物理地址到邏輯地址的轉換
表項包括:
  • 頁號:虛擬地址頁號
  • 進程標志符:使用該頁的進程號(頁號和進程標志符結合起來標志一個特定進程的虛擬地址空間的一頁
  • 標志位:有效、引用、修改、保護和鎖定等標志信息
  • 哈希鏈指針
基於反置頁表的地址轉換的過程為:
  1. MMU通過哈希表把進程標識和虛頁號轉換成一個哈希值,指向IPT的一個表目
  2. MMU遍歷哈希鏈找到所需進程的虛頁號,該項的索引就是頁架號,通過拼接位移便可生成物理地址(多個頁號經哈希函數轉換后可能獲得相同哈希值,需要利用哈希鏈處理這種沖突)
  3. 若遍歷整個反置頁表中未能找到匹配頁表項,說明該頁不在內存,產生缺頁中斷,請求操作系統調入

Image(26)

選擇淘汰頁面在圖中未顯示,同樣由MMU完成。
為了能讓進程共享內存中的頁面,必須擴展IPT表內容,使得每個表項可以記錄多個進程。
IPT能減少內存的占用,但IPT只包含調入內存的頁面,仍需為進程建立傳統頁表(放在磁盤上)。當發生缺頁異常時,把所需頁面調入內存要多訪問一次磁盤,速度會比較慢。

段式存儲管理

段式程序設計:把一個程序設計成多個段(代碼段、數據段、堆棧段等),用戶可以自己應用段覆蓋技術擴充內存空間使用量。每一段都可以從“0”開始編址,段內的地址是連續的。分段存儲器的邏輯地址由段號:單元號組成。

這一技術是程序設計技術,不是OS存儲管理的。段號和單元號是用戶程序自己設計的,用戶可控制,而頁號和單元號是系統切割的用戶不知道。

段式存儲管理基於可變分區存儲管理實現,一個進程要占用多個分區,硬件需要增加一組用戶可見的段地址寄存器(代碼段、數據段、堆棧段,附加段),供地址轉換使用;存儲管理需要增加設置一個段表,每個段占用一個段表項,包括:段始址、段限長,以及存儲保護、可移動、可擴充等標志位。

Image(27)

通過不同進程段表中的項指向同一個段基址來實現段的共享。對共享段的信息必須進行保護,如規定只能讀出不能寫入,不滿足保護條件則產生保護中斷。

段式虛擬存儲管理:把進程的所有分段都存放在輔存中,進程運行時先把當前需要的一段或幾段裝入主存,在執行過程中訪問到不在主存的段時再把它們動態裝入。段式虛擬存儲管理中段的調進調出是由OS自動實現的,對用戶透明,而段覆蓋技術則是用戶控制的主存擴充技術,OS不感知。

段式虛擬存儲管理需要進行段表的擴充

Image(28)

  • 特征位: 00(不在內存)01(在內存)11(共享段)

  • 存取權限: 00(可執行)01(可讀)11(可寫)

  • 擴充位: 0(固定長)1(可擴充)

  • 標志位: 00(未修改)01(已修改)11(不可移動)

Image(29)

段頁式存儲管理

段式存儲管理可以基於頁式存儲管理實現,每一段不必占據連續的存儲空間,可存放在不連續的主存頁架中

段表不再記錄基址與限長,而是記錄頁表的基址與限長

每一段有一個頁表。邏輯地址由段號:段內頁號:頁內偏移地址構成

Image(30)

Image(31)

還可以擴充為段頁式虛擬存儲管理,裝入部分段,或者裝入段中部分頁面

Image(32)


免責聲明!

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



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