1. 程式人生 > >《現代作業系統》精讀與思考筆記 第三章 記憶體管理

《現代作業系統》精讀與思考筆記 第三章 記憶體管理

  本系列博文是《現代作業系統(英文第三版)》(Modern Operating Systems,簡稱MOS)的閱讀筆記,定位是正文精要部分的摘錄理解和課後習題精解,因此不會事無鉅細的全面摘抄,僅僅根據個人情況進行記錄和推薦。由於是英文版,部分內容會使用英文原文。

  課後習題的選擇標準:儘量避免單純的概念考察(如:What is spooling?)或者簡單的數值計算,而是能夠引起思考加深理解的題目。為了保證解答的正確性,每道題都會附上原書解答,而中文部分會適當加入自己的見解。原書答案下載地址(需註冊) 

  注:本文部分內容需要讀者對頁式、段式、段頁式記憶體管理有基本瞭解。 

概念回顧

  交換技術(Swapping):記憶體緊縮、用於記憶體管理的點陣圖和連結串列、匹配演算法:首次匹配、下次匹配、最佳匹配、最壞匹配;

  虛擬記憶體:前身是手工完成的覆蓋技術(overlays);記憶體管理單元MMU及地址轉換:頁表、TLB(轉換檢測緩衝區,也稱為關聯儲存器,俗稱快表)、多級頁表;

  頁面排程演算法

  共享庫(shared libraries)/動態連結庫(DLL,Dynamic Link Libraries)

  段式記憶體管理、段頁式

1.TLB的譯名

  如果之前學習過國內的作業系統教材,TLB一般被稱為快表,而不是轉換檢測緩衝區(Translation Lookaside Buffer)或關聯儲存器(associative memory)。對於國內常見的稱呼,容易知道它是做為整個頁表的一個部分快取,從而加快虛地址向實地址轉換的速度。因此,它和頁表的條目結構很類似。具體解釋見於P195~197,另外段式儲存管理中也可以使用TLB加速訪問。對於不同地方出現的TLB,它緩衝的內容與其應用場景有關(MULTICS、Pentium等等)。可以看出,這個譯名比較形象,不過原名更具體些。

2.倒排頁表(Inverted Page Tables)

  本科時學習“作業系統”的"基本分頁儲存管理方式"時,對於64位計算機、單個頁面4KB(即212B),兩級頁表已經過大而不能裝入記憶體。湯子瀛版《計算機作業系統》介紹了2種處理方式:使用三級或以上的頁表、將定址空間降低到45位左右而不是64位。前者仍然比較繁瑣,後者可行性比較高。那時我就對前者心存疑惑:雖然能夠將需要用的頁表調入記憶體,可是它們總大小仍然很大,有沒有更好的實現?接下來看一看《現代作業系統》提供的方式:倒排頁表。下面這部分內容取自原書P200~201的整理。

  先簡述下問題所在:64位計算機中,如果頁面大小為4KB,那麼64位定址空間需要252

個頁表項。假設每個頁表項大小為8B,那麼需要30PB的空間,在目前計算機發展階段顯然是不現實的。

  倒排頁表是一種解決方案,正如其名所揭示的:普通的頁表是將虛地址對映成實體地址,提供的是將頁號(page number)轉化為頁框號(page frame number)的對應;這個轉化由MMU完成;而倒排頁表正相反,提供的是將頁框號轉化為頁號的對應。頁框號是實際記憶體的大小/頁面大小,因此1GB記憶體只需要262,144個項即可,遠遠小於252這個數字。

  個人認為,這個解決思路的妙處在於:32位下,頁表項總和比較少,至多兩級頁表也已夠用;而64位下,記憶體的大小(也即實體地址空間)與定址空間(虛地址空間)相比反而顯得小了,這樣乾脆來個倒轉,不失為一個很好的方法。

  當然這種解法雖然節約了大量的儲存空間,但是記憶體管理中需要的是將虛地址轉化成實體地址的機制,而不是正相反啊?這種對映是單向的,總不能每次轉化都把這個表遍歷一次吧?那樣做的開銷實在是太大了。

  一種解決方法是使用TLB,但是TLB也有失效(miss)的時候,這時還是需要進行查詢。一個可行的方法是將所有用到的虛地址hash掉,形成一個hash表來加速查詢,同樣雜湊值的虛地址形成一個鏈。如果hash表的槽數與實體記憶體的頁框數一樣多,那麼雜湊表各表項平均長度為1,這樣提高了查詢速度。這個解決方法的演變可以見下圖3-14。

  

3.LRU和NFU的演算法實現

(1)LRU演算法實現

  LRU,湯子瀛《計算機作業系統》譯為“最近最久未使用”,也即在緩衝的所有頁面中,缺頁中斷髮生時,將最久未被使用的頁面置換出去。不過按照字面意思,Least Recently Used似乎應是《現代作業系統》中譯版的“最近最少使用”,似乎是需要統計頁面使用頻率的。這裡有必要先探討下這個翻譯問題。這個翻譯的區別在於,副詞least修飾的是recently還是used。P206原文:

A good approximation to the optimal algorithm is based on the observation that pages that have been heavily used in the last few instructions will probably be heavily used again in the next few. Conversely, pages that have not been used for ages will probably remain unused for a long time. This idea suggests a realizable algorithm: when a page fault occurs, throw out the page that has been unused for the longest time. This strategy is called LRU (Least Recently Used) paging.

  這前半段和後半段意思並不是很一致。按照前半段的意思,用的最多的(heavily used)最應該保留;而後半段,也即LRU的定義,反而是指“最久未使用”。假設這樣一種情況,記憶體只能容納兩個頁,如果考察的時間跨度大於2,對於0,0,...,0,1的頁面訪問序列,此時訪問頁面2,前半段會認為0的使用頻率最高,應該保留0,而後半段認為0是最久未被使用的,應該保留1。這樣就產生了矛盾。不過既然是一個近似,按後半段更合適一些,這樣反而顯得“最近最久未使用”是一個更合適的譯法。《現代作業系統》提到的3種演算法,其實都是符合定義的:

   一種實現是用一個特殊連結串列,將最近最多使用的放在表頭,最近最少使用的放在表尾,每次使用到的頁面如果在連結串列中,就把它取出並放到表頭。不過這個實現一方面很耗時,並且實際上是“最近最久未使用”。

  一種硬體實現是使用一個計數器,每次執行指令自增1,每個頁表項中提供一位來容納這個值,每次訪問時就把計數器的值存到訪問的頁表項中。淘汰頁面時選擇最小的即可。雖然很符合“最近最少使用”的含義,缺點是消耗了很多儲存空間;另外,計數器的溢位也是個問題。同樣是“最近最久未使用”。

  另一種硬體實現則比較精巧。對於n個頁框的機器,提供一個n*n的矩陣,初始化為全0。當訪問頁框k時,將這個矩陣第k行全設為1,第k列全設為0,此時(k,k)是0。在任意時刻,哪一行的二進位制數最小,那麼它就是將被淘汰的頁面。可以發現,這種做法中,最後被訪問的頁面會把它所在的行變為最大的(k列全為0,代表此列的大小影響不計;僅有k行全1,必然最大)。同時,頁面的使用頻率越高,那麼它就能“保持”的較大。即使上文中探討的作為0,0,...0,1這種序列,仍然是保持1替換0,還是“最近最久未使用”。原書對這個實現的圖3-17:

  

(2)NFU演算法實現(原書P206~207)

  LRU的實現比較複雜,而且可能需要藉助特殊的硬體。一種軟體實現被稱為NFU(Not Frequently Used,最不常用),每個頁面使用一個計數器,每次時鐘中斷時,將頁面的R位(是否被引用,0或1)加到計數器上。缺頁中斷時置換計數器值最小的。

  這種實現的壞處是它“從不忘記任何事情”,簡單地說就是在之前計數器值比較高的頁面,即使不再訪問,仍然會保持這個值;而別的頁面在後續始終無法超過。對NFU做一個小修改,就可以很好的模擬LRU:將R位增加前先計數器右移、R位增加到計數器左邊的最高位而不是右邊的最低位。修改後的演算法稱為老化(aging)演算法。圖3-18是一個執行例項,其蘊含的特徵是:越高位越新,最近的使用權重最大;早期的使用記錄會隨著右移而捨棄。

  

  從中也可看出NFU與LRU的第一個區別:對於(e),LRU只能從3和5中二選一,3和5都在2個時鐘前訪問過,而NFU會明確地喚出3。另一個區別是NFU只能追蹤有限次(相較於LRU的前兩種實現,要少一些),比如圖中的8次。前第9次和前1000次的訪問情況是無關緊要的。

4.頁的大小

  如何確定頁的大小?以前我只知道應該綜合考慮,但是如何考慮?原書P219~220是一個很好的借鑑。

  假設頁面大小為p位元組,記憶體中共有n個段。

  首先考慮頁內碎片。平均來看頁內碎片佔了頁的1/2大小,那麼一共浪費了np/2的空間。

  頁面越小,程序執行時所需記憶體越小,只需把足夠的頁面裝載如記憶體即可;反之則越大。然而,頁面越小,需要的頁表項越多,頁表也越大。在頁傳輸這個數量級時,磁碟傳輸的時間主要花在尋道和旋轉延遲上,頁面大小不是關鍵因素,比如,裝入64個512B頁面需要64*10ms,而4個8KB可能只需要4*12ms。

  程序切換時,也表也需要重新裝載,頁面越小,裝入頁表越耗時。

  最後一點可以用數學分析。如果程序大小平均s位元組,頁面大小p位元組,每個頁表項需要e位元組,那麼程序需要的頁數為s/p,佔用了se/p的頁表空間, 頁內碎片在最後一頁浪費的是p/2,那麼由於頁表和頁內碎片一共的全部開銷為:

\[overhead = se/p + p /2\]

利用求導的方法,可以解出最小化開銷overhead的p值:

\[p = \sqrt{2se}\]

  對於s = 1MB和頁表項為8B,最優頁面大小是4KB。

5.有頁式、段式、段頁式,為什麼沒有頁段式?

  這是我本科時學習作業系統的又一個疑惑。其實從技術角度來說,是可以實現的;讀完《現代作業系統》有了新的體會:頁式更接近於硬體底層,對於程式設計師是透明的,你很少感受到它的存在;而段這個概念就比較熟悉了,資料段、程式碼段、段保護機制這些經常被提起。段是邏輯抽象,更貼近人的思考方式而不是計算機的運作方式。頁式、段式、段頁式都是在現實中常用的,而且《現代作業系統》的作者Andrew提到:Pentium的設計者面對相互衝突的目標:純頁式、純段式、段頁式管理,高效而簡潔的實現,相當值得稱讚("

All in all, one has to give credit to the Pentium designers. Given the conflict­ing goals of implementing pure paging, pure segmentation, and paged segments,
while at the same time being compatible with the 286, and doing all of this efficiently, the resulting design is surprisingly simple and clean",如何使用段頁式管理系統提供純段式和純頁式請參考原書3.7.3節)

  可以看出,對於軟體設計,應該讓邏輯層在較高的位置,貼近硬體的機制在較低的位置——這就是段頁式的處理;而不是相反,也就沒有了使用所謂的頁段式的必要了。

課後習題選

16.The TLB on the VAX does not contain an R bit. Why?

譯:

  為什麼VAX上的TLB沒有R位?

Answer:

  The R bit is never needed in the TLB. The mere presence of a page there means the page has been referenced; otherwise it would not be there. Thus the bit is completely redundant. When the entryis written back to memory, how-ever, the R bit in the memory page table is set.

分析:

  題目提到VAX這個機型其實是誤導。一般頁表中都有R位(Referrence,最近是否訪問過)和M位(Modified,最近是否修改過),這兩位在一些排程演算法中要用到;而TLB中必然儲存的是最近引用過的頁,任何機型的TLB都沒有R位的必要。

21.Suppose that the virtual page reference stream contains repetitions of long sequences of page references followed occasionally by a random page reference. For example, the sequence: 0, 1, ... , 511,431, 0, 1, ... , 511, 332, 0, 1, ... consists of repetitions of the sequence 0, 1, ... , 511 followed by a random reference to pages 431 and 332. 

(a) Why won't the standard replacement algorithms (LRU, FIFO, Clock) be effective in handling this workload for a page allocation that is less than the sequence length?
(b) If this program were allocated 500 page frames, describe a page replacement ap­proach that would perform much better than the LRU, FIFO, or Clock algorithms.

譯:

  對於一個頁面訪問序列,會有一個長的重複序列0,1,...,511,末尾一個隨機數字,因此這個序列形如0, 1, ... , 511,431, 0, 1, ... , 511, 332, 0, 1, ... 。問題(a)為什麼在負載小於重複序列的時候,標準的頁面置換演算法(LRU、FIFO、Clock)對於這種序列非常低效?(b)如果這個程式只有500個頁框,請描述一種好的頁面置換演算法。

Answer:

  (a) Every reference will page fault unless the number of page frames is 512,the length of the entire sequence.
  (b) If there are 500 frames, map pages 0–498 to fixed frames and vary only one frame.

分析:

  (a)就不再贅述了,對於(b),其實是完全與提到的標準演算法不一樣的,更接近於最優演算法的實現,也即在能夠預計未來的情況下進行頁面管理。

35.A machine language instruction to load a 32-bit word into a register contains the 32-bit address of the word to be loaded. What is the maximum number of page faults this instruction can cause?

譯:

  一條機器指令,其功能是把一個32位字的資料裝入暫存器,指令本身包含了要裝入的字所在的32位地址。這個過程最多會引起幾次缺頁中斷?

分析:

  原文稍有點拗口,需要仔細分析。首先裝載指令時,如果它是跨頁的,會引起兩次缺頁中斷;其次,如果資料所在地址也跨頁了,又將引起兩次。如果資料必須對齊,那麼後者只有一次中斷;但是32位的指令未必要對齊,包括Pentium上也是這樣。

勘誤

1.P250習題19,"a 256-KB main memory"應為256-MB,這個推論根據原書答案的計算過程而來。

相關推薦

現代作業系統精讀思考筆記 記憶體管理

  本系列博文是《現代作業系統(英文第三版)》(Modern Operating Systems,簡稱MOS)的閱讀筆記,定位是正文精要部分的摘錄理解和課後習題精解,因此不會事無鉅細的全面摘抄,僅僅根據個人情況進行記錄和推薦。由於是英文版,部分內容會使用英文原文。   課後習題的選擇標準:儘量避免單純的概念

現代作業系統精讀思考筆記 檔案系統

  本系列博文是《現代作業系統(英文第三版)》(Modern Operating Systems,簡稱MOS)的閱讀筆記,定位是正文精要部分的摘錄理解和課後習題精解,因此不會事無鉅細的全面摘抄,僅僅根據個人情況進行記錄和推薦。由於是英文版,部分內容會使用英文原文。   課後習題的選擇標準:儘量避免單純的概念

現代作業系統精讀思考筆記 輸入/輸出

Read performance: RAID levels 0, 2, 3, 4, and 5 allow for parallel reads to service one read request. However, RAID level 1 further allows two read re-ques

現代作業系統精讀思考筆記 死鎖

  本系列博文是《現代作業系統(英文第三版)》(Modern Operating Systems,簡稱MOS)的閱讀筆記,定位是正文精要部分的摘錄理解和課後習題精解,因此不會事無鉅細的全面摘抄,僅僅根據個人情況進行記錄和推薦。由於是英文版,部分內容會使用英文原文。   課後習題的選擇標準:儘量避免單純的概念

現代作業系統精讀思考筆記 多媒體

  第七章部分內容與前幾章內容關聯很大,比如程序排程、磁碟排程、檔案系統,而且多為實現細節,這裡不詳述。 1.幀數與閃爍(P476)   畫面動作的平滑性不是完全由每秒的幀數決定的,而是由每秒不同畫面的數目決定的。即使把20幀的視訊提高到80幀,而提高方式僅僅是把同樣一幀重複播放4次,那麼它仍然會不連

現代作業系統精讀思考筆記 多處理機系統 安全

  兩章雖然篇幅不小,不過都是以介紹為主,這部分不是我讀這本書的重點,看得比較粗略,筆記內容也不多,乾脆合二為一。 第八章 多處理機系統   正如章節名,這章主要是關於多處理機、多計算機、虛擬化、分散式系統。由於非單機的多處理器系統和網路通訊關係密切,還講了一些計算機網路的內容。 1.非阻塞send

現代作業系統(中文四版)》筆記 記憶體管理

記憶體管理 3.1無儲存器抽象 最開始並沒有對儲存器進行抽象,直接簡單粗暴的使用實體記憶體地址,直接從0到某個上限值。每個地址可容納一定的二進位制位儲存單元, 通常為8位。這個時期的組織記憶體的三種方式如下: 3.2 第一種儲存器抽象:地址空間

現代作業系統精讀思考筆記 十至十三

  本系列博文是《現代作業系統(英文第三版)》(Modern Operating Systems,簡稱MOS)的閱讀筆記,定位是正文精要部分的摘錄和課後習題精解,因此不會事無鉅細的全面摘抄,僅僅根據個人情況進行記錄和推薦。由於是英文版,部分內容會使用英文原文。   第十章是關於Linux的簡略介紹。一百頁的

現代作業系統 記憶體管理

作業系統的工作是將這個儲存體系抽象成為一個有用的模型並將管理這個抽象模型 作業系統中管理分層儲存體系的部分稱為儲存管理器。它的任務是有效的管理記憶體,即記錄哪些記憶體是正在使用的,哪些記憶體是空閒的,在程序需要時為其分配記憶體,在程序使用完成的時候為其釋放記憶體。 3.1 無儲存器的

現代作業系統 記憶體管理 習題

Chapter03 第三章 記憶體管理 習題 知識點小記 當一個程序發生缺頁中斷的時候,程序會陷入核心態,執行以下操作: 1、檢查要訪問的虛擬地址是否合法 2、查詢/分配一個物理頁 3、填充物理頁內容(讀取磁碟,或者直接置0,或者啥也不幹) 4、建立對映關係(虛擬地址到實體

C指標筆記

第一節:基本資料型別 C語言僅有四種基本資料型別:     1.整型     2.浮點型     3.指標型別     4.聚合型別 一.整型(九種)     1.字元         char         signed char          unsigned c

作業系統概念總結筆記—— 記憶體管理

本章目標:1、詳細討論記憶體硬體的組織方法;2、討論各種記憶體管理技術,如分段、分頁;8.1 背景介紹快取記憶體: 由於CPU對暫存器的訪問速率快於對記憶體的訪問速率,導致在實際執行中,沒有資料完成正在進行的操作,CPU通常需要暫停(stall), 由於記憶體的頻繁訪問,這種

現代作業系統精讀思考筆記 第一 引論

  本系列博文是《現代作業系統(英文第三版)》(Modern Operating Systems,簡稱MOS)的閱讀筆記,定位是正文精要部分的摘錄和課後習題精解,因此不會事無鉅細的全面摘抄,僅僅根據個人情況進行記錄和推薦。由於是英文版,部分內容會使用英文原文。   課後習題的選擇標準:儘量避免單純的概念考察

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 一個簡單的例子

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 第三章 一個簡單的例子 keil C51 除錯程式碼: 軟體模擬模擬 執行 原始碼 #define OS_ENTER_CRITICAL() EA = 0,Os_Enter_Sum++

《Linux命令列shell指令碼程式設計大全》讀書筆記———— 基本的bash shell命令

本章內容 1、使用shell 2、bash手冊 3、瀏覽檔案系統 4、檔案和目錄列表 5、管理檔案和目錄 6、檢視檔案內容   3.3 bash手冊 命令: man  xterm  作用:檢視檢視xterm使用者手冊 man命

作業系統概念學習筆記 程序

3.1 程序概念 1. 程序 程序是一種執行中的程式 執行什麼程式 執行什麼資料 處在什麼狀態 程序包括 程式程式碼/文字段 當前活動,程式計數器和CPU暫存器 記憶體中的

深度學習(花書)讀書筆記——-概率資訊理論

當方差很小時,f (x) 的值形成的簇比較接近它們的期望值。方差的平方根被稱為標準差(standard deviation)。協方差(covariance)在某種意義上給出了兩個變數線性相關性的強度以及這些變數的尺度:        協方差的絕對值如果很大則意味著變數值變化很大並且它們同時距離各自的均值很遠。

《影象處理、分析機器視覺》(4版)閱讀筆記—— 影象及其數學物理背景

3.1 概述 3.1.1 線性 向量(線性)空間(vector(linear) space) 3.1.2 狄拉克(Dirac)分佈和卷積 理想的衝擊是一個重要的輸入訊號,影象平面上的理想衝擊是用狄拉克分佈(Dirac distribution)定義的,。相當於訊號處理中的單位階躍函式

《一個作業系統的實現》讀書筆記----保護模式

pmtest1.asm ; pmtest1.asm ; 編譯方法:nasm pmtest1.asm -o pmtest1.com ; ========================================== %include "pm.inc" ; 常量, 巨

《一個作業系統的實現》讀書筆記----分頁機制

1、邏輯地址、線性地址和實體地址 2、分頁管理機制 3、PDE、PTE、cr3 4、如何初始化頁目錄表與頁表 一、邏輯地址、線性地址和實體地址 1、在未開啟分頁機制情況下 2、在開啟分頁機制情況下 二、分頁管理機制 下圖向大家展示,如何通過分頁管理機制,將線