操作系统第三章-内存管理
寫在前面:本文參考王道論壇的 操作系統考研復習指導單科書
下面的流程圖很重要。
加入快表的基本分頁
加入快表的二級頁表!!
虛擬存儲器:請求分頁的流程圖。
文章目錄
- 第三章 內存管理
- 3.1 內存管理概念
- 3.1.1 內存管理的基本原理和要求
- 1 程序裝入和鏈接
- 2 邏輯地址空間與物理地址空間
- 3 內存保護
- 3.1.2 覆蓋與交換
- 1 覆蓋
- 2 交換
- 3.1.3 連續分配管理方式
- 1 單一連續分配
- 2 固定分區分配
- 3 動態分區分配
- 3.1.4 非連續分配管理方式
- 1 基本分頁存儲管理方式
- (1)分頁存儲的幾個基本概念
- (2) 基本地址變換機構
- (3)具有快表的地址變換機構
- (4)兩級頁表
- 2 基本分段存儲管理方式
- 3 段頁式管理方式
- 王道習題(二級頁表)
- 3.2虛擬內存管理
- 3.2.1 虛擬內存的基本概念
- 3.2.2 請求分頁管理方式
- 3.2.3 頁面置換算法
- 1. 最佳(OPT)置換算法
- 2. 先進先出(FIFO)置換算法
- 3.最近最久未使用(LRU)置換算法
- 4. 時鐘(CLOCK)置換算法
- 3.2.4 頁面分配策略
- 3.2.5 抖動
- 3.2.6 工作集
- 王道習題
第三章 內存管理
3.1 內存管理概念
3.1.1 內存管理的基本原理和要求
內存管理是操作系統設計中最重要和最復雜的內容之一。雖然計算機硬件技術一直在發展,內存容量也在不斷增大,但是仍然不可能將所有的用戶進程和系統所需要的全部程序與數據放入內存,因此操作系統必須對內存空間進行合理的劃分和有效的動態分配。 操作系統對內存的劃分和動態分配,就是內存管理的概念。
1 程序裝入和鏈接
創建進程首先要將程序和數據裝入內存。將用戶源程序變為可在內存中執行的程序,通常需要以下幾個步驟:
- 編譯。由編譯程序將用戶源代碼編譯成若干目標代碼。就是.o文件,每個模塊的編址相互獨立,都從0開始。
- 鏈接。由鏈接程序將編譯后形成的一組目標模塊及所需的庫函數鏈接在一起,形成一個完整的裝入模塊。就是.exe文件。
- 裝入。由裝入程序將裝入模塊裝入內存中運行。
程序的鏈接有以下三種方式
1)靜態鏈接。在程序運行之前,先將各目標模塊及它們所需要的庫函數鏈接成一個可執行程序,以后不再拆開。
2)裝入時動態鏈接。將用戶源程序編譯后所得到的一組目標模塊,在裝入內存時,采用邊裝入邊鏈接的方式。
3)運行時動態鏈接。對某些目標模塊的鏈接,是在程序執行中需要該目標模塊時才進行的。優點是便于修改和更新,便于實現對目標模塊的共享。
內存的裝入模塊在裝入內存時,同樣有三種方式。
1)絕對裝入。 在編譯時,若知道程序將駐留在內存中的某個位置,則編譯程序將產生絕地地址的目標代碼。 絕對裝入程序按照裝入模塊中的地址,將程序和數據裝入內存。 由于程序中的邏輯地址與實際內存地址完全相同,因此不需要對程序和數據的地址進行修改。
絕對裝入方式只適用于單道程序設計。另外,程序中所用的絕對地址,可在編譯或匯編時給出,也可以由程序員直接賦予。而通常情況下在程序中采用的是符號地址,編譯或匯編時再轉換為絕對地址。
2)可重定位裝入。在多道程序設計下,多個目標模塊的起始地址(簡稱始址)通常都是從0開始,程序中的其他地址都是相對于始址的,此時應采用可重定位裝入方式。 根據內存的當前情況,將裝入模塊裝入內存的適當位置。裝入時對目標程序中指令和數據的修改過程稱為重定位。地址變換通常是在裝入時一次完成的,所以又稱靜態重定位。
靜態重定位的特點是,一個作業裝入內存中,必須給它分配要求的全部內存空間,若沒有足夠的內存,則不能裝入該作業。 此外,作業一旦進入內存,整個運行期間就不能在內存中移動,也不能再申請內存空間。
3) 動態運行時裝入,也稱動態重定位。 程序在內存中若發生移動,則需要采用動態的裝入方式。裝入程序把裝入模塊裝入內存后,并不立即把裝入模塊中的相對地址轉換為絕對地址,而是把這種地址轉換過程推遲到程序真正需要執行時進行。因此,裝入內存后的所有地址均為相對地址。這種方式需要一個重定位寄存器。
重定位寄存器存放裝入模塊的起始內存地址。
動態重定位的特點是:可以將程序分配到不連續的存儲區中;在程序運行之前可以只裝入它的部分代碼即可投入運行,然后在程序運行期間,根據需要動態申請分配內存; 便于程序段的共享,可以向用戶提供一個比存儲空間大得多的地址空間。
2 邏輯地址空間與物理地址空間
編譯后,每個目標模塊都從0號單元開始編址,這稱為該目標模塊的相對地址(或邏輯地址)。當鏈接程序將各個模塊鏈接成一個完整的可執行目標程序時,鏈接程序順序依次按照各個模塊的相對地址構成統一的從0號單元地址開始的邏輯地址空間,用戶程序和程序員只需要知道邏輯地址,而內存管理的具體機制則是完全透明的,只有系統編程人員才會涉及內存管理的具體機制。 不同進程可以擁有相同的邏輯地址, 因為這些相同的邏輯地址可以映射到主存的不同位置。
物理地址空間是指內存中物理單元的集合,它是地址轉換的最終地址,進程在運行時執行指令和訪問數據,最后都要通過物理地址從主存中存取。 當裝入程序將可執行代碼裝入內存時,必須通過地址轉換將邏輯地址轉換為物理地址, 這個過程稱為地址重定位。
3 內存保護
內存分配前,需要保護操作系統不受用戶進程的影響,同時保護用戶進程不受其他用戶進程的影響。內存保護可以采取兩種方法:
1) 在CPU中設置一對上下限寄存器,存放用戶作業在主存中的下限和上限地址,每當CPU要訪問一個地址時,分別和兩個寄存器相比,判斷有無越界。
2) 采用重定位寄存器(或稱為基址寄存器) 和界地址寄存器(又稱限長寄存器)來實現這種保護。 重定位寄存器含最小的物理地址值,界地址寄存器含邏輯地址的最大值。 每個邏輯地址值必須小于界地址寄存器;
內存管理機構動態地將邏輯地址與界地址寄存器比較,若未發生地址越界,則加上重定位寄存器的值后映射成物理地址,再送交到內存單元。
3.1.2 覆蓋與交換
覆蓋與交換技術是在多道程序環境中用來擴充內存的兩種方法。
1 覆蓋
早期的計算機系統中,主存容量很小,雖然主存中僅僅存放一道用戶程序,但存儲空間放不下用戶進程的現象也時有發生,這一矛盾可以使用覆蓋技術來解決。
覆蓋的基本思想:將程序分為多個段,常用的段常駐內存,不常用的段在需要時調入內存。
把用戶空間分為一個固定區和若干覆蓋區。
2 交換
交換的基本思想:把處于等待狀態(或在CPU調度原則下被剝奪運行權利)的程序從內存移到外存,把內存空間騰出來,這一過程稱為換出;把準備好競爭CPU運行的程序從外存移到內存,這一過程稱為換入。
交換技術主要用在不同進程(或者作業)之間,而覆蓋則用于同一程序或進程中。由于覆蓋技術要求給出程序段之間的覆蓋結構,使得其對用戶和程序員不透明,所以對于主存無法存放用戶程序的矛盾, 現代操作系統是通過虛擬內存技術來解決的,覆蓋技術則已經成為歷史。
3.1.3 連續分配管理方式
連續分配方式是指為一個用戶程序分配一個連續的內存空間,譬如某用戶需要1GB的內存空間,連續分配方式就在內存空間中為用戶分配一塊連續的1GB空間。連續分配方式主要包括單一連續分配、固定分區分配和動態分區分配。
1 單一連續分配
內存在該種方式下分為系統區和用戶區。系統區僅供操作系統使用,通常在低地址部分;用戶區是為用戶提供的、除系統區外的內存空間。
這種方式無需進行內存保護。因為內存中永遠只有一道程序,因此肯定不會因為訪問越界而干擾其他程序。
這種方式的優點:簡單、無外部碎片,可以采用覆蓋技術,不需要額外的技術支持。
缺點:只能用于單用戶、單任務的操作系統,有內部碎片,存儲器的利用率極低。
2 固定分區分配
固定分區分配是最簡單的一種多道程序存儲管理方式,它將用戶內存空間劃分為若干固定大小的區域,每個分區只裝入一道作業。當有空閑分區時,便可再從外存的后備作業隊列中選擇適當大小的作業裝入該分區,如此循環。
固定分區分配在劃分分區時有兩種不同的方法。
- 分區大小相等。用于利用一臺計算機去控制多個相同對象的場合,缺乏靈活性。
- 分區大小不等。 劃分為多個較小的分區、適量的中等分區和少量大分區。
為了便于內存分配,通常將分區按照大小排隊,并為之建立一張分區說明表,其中各表項包括每個分區的始址、大小及狀態(是否已分配)。當有用戶程序要裝入時,便檢索該表,以找到合適的分區給予分配并將其狀態置為“已分配”; 未找到合適分區時,則拒絕為該用戶程序分配內存。
這種分區方式存在兩個問題:
1)程序可能太大而放不進任何一個分區中,這時用戶不得不使用覆蓋技術(常用的段常駐內存,不常用的段在需要時調入內存)來使用內存空間。
2)主存利用率低,當程序小于固定分區大小時,也占用一個完整的內存分區空間,這樣分區內部就存在空間浪費,這種現象稱為內部碎片。
固定分區是可用于多道程序設計的最簡單的存儲分配,無外部碎片,但不能實現多進程共享一個主存區,所以存儲空間利用率低。 固定分區分配很少用于現在通用的操作系統中,但在某些用于控制多個相同對象的控制系統中仍發揮著一定的作用。
3 動態分區分配
動態分區分配又稱可變分區分配,是一種動態劃分內存的分區方法。這種分區方法不預先劃分內存,而是在進程裝入內存時,根據進程的大小動態地建立分區,并使分區的大小正好適合進程的需要。 因此,系統中分區的大小和數目是可變的。
動態分區在開始分配時是很好的,但之后會導致內存中出現許多小的內存塊。 隨著時間的推移,內存中會產生越來越多的碎片,內存的利用率隨之下降。這些小的內存塊稱為外部碎片,指在所有分區外的存儲空間會變成越來越多的碎片,這些與固定分區中的內部碎片正好相對。
克服外部碎片可以通過緊湊(compaction)技術來解決,即操作系統不時地對進程進行移動和整理。但這需要動態重定位寄存器的支持,且相對費時。 緊湊的過程類似于Windows系統中的磁盤整理程序,只不過后者是對外存空間的緊湊。
3.1.4 非連續分配管理方式
非連續分配允許一個程序分散地裝入不相鄰的內存分區。在連續分配管理方式中,我們發現,即使內存中有超過1GB的空閑空間,但若沒有連續的1GB空間,則需要1GB空間的作業仍然無法運行。 但若采用非連續分配管理方式,則作業所要求的1GB內存空間可以分散地分配在內存的各個區域,當然,這也需要額外的空間去存儲它們(分散區域)的索引, 使得非連續分配方式的存儲密度低于連續存儲方式的。
非連續存儲方式根據分區的大小是否固定,分為分頁存儲管理方式和分段存儲管理方式。
再分頁存儲管理方式中,又根據運行作業時是否要把作業的所有頁面都裝入內存才能運行,分為基本分頁存儲管理方式和請求分頁存儲管理方式。
1 基本分頁存儲管理方式
固定分區會產生內部碎片,而動態分區會產生外部碎片,這兩種技術對內存的利用率都比較低。
我們希望內存的使用能盡量避免碎片的產生,這就引入了分頁的思想:把主存空間劃分為大小相等且固定的塊,塊相對較小,作為主存的基本單位。 每個進程也以塊為單位進行劃分,進程在執行時,以塊為單位逐個申請主存中的塊空間。
分頁的方法從形式上看,像分區相等的固定分區技術,分頁管理不會產生外部碎片。
但它又有本質的區別: 塊的大小相對分區要小得多,而且進程也按照塊進行劃分,進程運行時按塊申請主存可用空間并執行。這樣,進程只會在為最后一個不完整的塊申請一個主存塊空間時,才產生主存碎片,所以盡管會產生內部碎片,但這種碎片相對于進程來說也是很小的,每個進程平均產生半個塊大小的內部碎片(也稱業內碎片)。
(1)分頁存儲的幾個基本概念
1)頁面和頁面大小。
將內存空間分為一個個大小相等的分區(比如每個分區4KB),每個分區就是一個“頁框”。每個頁框有一個編號,即頁框號,頁框號從0開始。
注:頁框=頁幀=內存塊=物理塊=物理頁面\color{red}{頁框=頁幀=內存塊=物理塊=物理頁面}頁框=頁幀=內存塊=物理塊=物理頁面
頁框號=頁幀號=內存塊號=物理塊號=物理頁號
將進程的邏輯地址空間也分為與頁框大小相等的一個個部分,每個部分稱為一個“頁”或者“頁面”。每個頁面也有一個編號,叫做頁號,頁號也是從0開始編號。
2)邏輯地址結構
\color{red}{}
邏輯地址結構=頁號P+頁內偏移量W\color{red}{邏輯地址結構=頁號P+頁內偏移量W}邏輯地址結構=頁號P+頁內偏移量W
注意,地址結構決定了虛擬內存的尋址空間有多大。在實際問題中,頁號、頁內偏移、邏輯地址大都是用十進制給出的。
3)頁表
為了便于在內存中找到進程的每個頁面所對應的物理塊,系統為每個進程建立一張頁表,頁表記錄頁面在內存中對應的物理塊號,頁表一般存放在內存中。
頁表是由頁表項組成的.
頁表項=頁號+內存塊號\color{red}{頁表項=頁號+內存塊號}頁表項=頁號+內存塊號
頁表的作用:實現頁號到物理塊號的地址映射。
操作系統以頁框為單位為各個進程分配內存空間,進程的每個頁面分別放入一個頁框中。也就是說,進程的頁面和內存的頁框有一一對應的關系。
(2) 基本地址變換機構
地址變換機構的任務是將邏輯地址轉換為內存中的物理地址。地址變換是借助于頁表實現的。
設頁面大小為L,邏輯地址A到物理地址E的變換過程如下圖(邏輯地址、頁號、每頁的長度都是十進制給出的)
地址變換機構的地址變換過程:
在系統中通常設置一個頁表寄存器(PTR),存放頁表在內存的起始地址F和頁表長度M。 進程未執行時,頁表的始址和長度存放在進程控制塊PCB(在系統區中)中,當進程執行時,才將頁表始址和長度存入頁表寄存器。
(3)具有快表的地址變換機構
從上面的地址變換過程可以看出, 若頁表全部放在內存中,則存取一個數據或者一條指令只要要訪問內存兩次:第一次是訪問頁表,確定所存取的數據或指令的物理地址;第二次是根據該地址存儲數據或指令。 顯然,這種方法比通常執行指令的速度慢了一半。
為此,在地址變換機構中增設一個具有并行查找能力的高速緩沖存儲器(Cache)-–快表,又稱相聯存儲器(TLB),用來存放當前訪問的若干頁表項, 以加速地址變換過程。 與此對應,主存中的頁表常稱為慢表。
具有快表的地址變換機構如下圖。
在有快表的分頁機制中,地址轉換的過程如下所示:
注意:有些處理機設計為快表和慢表同時查找,若在快表中查找成功則終止慢表的查找。
一般快表的命中率在90%以上,這樣分頁帶來的速度損失就可以降至10%以下。 快表的有效性基于局部性原理。
(4)兩級頁表
單級頁表存在的問題
問題一:頁表必須連續存放,因此當頁表很大時,需要占用很多個連續的物理內存塊(頁框)。
問題二:沒有必要讓整個頁表常駐內存,因為進程在一段時間內可能只訪問幾個特定的頁面。
二級頁表就是在原有頁表結構上再加上一層頁表。
如何實現地址轉換?
1按照地址結構將邏輯地址拆分為3部分
2從PCB中讀出頁目錄表始址,根據一級頁號查頁目錄表,找到下一級頁表在內存中的位置
3根據二級頁號查表,找到最終想訪問的內存號
4結合頁內偏移量得到物理地址
需要注意的幾個細節:
1 采用多級頁表機制,則各級頁表的大小不能超過一個頁面。
2 兩級頁表的訪存次數分析(假設沒有快表機構)
第一次訪存:訪問內存中的頁目錄表;
第二次訪存:訪問內存中的二級頁表;
第三次訪存:訪問目標內存單元;
2 基本分段存儲管理方式
分頁管理方式是從計算機的角度設計的,目的是提高內存的利用率,提高計算機的性能。分頁通過硬件機制實現,對用戶完全透明。
分段管理方式是從用戶和程序員的角度出發的,以滿足方便編程、信息保護和共享、動態增長及動態鏈接等多方面的需要。
1)分段。 段式管理方式按照用戶進程中的自然段劃分邏輯空間。
例如,用戶進程由主程序、兩個子程序、棧和一段數據組成,于是可以把這個用戶進程分為5段,每段從0開始編址,并分配一段連續的地址空間(段內要求連續,段間不要求連續,因此整個作業的地址空間是二維的),其邏輯地址由段號S與段內偏移量W兩部分組成。
段號的位數:決定了每個進程最多可分為多少段。
段內地址的位數:決定了每個段的最大長度是多少。
在頁式系統中,邏輯地址的頁號和頁內偏移量是對用戶透明的;
在段式系統中,段號和段內偏移量必須是用戶顯示提供,在高級程序設計語言中,這個工作由編譯程序完成。
2)段表。每個進程都有一張邏輯空間與內存空間映射的段表,其中每個段表項對應進程的一段,段表項記錄該段在內存中的始址和長度。
配置段表后,執行中的進程可通過查找段表,找到每段對應的內存區。 可見,段表用于實現從邏輯段到物理內存區的映射。
3)地址變換機構。
為了實現進程從邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用于存放段表始址F和段表長度M。
從邏輯地址A到實際物理地址E的地址轉換如下:
1.根據邏輯地址得到段號S和段內地址W(即段內偏移量)
2.判斷段號是否越界。如果S≥M,則產生越界中斷,否則繼續執行。
3.查詢段表,找到對應的段表項,段表項的存放地址為F+S?段表項長度。
4.檢查段內地址是否超過段長(和頁式管理不同)。如果W≥C(段內地址≥段長),則產生越界中斷,否則繼續執行。
5段基址b+段內地址W=實際物理地址。
6.訪問目標內存單元。
4)段的共享與保護。
在分段系統中,段的共享是通過兩個作業的段表中相應段表項指向被共享的段的同一個物理副本來實現的。當一個作業正從共享段中讀取數據時,必須方式另一個作業修改此共享段中的數據。不能修改的代碼稱為純代碼或可重入代碼(它不屬于臨界資源),這樣不能修改的代碼或數據可以共享,而可修改的代碼或數據不能共享。
分段管理方式的保護主要有兩種:一種是存儲控制保護,另一種是地址越界保護。
分段管理的地址空間是二維的,因為段號和段內地址(即段內偏移量)必須要顯式給出(段號,段內偏移)。
3 段頁式管理方式
| 分頁管理 | 內存空間利用率高,不會產生外部碎片,只會有少量內部碎片 | 不方便按照邏輯模塊實現信息的共享和保護 |
| 分段管理 | 很方便按照邏輯模塊實現信息的共享和保護 | 如果段長過大,為其分配很大的連續的內存空間不方便。另外,段式會產生外部碎片。 |
盡管段式管理的外部碎片可以通過緊縮技術來處理,但是需要付出較大的時間代價。
在段頁式系統中,作業的地址空間首先被分成若干邏輯段,每段都有自己的段號,然后將每段份成若干大小固定的頁。 對內存空間的管理仍然和分頁存儲管理一樣,將其分成若干和頁面大小相等的存儲塊,對內存的分配以存儲塊為單位。
在段頁式系統中,作業的邏輯地址分為三部分:段號、頁號和業內偏移量。
為了實現地址轉換,系統為每個進程建立一張段表,每個分段有一張頁表。段表表項中至少包含段號、頁表長度和頁表始址,頁表表項中至少包括頁號和塊號。此外,系統還應有一個段表寄存器,指出作業的段表長度和段表始址。
注意:在一個進程中,段表只有一個,而頁表可能有多個。
在進行地址轉換時,首先通過段表查到頁表始址,然后通過頁表找到頁框號,最后形成物理地址。
2.段號和段表寄存器的段長比較,檢查是否越界
3.由段表始址和段號找到對應的段表項
4.根據段表中頁表長度,檢查頁號是否越界
5.根據段表項中記錄的頁表始址和頁號查詢頁表,得到相應的頁表項
6.由頁表項記錄的塊號和頁內偏移量得到物理地址
7.訪問目標單元
段頁式進行查找一次邏輯地址需要三次訪存(分別是查段表,查頁表,訪問實際內存)。這里同樣可以使用快表進行加速。
程序員需要顯示地給出(段號,段內地址),而各段進行“分頁”對程序員是不可見的。 系統會根據段內地址自動劃分為頁號和頁內偏移量。所以段頁式管理的地址空間是二維的。
王道習題(二級頁表)
答案:B 128
分析 :在二級頁表中,一頁可以存放的頁表項個數=210/2=29個頁表項2^{10}/2=2^9個頁表項210/2=29個頁表項,邏輯地址空間需要2162^{16}216個頁表項,則總共需要216/29=27=1282^{16}/2^{9}=2^{7}=128216/29=27=128個頁面,二級頁表供128個頁面,則一級頁表(又稱頁目錄表)有128個表項。
本題選A
只需要將虛擬地址寫成二進制形式,并且分塊即可。
3.2虛擬內存管理
3.2.1 虛擬內存的基本概念
傳統存儲管理方式的特征
前面討論的各種內存管理策略是為了同時將多個進程保存在內存中,以便允許多道程序設計。 它們都具有以下兩個共同的特征:
1)一次性。作業必須一次性全部裝入內存,才能開始運行。
2)駐留性。作業被裝入內存后,就一直駐留在內存中,其任何部分都不會被換出,直到作業運行結束。運行中的進程會因等待I/O而被阻塞,可能處于長期等待狀態。
2 局部性原理
局部性原理表現在以下兩個方面:
1)時間局部性。 程序中的某條指令一旦執行,不久后該指令可能再次執行;某數據被訪問過,不久后該數據可能再次被訪問。 產生時間局部性的典型原因是程序中存在著大量的循環操作。
2)空間局部性。 一旦程序訪問了某個存儲單元,在不久后,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址,可能集中在一定的范圍內,因為指令通常是順序存放、順序執行的,數據也一般是以向量、數組、表等形式簇聚存儲的。
時間局部性通過將近來使用的指令和數據保存到高速緩存中,并使用高速緩存的層次結構實現。
空間局部性通常使用較大的高速緩存, 并將預取機制集成到高速緩存控制邏輯中實現。
虛擬內存技術實際上建立了“內存-外存”的兩級存儲器結構, 利用局部性原理實現高速緩存。
3 虛擬存儲器的定義和特征
基于局部性原理,在程序裝入時,將程序的一部分裝入內存,而將其余部分留在外存,就可啟動程序執行。 在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然后繼續執行程序。另一方面,操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入內存的信息。 這樣,操作系統好像為用戶提供了一個比實際內存大得多的存儲器,稱為虛擬存儲器。
之所以將其稱為虛擬存儲器,是因為這種存儲器實際上并不存在,只是由于系統提供了部分裝入、請求調入和置換功能后(對用戶完全透明),給用戶的感覺是好像存在一個比實際物理內存大得多的存儲器。 虛擬存儲器的大小由計算機的地址結構決定, 并不是內存和外存的簡單相加。
虛擬存儲器具有以下三個主要特征:
1)多次性。 多次性是指無需在作業運行時一次性地全部裝入內存,而允許被分成多次調入內存運行。
2)對換性。 對換性是指無需在作業運行時一直常駐內存,而允許在作業的運行過程中,進行換出和換入。
3)虛擬性。 虛擬性是指從邏輯上擴充內存的容量, 使用戶看到的內存容量遠大于實際的內存容量。
4 虛擬內存技術的實現
虛擬內存技術允許將一個作業分多次調入內存。采用連續分配方式時,會使相當一部分內存空間都處于暫時或“永久”空閑狀態,造成內存資源的嚴重浪費,而且也無法從邏輯上擴大內存容量。因此,虛擬內存的實現需要建立在離散分配的內存管理方式的基礎上。
虛擬內存的實現有以下三種方式:
- 請求分頁存儲管理
- 請求分段存儲管理
- 請求段頁式存儲管理
不管哪一種實現方式,都需要一定的硬件支持。 一般需要的支持有以下幾個方面:
1一定容量的內存和外存。
2頁表機制(或段表機制),作為主要的數據結構。
3 中斷機構,當用戶程序要訪問的部分尚未調入內存時,則產生中斷。
4地址變換機構,邏輯地址到物理地址的變換。
3.2.2 請求分頁管理方式
請求分頁系統建立在基本分頁系統基礎之上,為了支持虛擬存儲器功能而增加了請求調頁功能和頁面置換功能。請求分頁使目前最常用的一種實現虛擬存儲器的方法。
再請求分頁系統中,只要求將當前需要的一部分頁面裝入內存,便可以啟動作業。 在作業執行過程中,當所訪問的頁面不在內存中時,再通過調頁功能將其調入,同時還可以通過置換功能將暫時不用的頁面換出到外存上,以便騰出內存空間。
1 頁表機制
請求分頁系統的頁表機制不同于基本分頁系統,請求分頁系統在一個作業運行之前不要求全部一次性調入內存,因此在作業運行過程中,必然會存在要訪問的頁面不在內存中的情況,如何發現和處理這種情況是請求分頁系統必須解決的兩個基本問題。 為此,在請求頁表項中增加了4個字段。
增加的4個字段說明如下:
狀態位P。用于指示該頁是否已經調入內存。供程序訪問時參考。
訪問字段A。 用于記錄本頁在一段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問,共置換算法換出頁面時參考。
修改位M。 標識該頁在調入內存后是否被修改過。
外存地址。 用于指出該頁在外存上的地址,通常是物理塊號,供調入該頁時參考。
2 缺頁中斷機構
在請求分頁系統中,每當所要訪問的頁面不在內存時,便產生一個缺頁中斷,請求操作系統將所缺的頁調入內存。此時應將缺頁的進程阻塞(調頁完成喚醒),若內存中有空閑塊,則分配一個塊,將要調入的頁裝入該塊,并修改頁表中的相應頁表項,若此時內存中沒有空閑塊,則要淘汰某頁(若被淘汰頁在內存期間被修改過,則要將其寫回外存)。
缺頁中斷作為中斷,同樣要經歷諸如保護CPU環境、分析中斷原因、轉入缺頁中斷處理程序、恢復CPU環境等幾個步驟。 但是和一般的中斷相比,有兩個明顯的區別:
- 1.在指令執行期間而非一條指令執行完后產生和處理中斷信號,屬于內部中斷。
- 2.一條指令在執行期間,可能產生多次中斷。
3 地址變換機構
在地址變換時,先檢索快表:
如果找到要訪問的頁,則修改頁表項中的訪問位(寫指令還需要重置修改位),然后利用頁表項中給出的物理塊號和頁內地址形成物理地址。
如果沒有找到該頁的頁表項,則應到內存中去查找頁表,再對比頁表項中的狀態位P,看是否已經調入內存,未調入則產生缺頁中斷,請求從外存把該頁調入內存。
3.2.3 頁面置換算法
1. 最佳(OPT)置換算法
最佳(OPT,optimal)置換算法選擇的被淘汰頁面是以后永不使用的頁面,或是在最長時間內不再被訪問的頁面,以便保證獲得最低的缺頁率。
然而,由于人們目前無法預知進程在內存下的若干頁面中哪個是未來最長時間內不再被訪問的,因而該算法無法被實現。
最佳置換算法可以用來評價其他算法。
2. 先進先出(FIFO)置換算法
優先淘汰最早進入內存的頁面,即在內存中駐留時間最久的頁面。 該算法實現簡單,只需要把調入內存的頁面根據先后次序鏈接成隊列,設置一個指針總指向最早的頁面。 但該算法與進程實際運行時的規律不適應加粗樣式,因為在進程中,有的頁面經常被訪問。
FIFO算法會產生所分配的物理塊數增大而頁故障數不減反增的異?,F象,稱為Belady異常。只有FIFO算法可能出現Belady異常,LRU和OPT算法永遠不會出現Belady異常。
3.最近最久未使用(LRU)置換算法
最近最久未使用(LRU,Leat Recently Used)置換算法選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能亦不會被訪問。 該算法為每個頁面設置一個訪問字段,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。
LRU算法的性能較好,但需要寄存器和棧的硬件支持。LRU是堆棧類算法。理論上可以證明,堆棧類算法不可能出現Belady異常。
4. 時鐘(CLOCK)置換算法
LRU算法的性能接近于最佳置換算法,但是實現起來比較困難,且開銷大;FIFO算法實現起來簡單,但性能差。 因此,操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU算法的性能,這類算法都是CLOCK算法的變體。因為算法要循環掃描緩沖區,像時鐘的指針一樣轉動,所以稱為CLOCK算法,又稱為最近未用(Not Recently Used,NRU)算法。
簡單的CLOCK算法給每幀關聯一個附加位,稱為使用位。但某頁首次裝入內存時,將該幀的使用位設置為1;當該頁最后再被訪問到時,其使用位也被置為1.對于頁替換算法,用于替換的候選幀集合可視為一個循環緩沖區,并有一個指針與之相關聯。 當某一頁被替換時,該指針被設置為指向緩沖區的下一幀。 當需要替換一頁時,操作系統掃描緩沖區,以查找使用位被置為0的一幀。 每當遇到一個使用位為1的幀時,操作系統就將該位重新置為0. 若在這個過程開始時,緩沖區中所有幀的使用位均為0,則選擇遇到的第一個幀替換,并停留在最初的位置上,替換該幀中的頁。
改進型CLOCK置換算法
在使用位u的基礎上再增加一個修改位m,則得到改進型CLOCK置換算法。
這樣每幀都處于以下四種情況之一
- 最近未被訪問,也未被修改(0,0)
- 最近被訪問,但未被修改(1,0)
- 最近未被訪問,但被修改(0,1)
- 最近被訪問,被修改(1,1)
算法執行過程如下
1)從指針的當前位置開始,掃描幀緩沖區。在這次掃描過程中,對使用位不做任何修改,選擇遇到的第一個幀(0,0)進行替換。
2) 若第一步失敗,則重新掃描,查找(0,1)的幀。選擇遇到的第一個這樣的幀用于替換。在這個掃描過程中,對每個跳過的幀,把它的使用位設置為0.
3)若第二步失敗, 則指針將回到它的最初位置,且集合中所有幀的使用位均為0.重復第一步,查找(0,0)幀,并且對使用位不做任何修改。
4)若第四步失敗,則重復第二步。查找(0,1)的幀。這個過程中需要對遇到的幀就行使用位設置0.
改進型CLOCK優于簡單CLOCK算法的地方在于替換時首選沒有變化的頁。由于修改過的頁在替換之前必須寫回,因而這樣做會節省時間。
操作系統中任何優化而有效的頁面置換算法都有一個原則,即盡可能保留曾經使用過的頁面,而淘汰未使用過的頁面,認為這樣可以在總體上減少換頁次數。CLOCK算法只考慮到是否被訪問過,因此被訪問過的當然盡可能留下來,未使用過的就淘汰。 而改進型CLOCK置換算法對任何使用過的頁面又做了細分,分為使用過但未修改過和使用過且修改過。因此,若有未使用過的頁面,實現把它換出,若全部頁面都使用過,優先把未修改過的頁面換出。
3.2.4 頁面分配策略
頁面分配策略
駐留集 指請求分頁存儲管理中給一個進程分配的內存塊的集合。
固定分配vs 可變分配:區別在于進程運行期間駐留集大小是否可變
局部置換vs全局置換:區別在于發生缺頁時是否只能從進程自己的頁面中選擇一個換出
固定分配局部置換:進程運行前就分配一定數量物理塊,缺頁時只能換出進程自己的某一頁
可變分配全局置換:只要缺頁就分配新的物理塊,可能來自空閑物理塊,也可能換出別的進程的頁
可變分配局部置換:頻繁缺頁的進程,多分配一些物理塊;缺頁率很低的進程,回收一些物理塊;直到缺頁率合適
何時調入頁面?
- 預調頁策略:一般用于進程運行前
- 請求調頁策略:程序運行時,發生缺頁再調頁
從何處調頁?
對換區:采用連續存儲方式,速度快;
文件區:采用離散存儲方式,速度慢
- 對換區足夠大:運行前將數據從文件區復制到對換區,之后所有的頁面調入調出都是內存和對換區之間進行
- 對換區不夠大:不會修改的數據每次都從文件區調入;會修改的數據調入對換區,需要時再從對換區調入
- UNIX方式:第一次使用的頁面都從文件區調入;調出的頁面都寫回到對換區,再次使用時從對換區調入。
3.2.5 抖動
抖動指頁面頻繁換入換出的現象。主要原因是分配給進程的物理塊不夠。
3.2.6 工作集
工作集指 在某段時間間隔內,進程實際訪問頁面的集合。
駐留集大小一般不能小于工作集。
王道習題
訪問時間的計算
在沒有快表的請求分頁存儲管理:如果缺頁,需要訪存三次(分別是:查頁表1次(第一次),缺頁之后調頁(I/O)然后再查頁表(第二次),之后訪問目標單元(第三次))
在有快表的請求分頁系統中:
分為三種線路;
1 ) 快表命中 ,訪存1次
2 )快表未命中,訪問慢表,慢表命中,訪存2次。
3)快表未命中,訪問慢表,慢表缺頁,需要調頁I/O(很慢),然后查快表(肯定命中),訪存2次。
本題正確答案如下
0.8?1us+0.2?0.9?2us+0.2?0.1?(20ms+2us)=401.2us0.8* 1 us + 0.2 *0.9 *2us+0.2*0.1*(20ms+2us)=401.2us0.8?1us+0.2?0.9?2us+0.2?0.1?(20ms+2us)=401.2us
2021考研王道教材答案錯誤,錯誤答案給的是401.22us。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的操作系统第三章-内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年12月大学英语四六级英语作文预
- 下一篇: 操作系统第四章-文件管理