相關文章:html
【操做系統】存儲器管理程序員
【操做系統】處理機調度簡述算法
【操做系統】之進程管理數據結構
【操做系統】經典的同步問題(生產者消費者問題, 哲學家進餐問題, 讀寫問題)性能
內存的容量有限, 若是有大做業或大量做業運行, 內存就會不夠用. 爲解決這一問題邊催生了虛擬存儲器的概念.spa
常規存儲器管理方式的特徵操作系統
- 一次性
做業必須一次性地所有裝入內存後才能開始運行.
- 駐留性
做業被裝入內存後, 整個做業都一直駐留在內存中, 其中任何部分都不會被換出, 直至做業運行結束.
局部性原理
由1968年P.Denning提出: 在較短的時間內, 程序的執行僅侷限於某個部分, 相應地, 它所訪問的存儲空間也侷限於某個區域.
他提出了幾個論點:3d
- 程序執行時, 除了少部分的轉移和過程調用指令外, 在大多數狀況下是順序執行的.
- 過程調用將會使用程序執行軌跡由一部分區域轉至另外一部分區域.
- 程序中存在許多循環結構, 這些結構雖然只有少數指令構成, 可是他們將被屢次執行.
- 程序中號包括許多對數據結構的處理, 這寫每每都侷限在很小的範圍內.
侷限性還表如今時間和空間方面指針
- 時間侷限性
因爲程序中存在大量循環操做, 那麼某些指令(數據)在不久以後會再次被執行(訪問).
- 空間侷限性
程序在一段時間內訪問的地址可能集中在必定的範圍內, 好比程序的順序執行.
虛擬存儲器
-
定義
-
具備請求調入和置換功能,
能從邏輯上對內存容量加以擴充的存儲器系統
特徵code
- 屢次性. 一個做業中的程序和數據無需再做業運行時一次性所有裝入內存, 而是容許被分紅屢次調入內存運行. (只需當前要運行的部分程序和數據裝入內存便可)
- 對換性. 一個做業中的程序和數據, 無須在做業運行時一直常駐內存, 而是容許在做業的運行過程當中進行對換操做.(在進程運行期間, 將有用的程序或數據換入, 無用的則換出)
- 虛擬性. 可以從邏輯上擴充內存容量. 提升內存利用率
虛擬性是以屢次性和對換性爲基礎的.
虛擬存儲器能夠經過請求分頁, 請求分段的方法實現, 它們都須要軟硬件支持, 主要硬件有頁(段)表機制, 缺頁(段)中斷機構, 地址變換結構
請求分頁存儲管理方式
請求頁表
頁號 |
物理塊號 |
狀態位P |
訪問字段A |
修改位M |
外存地址 |
分爲頁號, 物理塊號, 狀態位P, 訪問字A段, 修改位M, 外存地址
狀態位(存在位)P: 因爲該字段只有一位, 又稱位字. 用於指示該頁是否已調入內存, 供程序訪問時參考.
訪問字段A: 用於記錄本也在一段時間內被訪問的次數, 或記錄本頁最近已有多長時間未被訪問.
修改位M: 標識該頁在調入內存後是否被修改過.
外存地址: 用於指出該頁在外存的地址.
缺頁中斷機構
每當要訪問的頁面再也不內存時, 便產生依次缺頁中斷, 請求OS將所缺之頁調入內存.
- 指令在執行期間產生和處理中斷信號
- 一條指令在執行期間可能產生屢次缺頁中斷
地址變換結構
![](http://static.javashuo.com/static/loading.gif)
內存分配
最小物理塊數
最小物理塊數能保證進程正常運行, 它取決於指令的格式, 功能和尋址方式.
內存分配策略
內存在進行分配時能夠採起固定分配和可變分配.
- 固定分配, 爲每一個進程分配一組固定數目的物理塊, 在進程運行期間不可更改.
- 可變分配, 爲每一個進程分配必定數目的物理塊, 在進程運行期間能夠更改.
頁面置換時能夠採起全局置換和局部置換.
- 全局置換, 若是進程在運行期間返現缺頁, 則將OS所保留的空間物理塊取出一塊分配給該進程, 或者以全部進程的所有物理塊爲標的, 選擇一塊換出, 而後將所缺之頁調入.
- 局部置換, 若是進程在運行中發現缺頁, 則只能從分配給該進程的n個頁面中選出一頁換出, 而後在調入一頁, 以保證分配給該進程的內存空間不變.
經過以上能夠組合一下三種策略:
- 固定分配局部置換
爲每一個進程分配多少物理塊是根據進程類型(交互型或批處理型)或根據程序員的建議來肯定.
- 可變分配全局置換
凡是產生缺頁的物理塊, 都將得到新的物理塊.
- 可變分配全局置換
爲每一個進程分配必定數目的物理塊, 但當某進程發現缺頁時, 只容許從該進程在內存的頁面中選擇一頁換出.
物理塊分配算法
- 平均分配算法. 將系統中全部可供分配的物理塊平均分配給各個進程.
- 按比例分配算法. 根據進程大小按比例分配物理.假設系統中有n個進程, 每一個進程頁面數爲, 則系統中頁面數總和爲
. 物理總塊數爲m, 則每一個進程能分到的物理塊數爲
.
- 考慮優先權的分配算法. 一部分按比例分配, 一部分根據進程的優先權分配
頁面置換算法
最佳置換算法(Optimal)
OPT算法淘汰之後不使用或者在最長(將來)時間內再也不被訪問的頁面
最佳置換算法有最好的性能當沒法實現, 一般用它做爲標準評價其餘算法
先進先出置換算法(First In First Out)
淘汰最早進入內存的頁面, 即在內存中駐留時間最久的頁面.
最久未使用置換算法(Least Recently Used)
淘汰最近最久未使用的頁面
最少使用置換算法*(Least Frequently Used)
淘汰最近時期使用最少的頁面.
LFU算法的頁面訪問圖和LRU算法的頁面訪問圖徹底相同
時鐘置換算法(Clock)
爲每頁設置一位訪問位, 再將內存中的全部頁面都經過連接指針連接成一個循環隊列. 當某頁被訪問時, 其訪問位被置1. 置換算法在選擇一頁淘汰時, 只需檢查頁的訪問位. 若是是0, 就選擇該頁換出; 若爲1, 則從新將它置0, 暫不換出; 再按照FIFO算法檢查下一個頁面. 當檢查到隊列中的最後一個頁面時, 若其訪問位仍爲1, 則再返回到隊首去檢查第一個頁面.
![](http://static.javashuo.com/static/loading.gif)
![Alt text](http://static.javashuo.com/static/loading.gif)
改進Clock算法
淘汰的頁面便是未使用過的頁面, 又是未被修改過的頁面.
由訪問位A和修改位M能夠組合成下面四種類型的頁面:
- 1類(A=0, M=0): 表示該頁最近既未被訪問, 又未被修改, 是最佳淘汰頁.
- 2類(A=0, M=1):表示該頁最近未被訪問, 但已被修改, 並非很好的淘汰頁.
- 3類(A=1, M=0):最近已被訪問, 但未被修改, 該頁有可能再被訪問.
- 4類(A=1, M=1):最近已被訪問且被修改, 該頁可能再被訪問.
其執行過程分爲如下三步:
- 從指針所指當前位置開始, 掃描循環隊列, 尋找A=0且M=0的頁面, 將遇到的第一個頁面做爲淘汰頁. 在第一次掃描期間不改變訪問位A.
- 若是第一步失敗, 即查找一輪後未遇到的第一類頁面, 則開始第二輪掃描, 尋找A=0且M=1的頁面, 將所遇到的第一個這類頁面做爲淘汰頁. 在第二輪掃描期間, 將全部掃描過的頁面的訪問位置都置0.
- 第二步也失敗, 亦即未找到第二類頁面, 則將指針返回到開始的位置, 並將全部的訪問位復0. 而後重複第一步. 若果仍失敗, 必要時重複第二步, 此時就必定能找到被淘汰的頁.
改進的Clock算法可減小磁盤的I/O操做次數, 可是系統開銷會增長.
抖動
抖動現象: 在系統中的進程太多, 須要頻繁的進行進程的對換操做, 以致於佔用太多時間, 從而處理機的利用率降低並趨於0的狀況, 咱們稱之爲抖動. 一般用工做集來避免抖動
工做集是在某段時間內, 進程實際索要訪問的頁面集合. 咱們將這些頁面又稱爲活躍頁面.
預防抖動的方法
- 採起局部置換策略
- 工做集算法融入處理機調度
- 調節缺頁率
- 暫停進程
請求分段存儲管理方式
請求段表
段名 |
段長 |
段基址 |
存取方式 |
訪問字段A |
修改位M |
存在位P |
增補位 |
外存始址 |
分爲段名, 段長, 段基地址, 存取方式, 訪問字段A, 修改位M, 存在位P, 增補位, 外存地址
- 存取方式, 該字段爲兩位, 可執行(00), 可讀(01), 可寫(11)
- 訪問字段A, 記錄該段的訪問次數
- 修改位M, 表示該頁調入內存後是否已被修改過
- 存在位P, 指示本段是否已調入內存
- 增補位, 特有字段, 表示本段在運行過程當中是否作過動態增加.
- 外存始址, 指示本段在外存中的起始地址, 即起始盤塊號.
缺段中斷機構
![](http://static.javashuo.com/static/loading.gif)
地址變換機構
![](http://static.javashuo.com/static/loading.gif)