作業系統 第九章

2021-08-13 17:02:58 字數 3121 閱讀 9125

對標記為無效的訪問會產生頁錯誤陷阱

純粹按需調頁(pure demand paging)

一條指令可能訪問多個頁的記憶體(一頁用於指令,其它頁用於資料)則一頁可能產生多個頁錯誤, 不好的系統效能。 區域性引用(locality of reference)

頁表:有效無效位

次級儲存器 :用來儲存不在記憶體中的頁, 快速磁碟,交換裝置, 用於交換的這部分磁碟稱為交換空間(swap space)

請求調頁的關鍵要求 :能夠在頁錯誤後重新執行指令, 在出現頁錯誤時,儲存中斷程序的狀態(暫存器, 條件**, 指令計數器)

若頁錯誤出現在指令獲取時, 可以再次獲取指令

若出現在獲取運算元時, 那麼可以再次獲取指令, 再次解碼指令,然後再次獲取運算元。

9.2.2 按需調頁的效能

p為頁錯誤的概率, p接近於0, 頁錯誤越少, 那麼有效訪問時間為 :

有效訪問時間 = (1-p) * ma + p * 頁錯誤時間

按需調頁的另乙個重要方面 : 交換空間 的處理和使用

磁碟i/o到交換空間通常比到檔案系統要快。 因為 交換空間 按大塊來分配的, 並不使用檔案查詢和間接分配方法

如果在程序開始時將整個檔案映象複製到交換空間, 並從交換空間執行按頁排程, 那麼有可能獲得更好的調頁效果,另一選擇是開始時從檔案系統中進行按需調頁, 但是當出現頁置換時則將頁寫入交換空間, 這種方法確保只有所需的頁才從檔案系統中調入, 而以後出現的調頁時從交換空間中讀入的。

9.3 寫時複製

通過採用類似頁面共享的技術, 採用系統呼叫fork建立程序的開始階段可能不需要按需調頁, 這種技術提供了快速程序建立, 且最小化新建立程序必須分配的新頁面的數量

寫時複製(copy-on-write) : 允許父程序與子程序開始時共享同一頁面,這些頁面標記為寫時複製頁,即如果任何乙個程序需要對頁進行寫操作, 那麼就建立乙個共享頁的副本。

注意 只有可能修改的頁才需要標記為寫時複製,不能修改的頁(即包含可執行**的頁)可以為父程序和子程序所共享,寫時複製是一種常用技術,為許多作業系統所採用,如windows xp, linux和solaris

採用寫時複製 從**分配空閒頁?

許多os提供 空閒緩衝池 這些空閒頁在程序棧或隊必須擴充套件時可用於分配, 或用於管理寫時複製頁,作業系統通常採用 按需調零(zero-fill-on-demand)的技術以分配這些頁。 按需調零頁在需要分配之前先填零,清除了以前的內容。

fork()不同於寫時複製的fork() , fork()會將父程序掛起。子程序使用父程序的位址空間。如果子程序修改父程序位址空間的任何頁, 修改過的頁在父程序重啟時是可見的。

9.4 頁面置換

過度分配(over-allocating)

常用解決方法 :頁置換(page replacement)

9.4.1 基本頁置換

幀分配演算法(frame-allocation) 和 頁置換演算法(page-replacement algorithm)

如果在記憶體中有多個程序,那麼必須決定為每個程序各分配多少幀, 當需要頁置換時,必須選擇要置換的幀

記憶體的引用序列稱為引用串(reference string)

9.4.2 fifo頁置換

9.4.3 最優置換(optimal page-replacement algorithm)

9.4.4 lru頁置換

fifo :頁調入記憶體的時間

opt :頁將來使用的時間

最優置換和lru置換都沒有belady異常, 都屬於同一類演算法, 稱為 棧演算法(stack algorithm)

9.4.5 近似lru頁置換

1.附加引用位演算法

作業系統把每個頁的引用位轉移到其8位位元組的高位,包含著該頁在8個時鐘週期內沒有使用,無符號整數,最小值的頁為lru置換頁

數量可降為0, 只有引用位本身, 第二次機會頁置換演算法(second-chance page-replacement algorithm)

2. 二次機會演算法

基本演算法是fifo置換演算法

乙個頁如果經常使用以至於引用位總是被設定,不會被置換

實現演算法 (有時稱為時鐘演算法): 採用迴圈佇列

3.增強型二次機會演算法

9.4.6 基於計數的頁置換

* 最不經常使用頁置換演算法(lfu)

* 最常使用頁置換演算法(mfu) : 理論為具有最小次數的頁可能剛調入,還未使用

9.4.7 頁緩衝演算法

系統保留乙個空閒幀緩衝池

在犧牲幀寫出之前,所需要的頁就從緩衝池中讀到空閒記憶體,當在犧牲幀以後寫出時,它再加入到空閒幀池

9.4.8 應用程式與頁置換

有的作業系統允許特殊程式將磁碟作為邏輯塊陣列使用,而不需要通過檔案系統的資料結構,這種陣列有時稱為生磁碟(raw disk), 而對陣列的i/o則稱為生i/o。

雖然有些應用程式使用其特有的磁碟儲存服務更為高效,但是絕大多數程式使用通用檔案系統服務會更好

9.5 幀分配

若採用純按需調頁

9.6 系統顛簸

區域性置換演算法(local replacement algorithm) (或 優先置換演算法(priority replacement algorithm))能限制系統顛簸

區域性置換 : 乙個程序開始顛簸,那麼它不能從其他程序拿到幀,且不能使後者也顛簸

如果程序顛簸,那麼絕大多數時間內也會排隊來等待調頁裝置,由於調頁裝置的更長的平均佇列,頁錯誤的平均等待時間也會增加。因此,即使對沒有顛簸的程序, 其有效訪問時間也會增加。

區域性模型(locality model)

9.6.2 工作集合模型

工作集合模型(working-set model)是基於區域性性假設的

工作集合視窗(working-set window)

9.7 記憶體對映檔案

9.7.3 記憶體對映i/o

當通過記憶體對映串列埠傳送一長串位元組時,cpu寫乙個資料位元組到資料暫存器,並設定控制暫存器的乙個位以表示有位元組可用。

裝置讀取位元組,並清除控制暫存器的位以表示可以接收下乙個位元組。

接著,cpu可傳輸下乙個位元組,如果cpu採用輪詢方式來檢測控制位,這種操作稱為程式i/o(programmed i/o, pio)

如果採用接收裝置就緒後可發下乙個位元組的中斷的方式,稱為中斷驅動(interrupt driven)

筆記 作業系統概念 第九章

8.6.3 倒置頁表 頁表 程序識別符號,頁碼 實體地址 條目i,偏移d 調頁程式 pager 9.4.4 lru algorithm,least recent used algorithm 最近最少使用演算法 9.9.1 預調頁面 prepaging 9.9.3 tlb 範圍 9.9.4 倒置頁表...

第九章 ORM操作

flask sqlalchemy的使用 使用flask sqlalchemy中的sqlalchemy進行初始化 from flask sqlalchemy import sqlalchemy from flask import flask設定配置資訊 在config.py檔案中新增以下配置資訊 sq...

作業系統 第九章 虛擬記憶體管理

區域性性原理 乙個程式只要部分裝入記憶體就可以執行 程式部分裝入技術優點 區域性性原理 虛擬記憶體 虛存是對記憶體的抽象,構建在儲存體系之上,由作業系統來協調各儲存器的使用 虛擬記憶體大於物理記憶體 虛擬儲存器的大小由2個因素決定 使用虛擬記憶體的共享庫 寫時複製 當確定採用寫時複製頁面時,重要的是...