操作系統原理三:存儲器管理與虛擬存儲器


存儲器管理與虛擬存儲器

存儲器的功能是保存數據,存儲器的發展方向是高速、大容量和小體積

重定位:實現邏輯地址(相對地址)到物理地址(絕對地址)的映射

程序的裝入和鏈接

裝入

編輯----編譯----鏈接----裝入----運行

絕對裝入

  • 編譯后,裝入前已產生了絕對地址(內存地址),裝入時不再作地址重定位
  • 絕對地址的產生:1. 由編譯器完成,2. 由程序員編程完成
  • 對 1. 而言,編程用符號地址。

可重定位裝入

  • 靜態重定位:地址轉換在裝入時一次完成,由軟件實現(重定位裝入程序完成)。
    缺點:不允許程序運行時在內存中移動位置。

動態運行時裝入

  • 在裝入后不能移動
  • 該情況一般在執行時才完成相對地址向絕對地址的轉換,需要硬件地址變換 “重定位寄存器”的支持,才能保證進程的可移動性

鏈接

靜態鏈接

  • 對相對地址的修改
  • 變換外部調用符號

裝入時動態鏈接

  • 便於修改和更新
  • 便於實現對目標模塊的共享

運行時動態鏈接

連續分配方式

單一連續分配

  • 內存分為兩個區域:系統區,用戶區。應用程序裝入到用戶區,可使用用戶區全部空間
  • 最簡單,適用於單用戶、單任務的OS
  • 優點:易於管理
  • 缺點:對要求內存空間少的程序,造成內存浪費;程序全部裝入,很少使用的程序部分也占用內存

分區式連續分配

固定式

將內存划分成若干個連續區域,稱為分區。每個分區只能存儲一個程序,而且程序也只能在它所駐留的分區中運行。有n個分區,則可同時裝入n個作業/任務。

  1. 分區大小:
    相等
    不相等:不相等利用率更高
  2. 內存分配:
    數據結構
    • 分區表:將分區按大小排序,並將其地址、分配標識作記錄
      例:dos的MCB
  3. 優缺點:
    優點:簡單;缺點:有碎片(內零頭)

可變式

內存不預先划分好,當作業裝入時,根據作業的需求和內存空間的使用情況決定是否分配。若有足夠的空間,則按需分割一部分分區給該進程。

數據結構:

  1. 空閑分區表
  2. 空閑分區鏈

分配算法:

  1. 首次適應算法
    要求:分區按低址---高址鏈接,找到第一個大小滿足的分區
    低址部分不斷划分留下碎片,低址內存使用頻繁
  2. 循環首次適應算法
    從首次適應中上次找到的空閑分區的下一個開始查找
    空閑分區分布均勻,提高了查找速度,但缺乏大的空閑分區
  3. 最佳適應算法(和最壞適應算法)
    分區按大小遞增排序;分區釋放時需插入到適當位置

內存回收

  1. 上鄰空閑區:合並,改大小
  2. 下鄰空閑區:合並,改大小,首址
  3. 上、下鄰空閑區:合並,改大小
  4. 不鄰接,則建立一新表項

可重定位

連續式分配中,總量大於作業大小的多個小分區不能容納作業

緊湊:

  • 通過作業移動將原來分散的小分區拼接成一個大分區
  • 作業的移動需重定位,是動態(因作業已經裝入)

對換

  • 將阻塞進程,暫時不用的程序,數據換出
  • 將具備運行條件的進程換入
  • 類型
    • 整體對換:進程對換,解決內存緊張
    • 部分對換:頁面對換/分段對換:提供虛存支持
  • 對換空間的管理
    外存
    對換區文件區側重於對換速度,因此,對換區一般采用連續分配
    采用數據結構和分配回收類似於可變化分區分配
  • 換出
    1. 選出被換出進程:
      因素:優先級,駐留時間,進程狀態
    2. 換出過程:
      對於共享段:計數減1, 是0則換出,否則不換
      修改PCB和MCB(或內存分配表)
  • 換入
    1. 選擇換入進程:優先級,換出時間等
    2. 申請內存
    3. 換入

基本分頁存儲管理

連續分配引起碎片問題

碎片問題的解決方案:緊湊方式消耗系統開銷

離散分配:分頁、分段、段頁

分頁:將用戶程序地址分為若干個大小固定的區域,也就是頁

頁面和頁表

頁面和物理塊:邏輯空間和內存空間

頁面大小 :

  • 頁太大,頁內碎片大
  • 頁太小:頁表可能很長,換入/出效率低

地址結構:

邏輯地址A;頁大小L;頁內偏移d,則頁號P和頁內地址d:

\[P=INT\left [ \frac{A}{L} \right ] \]

\[d=\left [ A \right ]\% L \]

例:系統頁面大小為1kb,A=2170B,P=2,d=122

地址變換機構

基本任務:邏輯地址——物理地址的映射

  • 頁號→塊號:通過頁表來完成
  • 頁內地址→塊內地址:無需轉換

基本地址變換機構:

  • 越界保護
  • 每個進程對應一頁表,其信息(如長度、始址)放在PCB中,執行時將其首地址裝入頁表寄存器

需要考慮的問題:

  • 頁表放在哪里?整個系統的頁表空間有多大?

  • 直接映像的分頁系統對系統效能的不利影響?(影響執行速度,因為CPU至少要訪問兩次主存才能存取到所要數據)

  • 基本的地址變換機構

    ①頁表駐留在內存
    ②系統中設置一個頁表寄存器存放頁表在內存中的始址和頁表的長度
    ③缺點:兩次訪問主存,速度降低近1/2

假設訪問一次內存時間為t

\[EAT=t+t=2t \]

快表:
減少一次內存訪問

假設命中率為a,查找快表需要時間為λ,訪問一次內存時間為t

\[EAT=a\times λ+(1-a)\times (t+λ)+t=2t+λ-t\times a \]

多級頁表

  • 頁表可能很大,將其離散存放在不同頁塊中。
  • 建一“外部頁表”來管理這些離散頁表塊。
    相當於單級頁表中的頁表寄存器,一般應常駐內存。
    每項記錄頁表始址,且增加存在位。
  • 64位機器頁表一般>3級,最外層頁表常駐。

基本分段存儲管理

按程序的邏輯結構,將程序的地址空間划分為若干段,各段大小可不相同。在進行存儲分配時,以段為單位,這些段在內存中可以不相鄰接

每個段有其邏輯意義和功能,便於

  1. 方便編程
  2. 分段共享
  3. 分段保護
  4. 動態鏈接
  5. 動態增長

分段地址結構

段表

地址變換

分頁和分段的主要區別

  1. 頁是信息的物理單位,段是邏輯單位
  2. 頁長度固定,段長度不固定(由用戶指定)
  3. 一維與二維

段式管理的優缺點

優點:

  1. 程序的各段可獨立編譯(修改一個過程不會影響其它無關過程)
  2. 可采用不同的保護措施(段只包含一種類型的對象,可以有針對這種特定類型的合適的保護)
  3. 便於共享某些段(常見的例子是共享庫,如圖形庫)

缺點:

  1. 段長受限制(段長不定會出現空閑區上內存的浪費)
  2. 段是作為一個整體調入調出,操作時間長

段頁式存儲管理

將用戶程序分成諾干段,把每個段分成若干頁

采用段頁式存儲管理,在CPU中應設置段表控制寄存器

地址變換過程

段頁式存儲管理中,訪問快表失敗時,每訪問一條指令或存取一個操作數都要3次訪問主存


虛擬存儲器

常規存儲器管理方式的特征

  • 一次性(指全部裝入)
  • 駐留性(指駐留在內存不換出)

局部性原理

  • 時間局部性:如循環執行
  • 空間局部性:如順序執行

虛擬存儲器

  • 具有請求調入功能和置換功能,能從邏輯上對內存容量進行擴充的一種存儲系統
  • 實質:以時間換空間,但時間犧牲不大

虛存的實現方式:

  • 需要動態重定位

請求分頁系統

  • 以頁為單位轉換
  • 需硬件
    1. 請求分頁的頁表機制
    2. 缺頁中斷
    3. 地址變換機構
  • 需實現請求分頁機制的軟件(置換軟件等)

請求分段系統

  • 以段為單位轉換
    1. 請求分段的段表結構
    2. 缺段中斷
    3. 地址變換機構
  • 需實現請求分段機制的軟件(置換軟件等)

虛存特征:

  1. 離散性:部分裝入(若連續則不可能提供虛存),無法支持大作業小內存運行
  2. 多次性:局部裝入,多次裝入
  3. 對換性
  4. 虛擬性

請求分頁

需要:請求頁表機制,缺頁中斷機制,地址變換機制

請求頁表機制

狀態位指示是否已調入內存

缺頁中斷機制

每當所訪問的頁面不存在時,便產生一缺頁中斷,請求OS將所缺頁調入內存

  • 一般中斷在CPU一條指令執行完后才檢查,而缺頁中斷在指令執行期間立刻處理
  • 一條指令執行期間可能產生多次缺頁中斷

地址變換機制

請求分頁的內存分配

最小物理塊數:能保證進程正常運行所需的最小

  • 單地址指令,直接尋址:2塊(一塊存放指令頁面,另一塊存放數據頁面
  • 允許間接尋址:3塊

內存分配策略:

  1. 固定分配局部置換:
    固定分配:為每個進程分配一定物理塊,不再改變
    局部置換:缺頁只能從分配的n個頁中選一換出,再調入
    -難以確定固定分配的頁數(少:置換率高; 多:浪費)
  2. 可變分配全局置換:
    可變分配:為每個進程分配一定物理塊,運行期間可增減
    全局置換:缺頁從OS保留的空閑塊取出分配,或以所有進程物理塊為目標選出一塊換出,再分配
  3. 可變分配局部置換
    可變分配:為每個進程分配一定物理塊,運行期間可增減
    局部置換:只允許再該進程的頁面中選擇患處換入,如果頻繁發生中斷,OS再為其分配若干附加物理塊知道缺頁率減少

物理塊分配算法:

  1. 平均分配

  2. 按進程大小比例分配:
    n個進程,頁面數為Si,總頁面數為S,總物理塊m,分配到物理塊bi=

    \[b_{i}=\frac{S_{i}}{S}m \]

  3. 優先權:一部分按比例,一部分考慮優先權

頁面調入策略:

調入時機:

  • 預調:(根據空間局部性)目前:成功率≤50%
  • 請求調入:較費系統開銷,各有優劣

從何處調頁:

  • 對換區(連續):全部從對換區調入所需頁面, 快
  • 文件區(離散):修改過的頁面換出到對換區, 稍慢
  • UNIX方式:
    未運行過的頁面,都應從文件區調入
    曾經運行過但又被換出的頁面,從對換區調入
    對共享頁,應判斷其是否在內存區

頁面調入過程:

訪問頁面狀態位為0,向CPU發出缺頁中斷,中斷程序先保留CPU環境,查找頁表找到該頁所在的外存物理塊,若此時能容納新頁面,則啟動磁盤I/O,調入內存,修改頁表;若已滿,則按照置換算法,選一頁換出,如果該頁修改位為0,則不必寫回磁盤,繁殖則寫回磁盤。再調入所缺頁,並寫入快表。最后利用修改后的頁表訪問數據物理地址,再訪問數據

缺頁率:進程邏輯空間為n頁,系統分配物理塊數m,訪問頁面成功的次數為S,失敗的次數為F,A=S+F,缺頁率f=

\[f= \frac{F}{A} \]

頁面置換算法

先進先出(FIFO):淘汰最先進入內存的頁面


最佳(Optimal):淘汰最長(未來)時間內不再被訪問的頁面


最近最久未使用(LRU):

須為每個在內存中的頁面配置一個移位寄存器:R=Rn-1Rn-2...R1R0,訪問某物理塊時將相應寄存器的Rn-1位置1,定時信號每個一段時間寄存器右移1位,具有最小數值的寄存器就是LRU
然后再用棧保存當前頁面


Clock置換算法:

為每頁設置一位訪問位,將內存中所有頁面通過指針鏈接成一個循環隊列,被訪問時訪問位置1

淘汰時:訪問位是0,則換出;訪問位是1,則置0,給予頁面第二次駐留內存的機會,再按照FIFO檢查下一個頁面

改進Clock:對於修改過的頁面,換出時所付出的開銷更大

訪問位A,修改位M:A=0,M=0:未被訪問,未被修改,最佳淘汰頁

  1. 掃描循環隊列,尋找上述最佳淘汰頁,第一次掃描不改變A
  2. 1失敗則進入第二輪,尋找A=0,M=1;所有掃描過的頁面A置0
  3. 2失敗則進入第三輪,重復1,再失敗則進入2,一定能找到

性能分析

  1. 被訪問頁在內存中,且在快表中
    內存訪問有效時間EAT=查找快表時間λ+訪問實際物理地址時間t

    \[EAT=λ+t \]

  2. 被訪問頁在內存中,不在快表中
    查找快表+查找頁表+修改快表+訪問實際物理地址

    \[EAT=λ+t+λ+t \]

  3. 不在內存
    查找快表+查找頁表+缺頁中斷處理時間ε+修改快表+訪問實際物理地址

    \[EAT=λ+t+ ε+λ+t =ε+2(λ+t) \]

考慮到命中率a,缺頁率f:

\[EAT=λ+a\times t + (1-a)\times [t+f\times(ε+λ+t)+(1-f)\times (λ+t)] \]

僅考慮缺頁率,λ=0,a=0

\[EAT=t+f\times(ε+t)+(1-f)\times t \]

CPU利用率與多道程序度的關系:多道程序度指在內存中並發執行的程序數目。在低度情況下,CPU利用率呈線性變化關系。隨着度的上升,CPU利用率也逐漸上升,最終上升到一個最大值,若在這種情況下,進一步增加度,則系統發生抖動,且CPU利用率將迅速惡化.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM