自學自用 = B站(操做系統_清華大學(向勇、陳渝))1

視頻地址

http://www.bilibili.com/video/av6538245html

介紹

本篇博客,旨在記錄視頻學習的要點,因此格式隨意, 方便本人往後自考和回憶,有興趣的朋友能夠評論討論。ios

原文地址http://www.cnblogs.com/clockq/p/10318639.html程序員

1、操做系統(OS)描述

1.1 什麼是操做系統

OS = Kernel + Shell,是介於底層硬件和應用軟件之間的一層軟件架構。算法

  • Shell 主要提供與Users的交互工做(Windows的GUI和Linux的Terminal)
  • Kernel 主要負責管理計算機的硬件資源
    • CPU調度器
    • 內存管理 = 物理內存 + 虛擬內存
    • 文件系統管理
    • 中斷和設備驅動

Kernel 特徵

  • 併發(也並行)
  • 共享
  • 虛擬化(cpu,內存 => 進程, 硬盤 => 文件)
  • 異步

1.2 操做系統的發展歷史

  • 紙帶+人工操做系統
  • 多道操做系統
  • 分時操做系統(1/1000 s一次分時)
  • 單用戶操做系統
  • 分佈式操做系統

計算機的快速發展與各個底層硬件的快速發展是分不開的(CPU的計算能力,IO的讀寫能力和網絡帶寬)編程

2、OS的啓動、中斷、異常和系統調用

2.1 計算機系統啓動流程

BIOS = Basic Input/Output System數組

graph LR
A[BIOS]-->B[Bootloader]
B --> C[OS]

2.1.1 BIOS啓動流程

POST = Power-On Self-Test緩存

graph LR
A[POST]-->B[啓動順序]
B-->C[主引導記錄]

2.1.2 主引導記錄

主引導記錄(MBR)= Master Boot Record網絡

graph LR
A[MBR]-->B[分區表]
B-->C[活動分區]

2.1.3 硬盤啓動

硬盤啓動分爲三種狀況:架構

  1. 卷引導記錄(Win)
  2. 擴展分區和邏輯分區(不常見)
  3. 啓動管理器(Linux的Grub)

卷引導記錄(VBR)= Volume boot record併發

graph LR
A[活動分區]-->B[VBR]
B-->C[OS]

啓動管理器模式:

graph LR
A[MBR]-->B[Grub]

2.1.4 操做系統啓動

graph LR
A[Load /boot/kernel]-->B[run /sbin/init]

2.2 中斷、異常、系統調用

  • 中斷:不一樣硬件設備的計時器或網絡中斷(外設發起)(異步)
  • 異常:非法指令或其餘失敗的處理狀態(應用程序發起)(同步)
  • 系統調用:應用程序主動向操做系統發出的服務請求(應用程序發起)(同步或異步)

2.2.1 中斷處理流程

graph LR
A[外設設置中斷標記] --> B[保存現場]
B --> C[中斷程序處理]
C --> D[清除中斷標記]
D --> E[恢復現場]

2.2.2 異常處理流程

graph LR
A[保存現場] --> B[異常處理]
B --> C[殺死異常程序]
B --> D[重啓發生異常的程序]
C --> E[恢復現場]
D --> E[恢復現場]

2.2.3 系統調用處理流程

應用程序沒法直接操做硬件,須要OS提供的服務接口來間接調用,例:
C語言的printf()函數,執行時會調用OS的write()接口

3、內存管理

參考文章http://www.javashuo.com/article/p-gdeeqtlo-mw.html

3.1 計算機體系結構

計算機基本硬件結構 = CPU + 內存 + 外設

CPU = 運算器 + 寄存器 + 控制器 + Cache(L1 + L2)+ 存儲管理單元(MMU)

3.2 內存分層體系

越是靠近CPU的內存,讀取速度越快,由近及遠依次是:
CPU寄存器 => Cache => 主存 => 虛擬內存

操做系統在內存管理上要完成的任務:

  • 抽象
    • 邏輯地址空間 != 實際地址空間
  • 保護(隔離)
    • 同時運行多個應用,每一個應用有一片獨立的地址空間
  • 共享
    • 進程間可使用共享內存進行交互和數據的傳遞
  • 虛擬
    • 內存不足能夠利用硬盤得到更多的地址空間

3.3 地址空間和地址生成

  • 邏輯地址空間:一個運行程序所擁有的內存範圍。該地址是相對於當前進程數據段的地址,不和絕對物理地址相干。一個邏輯地址,是由一個段標識符加上一個指定段內相對地址的偏移量,表示爲 [段標識符:段內偏移量]。
  • 線性地址:是邏輯地址到物理地址變換之間的中間層。
  • 物理地址空間:硬件支持的地址空間。

邏輯地址------(段機制)------->線性地址------(頁機制)------->物理地址。

既然邏輯地址最終要轉換爲物理地址,那麼爲什麼還須要邏輯地址呢?

邏輯地址提供了權限檢查功能:好比咱們設置邏輯地址和物理地址之間的映射關係時,能夠設置某塊地址是隻讀的,只寫的,只有CPU處於管理模式時才能訪問等。這些功能可讓系統的內核,用戶程序的運行空間相互獨立:用戶程序即便出錯,也沒法破壞內核;用戶程序A崩潰了,也沒法影響到用戶程序B。

3.3.1 邏輯地址生成過程

graph LR
A[C程序.c] --> |編譯| B[編譯程序.s]
B --> |彙編| C[彙編程序.o]
C --> |連接| D[執行程序.exe]
D --> |加載| E[應有載入內存]

各個步驟的做用:

  • 編譯:C程序代碼中,每一個指針(變量名、函數名)就表明着一個邏輯地址,但該地址對硬件而言是不友好的,所以先通過編譯,將代碼轉爲語法樹,經過符號來描述地址。
  • 彙編:通過彙編,將上一步的語法樹轉爲機器語言,使用一段相對連續的,從零開始的地址描述程序。更加接近底層硬件語言。
  • 連接:一個大的程序,可能經過多個.o文件組成,因此經過連接,將多個從零開始描述的.o文件組合到一塊兒,而且使之不發生內存衝突。由此組成成爲一個.exe應用程序,但此時該程序還存放在硬盤上。
  • 加載:將上一步中,硬盤上的應用程序,經過必定的偏移量加載到內存中。此時的地址依然是邏輯地址。

具體流程以下圖:
image

3.3.2 物理地址生成過程

graph LR
A[CPU加載邏輯地址內容] --> B{查看MMU中是否映射了物理地址}
B --> |有| L[得到物理地址]
B --> |沒有| C{到主存中查找是否有物理地址映射表}
C --> |有| L
L--> D[讀取物理地址的內容]

3.4 連續內存分配

3.4.1 內存碎片

  • 外部碎片:在分配單元間未使用的內存
  • 內部碎片:在分配單元中未使用的內存

3.4.2 分區的動態分配

何時分配?

  1. 應用程序啓動,運行棧加載到內存的時候,分配一塊連續的內存空間
  2. 應用程序加載數據時

內存分配算法

1. 首次適配

如要分配N byte,在內存中查找第一個可用(>=N)的空閒塊,以知足最快分配。

需求:1. 按照地址排序; 2. 分配須要尋找合適的空閒塊; 3. 內存回收後,要將相鄰塊進行合併。
優點:實現簡單; 易於產生更大數據塊。
劣勢:會產生外部碎片; 不肯定性。

2. 最優適配

如要分配N byte,在內存中查找第一個可用(>=N)的且最小的空閒塊,以知足最快分配。更大的利用小空間。

需求:1. 按照剩餘空間大小排序; 2. 分配須要尋找 最 合適的空閒塊; 3. 內存回收後,要將相鄰塊進行合併。
優點:實現簡單; 適合大量分配小內存。
劣勢:重分配慢; 易產生大量微小的外部碎片。

3. 最差適配

如要分配N byte,在內存中查找第一個可用(>=N)的且最大的空閒塊,以知足最快分配。避免出現大量微小空間。

需求:1. 按照剩餘空間大小排序(倒序排列); 2. 分配須要尋找 最 合適的空閒塊; 3. 內存回收後,要將相鄰塊進行合併。
優點:適合大量分配中等大小內存。
劣勢:重分配慢; 易產生外部碎片; 會破壞大的空閒塊,使更大的應用沒法分配。

3.4.3 壓縮式碎片整理

將非運行時應用佔用的內存移動到相鄰的一處內存,以減小應用間的外部碎片

3.4.4 交換式碎片整理

利用虛擬內存,將非運行時應用佔用的內存移動到虛擬內存,以使的運行時應用有更大的空閒空間使用。

3.5 非連續內存分配

優勢:

  1. 內存分配在物理地址空間是非連續的
  2. 能夠更好,最大化的利用物理內存和管理
  3. 容許共享代碼和數據(共享庫等、、)
  4. 支持動態加載和動態連接

缺點:

  1. 內存管理自己的一些維護開銷
  2. 硬件的配合和支持(分段和分頁)

3.5.1 分段(Segmentation)

爲了更好的分離和管理。

使用分斷管理機制後,在邏輯地址層面,地址看上去是連續的,而在物理地址層面,能夠將不一樣的代碼段分離出來管理,從而實現共享,管理,權限保護等。

image

分斷尋址方案

image

3.5.2 分頁(Paging)

先劃分物理內存至固定大小的幀(Frame),用二元組(f,o)表示幀號和幀內偏移;劃分邏輯地址空間至相同大小的頁(Page),用二元組(p,o)表示頁號和頁內偏移。幀更像是相框,裏面啥也沒有,放了照片(邏輯頁面)纔有意義。

物理尋址方式例題:

16-bit的地址空間,512byte大小的頁幀大小,則物理地址爲(3,6)的實際地址是多少?
解:

512 = 2^9 // 頁幀須要使用9bit表示
16-9 = 7  // 頁號須要使用7bit表示
因此實際物理地址的二進制表示爲 0000011 000000110
轉爲十進制爲1542,也能夠用 3 * 512 + 6 = 1542

image

3.5.3 頁表的缺點

每一個運行程序都有一個頁表,屬於程序的運行狀態,會動態的發生改變。

缺點:

  1. 經過分頁實現的內存映射,須要進行兩次查詢(頁表查詢,物理地址訪問)
  2. 頁表會佔用額外的內存,假如64bit機器的每頁大小爲1024byte,則最大會有2^54個頁號
  3. 每一個應用都有一份頁表,對於問題2,就更加麻煩了

上述問題,可使用緩存間接訪問兩種方式解決。

3.5.4 頁表的優化

TLB(Translation Look-aside Buffer)

image

TLB是一塊特殊的快表,能夠更快的得到物理幀號,且TLB的miss概率能夠忽略不計。
頁表有個特殊的概念叫駐留位(上圖標紅的地方),駐留位爲0的表示物理幀號不存在,也就是本頁映射無效。

多級頁表

image

反向頁表

頁寄存器方案:

頁表反向設計,頁表索引以幀號爲index,由於物理內存是固定的,而邏輯空間是無限增加的,所以大大減小了頁表大小。

優:

  • 佔用空間小
  • 轉換表只與物理內存有關,與邏輯內存無關

弊:

  • 信息對調,沒法根據頁號找到幀號
關聯內存方案:。。。
Hash方案:。。。

4、虛擬內存管理

4.1 原由

但願有個很大、很快、很便宜的存儲器,最好掉電數據不丟失。所以,貪心的人類想到了利用硬盤。

早期的計算機因爲硬件限制,常常會出現內存不夠的狀況,當時主要經過覆蓋技術(只把須要的指令和數據存在內存中)交換技術(把暫時不用的指令和數據存到swap中)

4.2 覆蓋技術

產生於20世紀80年代,通常用於多道程序系統的DOS操做系統。當時計算機的內存容量大多隻有640kb。

目的:

在較小的內存容量下運行較大的應用程序,與分區存儲管理配合使用。

實現:

以下圖所示,A程序爲常駐應用,但BC程序不會相互調用,DEF程序也不會相互調用,因此就可讓以後調用程序內存覆蓋以前調用的內存空間。(以模塊爲粒度覆蓋)

image

缺點:

  1. 由程序員來考慮把一個大程序,劃分爲若干小的功能模塊,並肯定各個模塊之間的依賴,覆蓋關係。增長了系統複雜性和編程難度。
  2. 覆蓋模塊從外存裝入內存,是典型的時間換空間。

4.3 交換技術

通常用於Unix操做系統。

目的:

讓正在運行或須要運行的程序能夠得到更多內存資源。

實現:

將暫時沒有運行的程序移到外部swap,從而得到更多的物理內存。(以程序爲粒度交換)

image

注意:

  1. 什麼時候進行換入(swap in)和換出(swap out)操做? 儘可能少,內存不夠再換出
  2. 交換分區(swap)的空間要設置多大?必須足夠大,能夠存放所用用戶進程的內存拷貝。
  3. 內存換入時的地址重定向問題?要採用動態地址映射法。

4.4 虛存技術

在有限容量的內存中,以更小的頁粒度爲單位裝入更多更大的程序(對覆蓋技術和交換技術的一次融合)。

目的:

  1. 像覆蓋技術同樣,不將應用所有載入內存,而是載入部分,以此來運行比物理內存大不少的應用程序。但不須要程序員維護。
  2. 像交換技術同樣,可以實現應用在內存和外存之間的交換。但不以程序爲粒度交換。

要求:

局部性原理:

指程序在執行過程的一個較短期內,所執行的指令地址和指令操做數地址,分別侷限在一小塊區域。

  • 時間局部性:一條指令的一次執行和下次執行,數據的一次訪問和下次訪問都集中在較短期內;(相似緩存、預加載,增長命中率)
  • 空間局部性:當前指令和臨近的幾條指令,當前訪問數據和臨近的數據都集中在一塊較小的區域內;(減小swap次數,同上)

舉例: 對於一個二維數組[1024 * 1024], 對於橫向打印和豎向打印,效率差別仍是至關大的!

特徵:

  1. 充分利用CPU尋址能力,得到更大的可用物理內存(主存+虛存)
  2. 部分交換
  3. 不連續性:邏輯地址也能夠不連續

虛擬頁式內存管理:

這種管理方式,是大多數虛擬存儲設備的選擇,即在頁式存儲的基礎上,增長了請求調頁和頁面置換功能。

請求調頁:應用程序裝入內存時,不是一次性載入所有的頁片到內存,而是用到哪一個頁片載入哪一個幀。(局部加載)
頁面置換:在應用運行過程當中,若是發現須要的頁片不在內存中,就會發生「斷頁中斷請求」,系統處理這個中斷,就會將虛擬內存中的幀加載到物理內存中。(延遲調用)

頁表項結構

image

缺頁中斷處理過程

image

語言描述

缺頁中斷髮生時的事件順序以下:

1) 硬件陷入內核,在堆棧中保存程序計數器。大多數機器將當前指令的各類狀態信息保存在特殊的CPU寄存器中。

2) 啓動一個彙編代碼例程保存通用寄存器和其餘易失的信息,以避免被操做系統破壞。這個例程將操做系統做爲一個函數來調用。

3) 當操做系統發現一個缺頁中斷時,嘗試發現須要哪一個虛擬頁面。一般一個硬件寄存器包含了這一信息,若是沒有的話,操做系統必須檢索程序計數器,取出這條指令,用軟件分析這條指令,看看它在缺頁中斷時正在作什麼。

4) 一旦知道了發生缺頁中斷的虛擬地址,操做系統檢查這個地址是否有效,並檢查存取與保護是否一致。若是不一致,向進程發出一個信號或殺掉該進程。若是地址有效且沒有保護錯誤發生,系統則檢查是否有空閒頁框。若是沒有空閒頁框,執行頁面置換算法尋找一個頁面來淘汰。

5) 若是選擇的頁框「髒」了,安排該頁寫回磁盤,併發生一次上下文切換,掛起產生缺頁中斷的進程,讓其餘進程運行直至磁盤傳輸結束。不管如何,該頁框被標記爲忙,以避免由於其餘緣由而被其餘進程佔用。

6) 一旦頁框「乾淨」後(不管是馬上仍是在寫回磁盤後),操做系統查找所需頁面在磁盤上的地址,經過磁盤操做將其裝入。該頁面被裝入後,產生缺頁中斷的進程仍然被掛起,而且若是有其餘可運行的用戶進程,則選擇另外一個用戶進程運行。

7) 當磁盤中斷髮生時,代表該頁已經被裝入,頁表已經更新能夠反映它的位置,頁框也被標記爲正常狀態。

8) 恢復發生缺頁中斷指令之前的狀態,程序計數器從新指向這條指令。

9) 調度引起缺頁中斷的進程,操做系統返回調用它的彙編語言例程。

10) 該例程恢復寄存器和其餘狀態信息,返回到用戶空間繼續執行,就好像缺頁中斷沒有發生過同樣。

流程圖

image

與分頁有關的工做

摘自[https://blog.csdn.net/qq_22238021/article/details/80192776]

操做系統要在下面的四段時間裏作與分頁相關的工做:進程建立時,進程執行時,缺頁中斷時和進程終止時。

當在分頁系統中建立一個新進程時,操做系統要肯定程序和數據在初始時有多大,併爲它們建立一個頁表。操做系統還要在內存中爲頁表分配空間並對其進行初始化。當進程被換出時,頁表不須要駐留在內存中,但當進程運行時,它必須在內存中。另外,操做系統要在磁盤交換區中分配空間,以便在一個進程換出時在磁盤上有放置此進程的空間。操做系統還要用程序正文和數據對交換區進行初始化,這樣當新進程發生缺頁中斷時,能夠調入須要的頁面。某些系統直接從磁盤上的可執行文件對程序正文進行分頁,以節省磁盤空間和初始化時間。最後,操做系統必須把有關頁表和磁盤交換區的信息存儲在進程表中。

調度一個進程執行時,必須爲新進程重置MMU,刷新TLB,以清除之前的進程遺留的痕跡。新進程的頁表必須成爲當前頁表,一般能夠經過複製該頁表或者把一個指向它的指針放進某個硬件寄存器來完成。有時,在進程初始化時能夠把進程的部分或者所有頁面裝入內存中以減小缺頁中斷的發生,例如,PC(程序計數器)所指的頁面確定是須要的。

缺頁中斷髮生時,操做系統必須經過讀硬件寄存器來肯定是哪一個虛擬地址形成了缺頁中斷。經過該信息,它要計算須要哪一個頁面,並在磁盤上對該頁面進行定位。它必須找到合適的頁框來存放新頁面,必要時還要置換老的頁面,而後把所需的頁面讀入頁框。最後,還要備份程序計數器,使程序計數器指向引發缺頁中斷的指令,並從新執行該指令。

進程退出時,操做系統必須釋放進程的頁表、頁面和頁面在硬盤上所佔用的空間。若是某些頁面是與其餘進程共享的,當最後一個使用它們的進程終止的時候,才能夠釋放內存和磁盤上的頁面。

後備存儲(Backing Store)

在何處保存未加載的幀?

  1. 可以簡單的識別在二級存儲器中的頁
  2. 交換空間(磁盤或者文件)

後備存儲能夠有哪些?

  1. 一個虛擬地址空間的頁:能夠被映射到一個文件的某個位置
  2. 代碼段:能夠映射到可執行的二進制文件
  3. 動態共享程序段:映射到動態調用的庫文件
  4. 其餘段:映射到交換文件中

虛擬內存性能

有效存儲訪問時間(EAT)= Effective Memory Access Time

EAT = 訪問時間 * 頁表命中率 + 缺頁處理時間 * 缺頁概率

例子:

訪問時間: 10ns
磁盤訪問時間:5ms = 5 * 10^6 ns
page fault rate:p 
dirty page rate(頁內容改變,同步到虛擬內存機率):q

EAT = 10 * (1 - p) + 5 * 10^6 * p * (1 + q)

由上述例子能夠看出,變量p對於總體EAT的影響最重要。

4.5 頁面置換算法

缺頁概率,是嚴重影響虛擬內存效率的一個因素,而缺頁概率與頁面置換算法息息相關。

功能:當缺頁中斷髮生,須要加載新的幀頁到內存,但當應用內存已滿時,須要選擇淘汰物理內存中的幀來給新的幀資源。

目標:儘量的減小頁面換進換出次數。
對於常駐內存(如操做系統或其餘關鍵應用)添加鎖定標誌位,避免換出。

分類:分爲局部頁面置換和全局頁面置換兩大類

  • 局部頁面置換:
    1. 最優頁面置換算法(OPT)(最晚重用被淘汰)(理想狀態,沒法實現,可爲依據)
    2. 先進先出算法(FIFO)(存活久的被淘汰)(利用鏈表便可實現,最差狀況下性能較差)
    3. 最近最久未使用算法(LRU)(最久沒用被淘汰)(鏈表、堆棧可實現,但開銷較大)
    4. 時鐘頁面置換算法(Clock)(利用FIFO優化的LRU)(環形鏈表選最老)
    5. 二次機會法(??)(Clock髒頁版)(兩條命的命中高,有了髒位換出少)
    6. 最不經常使用算法(LFU)(有的最少被拋棄)(表中加個計數器)
  • 全局頁面置換:
    1. 工做集頁面置換算法(??)(利用工做集的LRU)(無須缺頁就淘汰,利用時刻來換出)
    2. 缺頁率頁面置換算法(PFF)(動態改變常駐集的工做集算法)(根據缺頁頻率,淘汰多個頁面)

4.5.1 最優頁面置換算法(OPT)

基本思路:當一個缺頁中斷髮生,須要進行頁面置換時,對於當前內存中的每個邏輯頁面,計算它下一次被訪問時還需等待的時間,從中選擇等待時間最長的頁面,做爲置換頁。

評價:該算法沒法實現或者說很難實現,由於OS沒法預知每一個頁面下次訪問須要的等待時間,但該算法能夠做爲其餘算法評定的依據。

例圖:
image

4.5.2 先進先出算法(FIFO)

基本思路:對於當前內存中的每個邏輯頁面,計算它載入內存的時間,從中選擇駐留時間最長的頁面,做爲置換頁。

評價:利用鏈表實現,載入向鏈尾加,換出刪除鏈表頭便可。

例圖:
image

4.5.3 最近最久未使用算法(LRU)

基本思路:選擇最久未被使用的幀頁,做爲置換頁。

評價:時間軸上與最優算法相反,符合局部性原理。在最近一段區間內,找到最久未使用的幀。對於記錄各頁面調用的前後順序,開銷較大,能夠利用鏈表或堆棧實現。

例圖:
image

4.5.4 時鐘頁面置換算法(Clock)

基本思路:與LRU類似,是FIFO的一種改進。是兩者之間的一種平衡。實現是在頁面中加入一個訪問位,一個頁面載入時,由硬件初始化爲0(軟件也能夠),若是頁面被訪問,則相應頁表項置爲1。將各頁表項組成一個環形鏈表,發生缺頁中斷時,指針循環判斷環形鏈表,若判斷的頁表項爲0,選爲置換頁,置換並訪問新頁後,新頁表項置爲1,指針下移;若判斷的頁表項爲1,則改成0,指針下移。

image

評價:時間軸上與最優算法相反,符合局部性原理。在最近一段區間內,找到最久未使用的幀。對於記錄各頁面調用的前後順序,開銷較大,能夠利用鏈表或堆棧實現。

例圖:
image

4.5.5 二次機會法()

基本思路:對Clock算法的一個改進,優化Clock算法對修改頁面的寫入邏輯,引入新位dirty bit(髒位)來標識內存修改過與虛存不一致。對於髒位爲0的頁面,沒必要進行同步回虛存的一步。而對於髒位爲1的頁面,多了一次存活機會,與訪問位用法同樣。

image

評價:優化Clock算法的換出效率,並利用兩個標識位擁有兩條命,來增長存活率,加大命中次數。

例圖:
image

4.5.6 最不經常使用算法(LFU)

基本思路:選擇訪問次數最少的頁爲置換頁。因此要維護一張表,對每一個頁都有個訪問計數器。

評價:LRU關注訪問過去時間,久的淘汰;LFU關注訪問次數,少的淘汰。

4.5.7 局部頁面置換算法總結:

Belady現象:

Belady(筆勒滴,一個科學家名)在採用FIFO算法時,有時會出現分配的物理頁面數增長,缺頁率反而提升(命中率反而降低)的反常現象。

例圖:
image
image

解決:LRU算法

FIFO、LRU、Clock三者比較?

  • FIFO、LRU都有先進先出思想,但LRU對於訪問算做一次新的進入,有局部性思想。
  • FIFO、LRU相比,LRU性能雖好,但開銷較大;而FIFO有Belady現象
  • LRU、Clock很類似,但Clock加入訪問位模擬LRU的訪問順序,而不用動態維護順序鏈表,開銷更小,但性能較LRU略有不足

局部頁面置換算法的問題:

對應用分配了固定的物理頁幀,必定程度上限制了系統靈活性,好比同時運行多個程序,但高峯期正好交錯開。因此能夠根據應用運行的不一樣階段,調整分配的物理頁幀,最大化利用系統資源。

4.5.8 工做集和常駐集

工做集:一個進程p當前執行時刻t前,在以前的定長的頁面訪問工做集窗口△階段,使用的邏輯頁面集合,用二元函數 W(t, △) 表示;隨時刻t變化,集合也在變化。 | W(t, △) |表示集合大小,即頁面數目。(一段時間內訪問的頁面集合)

常駐集:一個進程p在當前時刻t實際駐留在內存中(物理頁面)的頁面集合。(某時刻訪問的頁面集合)
常駐集 <= 工做集。

缺頁率:「缺頁次數」 / 「內存訪問次數」,影響因素:

  1. 頁面置換算法
  2. 分配的物理頁幀數(常駐集大小)
  3. 頁面自己大小
  4. 編寫的程序(是否符合局部性)

4.5.9 工做集頁面置換算法

基本思路:相似LRU最久未用被淘汰,但不一樣的是觸發事件不一樣,當時刻改變時(而非缺頁時)就會清理物理頁面,準備物理頁幀。

例圖:
image

4.5.10 缺頁率頁面置換算法(PFF)

基本思路:在工做集頁面置換算法基礎上,動態改變時刻窗口(△)大小,即常駐集大小。當缺頁率上升時,提升常駐集大小,反之減小。(淘汰的觸發時間是缺頁時,一次可能淘汰多個頁面)

評價:性能好,開銷大。

例圖:
image

4.5.11 抖動問題

什麼是抖動?
當分配的常駐集小於工做集,使進程產生不少缺頁中斷,頻繁進行換進換出,從而使運行速度變慢的現象叫作抖動問題。

產生緣由?
隨着駐留內存中應用的增長,分配給每一個應用的物理頁幀(常駐集)持續減小,缺頁率隨之提升。因此OS要選擇運行適當的進程數量,及每一個進程所需頁幀數,使併發水平和缺頁率達到必定平衡。

本期到此爲止,若有錯誤,望請指正!

相關文章
相關標籤/搜索