1. 程式人生 > >第四章儲存器管理

第四章儲存器管理

1.程式的裝入和連結
程式進記憶體的一般過程:
編譯compiler:編譯程式:將使用者原始碼編譯成若干個目標模組。
連結link:連結程式:將形成的一組目標模組,及它們需要的庫函式連結在一起,形成一個完整的裝入模組。
裝入load:由裝入程式將裝入模組裝入記憶體,構造PCB,形成程序,開始執行(使用實體地址)。
邏輯地址 ====== 實體地址:
絕對裝入方式(absolute loading)
邏輯地址 重定位 實體地址:
靜態可重定位裝入方式(relocatable loading mode)
動態執行時(重定位)裝入方式(dynamic run-time loading)
① 絕對裝入方式
編譯程式生成的“目的碼”就是”裝入模組” ,邏輯地址直接從某個地址R處增長,裝入模組直接裝入記憶體地址R處。
實體地址由誰生成?
一般由編譯或彙編程式給出;
或由程式設計師賦予(要求程式設計師熟悉記憶體使用情況)
優點:裝入過程簡單。不需任何地址變換,程式中的邏輯地址與實際記憶體實體地址完全相同。
缺點:過於依賴硬體結構, 只適用早期針對硬體直接程式設計、單道環境下。
靜態可重定位裝入方式
地址對映在程式執行之前進行,重定位後實體地址不再改變。
可由專門設計的重定位裝配程式完成(軟):裝入時根據所定位的記憶體地址去修改每個邏輯地址,新增相應偏移量,重定位為實體地址。
優點:不需硬體支援,可以裝入有限的多道程式
缺點:軟體裝入一次完成,一個程式通常需要佔用連續的記憶體空間,程式裝入記憶體後不能移動。也不易實現共享。
動態執行時(重定位)裝入方式(dynamic run-time loading)
實際執行中往往會需要程式在記憶體中的各位置移動,即經常需要重定位到不同的實體地址上。這種執行時移動程式要求地址變換要快速,實現時一般依靠硬體地址變換機構——一個重定位暫存器。
程式裝入記憶體時,可多次重定位到不同位置。且可以不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。
更適用於部分裝入
② 裝入時動態連結
由一個目標模組開始裝入,若又涉及外部模組呼叫事件,裝入程式再找出相應的外部目標模組,並將它裝入記憶體,還要修改目標模組中的相對地址。
比靜態連結好在哪裡?
(1) 靜態連結好的程式,修改部分模組後,需重新連結成可裝入程式。動態方式則便於修改和更新。
(2) 便於實現共享。靜態的N個程式都需要一個模組時,需要進行N次拷貝。
③ 執行時動態連結:
裝入時動態連結的問題
許多情況下,事先不知道某應用程式本次執行需要哪些模組,只能全部裝入,裝入時全部連結在一起,效率低。
辦法:有的模組不經常使用就暫時不裝入,執行時用到了再裝入。(如程式總不出錯,就不會用到錯誤處理模組。)即執行時動態連結:執行時,將對某些模組的連結推遲到執行時才連結裝入。
優點:程式執行裝入的內容少了,加快了裝入過程,而且節省大量的記憶體空間。
2.連續分配方式
(1)單一連續分配方式
記憶體分為系統區和使用者區兩部分:
系統區:僅提供給OS使用,通常放在記憶體低址部分
使用者區:除系統區以外的全部記憶體空間,提供給使用者使用。
最簡單的一種儲存管理方式,只能用於單使用者、單任務的作業系統中。
優點:易於管理。
缺點:對要求記憶體空間少的程式,造成記憶體浪費;程式全部裝入,很少使用的程式部分也佔用記憶體。
(2)固定分割槽分配
把記憶體分為一些大小相等或不等的分割槽(partition),每個應用程序佔用一個分割槽。作業系統佔用其中一個分割槽。
提高:支援多個程式併發執行,適用於多道程式系統和分時系統。最早的多道程式儲存管理方式。
劃分為幾個分割槽,便只允許幾道作業併發
(3)動態分割槽分配
分割槽的大小不固定:在裝入程式時根據程序實際需要,動態分配記憶體空間,即——需要多少劃分多少。
空閒分割槽表項:從1項到n項:
記憶體會從初始的一個大分割槽不斷被劃分、回收從而形成記憶體中的多個分割槽。
動態分割槽分配
優點:併發程序數沒有固定數的限制,不產生內碎片。
缺點:有外碎片(分割槽間無法利用的空間)
(1)資料結構
空閒分割槽表:
記錄每個空閒分割槽的情況。
每個空閒分割槽對應一個表目,包括分割槽序號、分割槽始址及分割槽的大小等資料項。
空閒分割槽鏈:
每個分割槽的起始部分,設定用於控制分割槽分配的資訊,及用於連結各分割槽的前向指標;
分割槽尾部則設定一後向指標,在分割槽末尾重複設定狀態位和分割槽大小表目方便檢索。
(2)分割槽演算法
動態分割槽方式,分割槽多、大小差異各不相同,此時把一個新作業裝入記憶體,更需選擇一個合適的分配演算法,從空閒分割槽表/鏈中選出一合適分割槽
首次適應演算法FF
迴圈首次適應演算法
最佳適應演算法
最差適應演算法
快速適應演算法
(3)分割槽分配操作
分配記憶體
找到滿足需要的合適分割槽,劃出程序需要的空間
if s<=size,將整個分割槽分配給請求者
if s> size,按請求的大小劃出一塊記憶體空間分配出去,餘下部分留在空閒鏈中,將分配區首址返回給呼叫者。
回收記憶體
程序執行完畢釋放記憶體時,系統根據回收區首址a,在空閒分割槽鏈(表)中找到相應插入點,根據情況修改空閒分割槽資訊,可能會進行空閒分割槽的合併:
(4)動態重定位分割槽分配
使用者程式在記憶體中移動,將空閒空間緊湊起來提高空間利用率。但必然需要地址變化,增加“重定位”工作。
(5)記憶體空間管理之對換
當記憶體空間還是滿足不了需求時,引入“對換”思想:
把記憶體中暫時不能執行、或暫時不用的程式和資料調到外存上,以騰出足夠的記憶體;把已具備執行條件的程序和程序所需要的程式和資料,調入記憶體。
按對換單位分類:
整體對換(或程序對換):以整個程序為單位(連續分配)
頁面對換或分段對換:以頁或段為單位(離散分配)
3.記憶體離散分配分頁分段
連續分配方式:一個程序連續的裝進記憶體一個大小合適的區。
 “碎片”  “緊湊”  增大開銷
如果允許一個程序直接分散裝入多個不相鄰分割槽中,則無需“緊湊”
產生儲存管理的離散分配方式。
基本分頁儲存管理方式
本部分討論不具備對換功能的純分頁模式,作業執行需要全部裝入記憶體。
比較連續分配方式
作業邏輯地址空間有M大,就需要向記憶體申請一個M大的連續區域。
分頁的目的是更細粒度的處理空間,減少粗放管理的浪費或開銷問題。
1)頁面的概念
記憶體劃分成多個小單元,每個單元K大小,稱(物理)塊。作業也按K單位大小劃分成片,稱為頁面。
2)頁表的概念
為了找到被離散分配到記憶體中的作業,記錄每個作業各頁對映到哪個物理塊,形成的頁面對映表,簡稱頁表。
每個作業有自己的頁表
頁表的作用:
頁號到物理塊號的地址對映
要找到作業A
關鍵是找到頁表(PCB)
根據頁表找物理塊
3)地址的處理
連續方式下,每條指令用基地址+偏移量即可找到其物理存放的地址。
分頁方式下詳細的地址處理會如何呢?
作業相對地址在分頁下不同位置的數有一定的意義結構:
頁號+頁內地址(即頁內偏移)
關鍵的計算是:根據系統頁面大小找到不同意義二進位制位的分界線。
從地址中分析出頁號後,地址對映只需要把頁號改為對應物理塊號,偏移不變,即可找到記憶體中實際位置。
4)地址變換機構
在這裡插入圖片描述


訪問記憶體時間
設訪問一次記憶體時間為t,則基本分頁機制下EAT=2t
5)快表

問題:基本分頁機制下,一次指令需兩次記憶體訪問,處理機速度降低1/2,分頁空間效率的提高以如此的速度為代價,得不償失。
改進:減少第1步訪問記憶體的時間。增設一個具有“並行查詢”能力的高速緩衝暫存器,稱為“快表”,也稱“聯想暫存器”(Associative memory),IBM系統稱為TLB(Translation Look aside Buffer)。
快表放什麼?:
正在執行程序的頁表的資料項。
引入快表後的記憶體訪問時間如何?
快表的暫存器單元數量是有限的,不能裝下一個程序的所有頁表項。雖不能完全避免兩次訪問記憶體,但如果命中率a高還是能大幅度提高速度。
設一次查詢訪問快表時間為t’ ,則
EAT= at’ + (1-a)(t’+t) + t
= 2t +t’ -t

a

6)兩級多級頁表
頁表大小的討論
程序分頁離散存放,但頁表的資料是連續在存放記憶體的。而頁表可能很大:
將頁表分頁,並離散地將頁表的各個頁面分別存放在不同的物理塊中
為離散分配的頁表再建立一張頁表,稱為“外層頁表”,其每個表項記錄了頁表頁面所在的物理塊號。
多級頁表
反置頁表
每個程序一張頁表

一張OS 反置頁表 + 每程序一張外部頁表
反置頁表(Inverted Page Tale):站在物理塊的角度,記錄佔用它的已調入記憶體的程序標識和頁號。系統中只需一張該表即可。一個64MB記憶體,若頁面大小4KB(64M/4K=2^16=16K個物理塊),反置頁表佔用64KB(16K*4B)
程序外部頁表(External Page Table):每個程序一張,記錄程序不在記憶體中的那些頁面所在的外存物理位置。
如何提高檢索反置頁錶速度:記憶體容量大時,反置頁表的頁表項還是會很大,利用程序識別符號和頁號去檢索一張大的線性表很費時,可利用hash演算法提高檢索速度。
4.基本分段儲存方式
從提高記憶體利用率角度;
固定分割槽  動態分割槽 分頁
從滿足並方便使用者(程式設計師)和使用上的要求角度:
分段儲存管理:作業分成若干段,各段可離散放入記憶體,段內仍連續存放。
方便程式設計:如彙編中通過段:偏移確定資料位置
資訊共享:同地位的資料放在一塊方便進行共享設定
資訊保護
動態增長:動態增長的資料段事先固定記憶體不方便
動態連結:往往也是以邏輯的段為單位更方便
分段系統的基本原理
程式通過分段(segmentation)劃分為多個模組,每個段定義一組邏輯資訊。如程式碼段(主程式段main,子程式段X)、資料段D、棧段S等。
誰決定一個程式分幾段,每段多大?
編譯程式(基於原始碼)
段的特點
每段有自己的名字(一般用段號做名),都從0編址,可分別編寫和編譯。裝入記憶體時,每段賦予各段一個段號。
每段佔據一塊連續的記憶體。(即有離散的分段,又有連續的記憶體使用)
各段大小不等。
3)分頁和分段的基本區別
需求:分頁是出於系統管理的需要,是一種資訊的物理劃分單位,分段是出於使用者應用的需要,是一種邏輯單位,通常包含一組意義相對完整的資訊。
一條指令或一個運算元可能會跨越兩個頁的分界處,而不會跨越兩個段的分界處。
大小:頁大小是系統固定的,而段大小則通常不固定。分段沒有內碎片,但連續存放段產生外碎片,可以通過記憶體緊縮來消除。相對而言分頁空間利用率高。
邏輯地址:
分頁是一維的,各個模組在連結時必須組織成同一個地址空間;
分段是二維的,各個模組在連結時可以每個段組織成一個地址空間。
其他:通常段比頁大,因而段表比頁表短,可以縮短查詢時間,提高訪問速度。分段模式下,還可針對不同型別採取不同的保護;按段為單位來進行共享
4)資訊共享
需求:分頁是出於系統管理的需要,是一種資訊的物理劃分單位,分段是出於使用者應用的需要,是一種邏輯單位,通常包含一組意義相對完整的資訊。
一條指令或一個運算元可能會跨越兩個頁的分界處,而不會跨越兩個段的分界處。
大小:頁大小是系統固定的,而段大小則通常不固定。分段沒有內碎片,但連續存放段產生外碎片,可以通過記憶體緊縮來消除。相對而言分頁空間利用率高。
邏輯地址:
分頁是一維的,各個模組在連結時必須組織成同一個地址空間;
分段是二維的,各個模組在連結時可以每個段組織成一個地址空間。
其他:通常段比頁大,因而段表比頁表短,可以縮短查詢時間,提高訪問速度。分段模式下,還可針對不同型別採取不同的保護;按段為單位來進行共享
5)段頁式儲存方式
① 基本原理
將使用者程式分成若干段,併為每個段賦予一個段名。
把每個段分成若干頁
地址結構包括段號、段內頁號和頁內地址三部分