作業系統學習筆記——記憶體管理,學習筆記記憶體管理
本文內容如下
1. 記憶體管理的目的
2.記憶體管理的核心任務
3.記憶體管理的各種方式:
3.1分區管理。
3.2分頁管理
3.3分段管理
3.4段頁式管理
1記憶體管理的目的
電腦的主要目的是執行程式;
這些程式連通程式訪問的資料在執行期間必須在記憶體中(至少是部分存在於記憶體中,如採用虛擬記憶體技術)。
CPU調度提高了CPU效用和對使用者的響應,要實現CPU調度帶來的效能提升,就必須在記憶體中同時儲存幾個進程。
記憶體管理有多種管理方式,這些記憶體管理方式的目的就是 將多個進程同時儲存在記憶體中允許多道程式編程。同時要降低管理開銷。
2.記憶體管理的核心任務:將邏輯地址空間映射到分散的物理地址空間。
這句話有兩個要點,最好前後結合在一起看幾遍
1邏輯地址空間和物理地址空間的概念
邏輯地址空間是邏輯地址對應的地址空間,也叫相對空間,虛空間
物理地址空間是物理地址對應的地址空間,也叫絕對空間,實空間。
CPU產生的地址,指令中的地址,是邏輯地址(除非使用者編程的時候,直接根據實體記憶體編程,現在基本沒有這種方式)。
實體記憶體的單元所體現的地址,MAR中的地址就是物理地址。
2.映射,具體指什嗎?
怎麼將使用者程式裡的某一個邏輯地址在程式執行時對應到實體記憶體的一個地址,是作業系統的工作。
首先,來看使用者程式執行所經曆的幾個步驟
依次是原始碼(source code),編譯(compile,這裡指的是原始碼翻譯為變為目標檔案的過程),連結(link),裝入(load),執行(execute)。
然後,進行地址映射的時間大致有三種,編譯時間映射,裝入時映射,運行時映射。
編譯時間映射,裝入時映射分別在編譯,裝入的階段就產生了物理地址,這樣程式要想執行就必須保證物理地址處記憶體可用,也就是沒有被其他程式佔用,
這兩種方式都有不利於程式浮動(只能在固定地址執行),並且不支援虛擬儲存技術,編譯時間映射方式還需要使用者對記憶體使用量情況瞭解。
運行時映射則是在運行時將邏輯地址轉換為物理地址,這樣有利於程式的浮動,並且還可以支援虛擬儲存技術。
這幾種記憶體管理方式最核心的功能就是在運行時(大多是)將邏輯地址空間映射到分散的物理地址空間。
3.記憶體管理的各種方式:
記憶體管理有分區管理,分頁管理,分段管理,段頁式管理等方式。下面將從各個管理方式的基本思想,表的結構,地址映射,
以及儲存保護、記憶體共用、記憶體片段等方面介紹各各個管理方式
3.1分區管理。
分區管理又有單分區管理和多分區管理。
單分區管理:記憶體的使用者區只有一個分區,每個時刻只能運行一道程式。比如DOS。
多分區管理:記憶體的使用者區劃分為多個分區,每個分區每個時刻運行一道程式,支援多道程式設計,多分區管理又有靜態分區管理和動態分區管理。
靜態分區,在系統初始化時,系統將記憶體分成多個分區,分取數目固定,大小固定,每個分區每個時刻只能運行一道程式,使用固定分區表,記錄分區的位置,大小以及使用方式,會產生內片段。
動態分區,系統初始化時,使用者區記憶體只劃分為一個分區,記憶體按需分配。需要維護分區表——對已指派的分區進行管理,空閑分區表——對空閑分區進行管理,
分區分配演算法有First-fit,Best-Fit,Worst-Fit,First-fit依次掃描空閑部分,遇到大於等於所需要的大小的hole就分配;Best-Fit,掃描一遍找到大於等於所需要的大小的hole中的最小的;
Worst-Fit掃描一遍找到大於等於所需要的大小的hole中的最大的。都會產生外片段。
地址映射如下:PA表示物理地址,LA表示邏輯地址,base register表示分區開始地址,limit register表示分區的大小
PA = LA + base register
3.2分頁管理
基本思想
將實體記憶體分塊(幀,frame),將作業分頁(page),幀和頁的大小相等。
記憶體配置時以頁為單位。
一個作業在記憶體中的各個頁面可以不在連續的物理幀中,但是頁面在一個記憶體塊中是連續的。
需要使用頁表記錄幀的使用方式,包括已指派的,閒置,頁號對應的幀號等
邏輯地址劃分為兩部分,頁號(page number)和頁內位移量(page offset)
分配舉例
地址映射如下:PA = LA + base register
如果頁表在記憶體中,從取指令到執行完一條指令的過程,至少需要從記憶體取指令,讀記憶體頁表,找到幀號讀地址3次讀記憶體,影響效率,
可以使用硬體支援提高效率,採用TLB,translation look-aside buffers,旁路轉換表或者associativememory 相聯儲存空間,以內容為地址,搜尋快,可以提高效率。
記憶體保護
記憶體共用:條件
只能共用代碼,並且是唯讀純碼,不會自我修改,並且可共用程式碼必須出現在各自邏輯空間的相同位置。私人代碼和資料不能分享。
容易產生內片段
3.3分段管理
一些事實:
分頁存在的問題
實際記憶體與使用者所理解的記憶體的不一致性
共用困難(可能將一個獨立的模組劃分成多個頁面)
一般一個程式,由
主程式及若干子程式、函數、過程、方法等組成
還有若干資料結構:表、堆棧、數組、變數等
使用者的觀點
程式中的每一部分是邏輯上的獨立單位
在記憶體中也最好按該邏輯單位進行管理
也便於共用
基本思想
作業分段,記憶體按動態分區管理
記憶體配置以段為單位
每個段都有一個段名和長度
一個作業在記憶體中可以不連續,但在一個段內是連續的
邏輯地址的格式:<段號 ,段內位移量>
使用段表-記錄段與所在記憶體位置的對應關係
舉例
地址映射
記憶體共用:條件
只能共用代碼,並且是唯讀純碼,不會自我修改,並且可共用程式碼必須出現在各自邏輯空間的相同位置。私人代碼和資料不能分享。
3.4段頁式管理
基本思想
作業先分段,各段再分頁,記憶體劃分成與頁相等的頁框;
每個段都有一個段名;
記憶體配置以頁為單位;
每個作業有一個段表,記錄段在記憶體的起始地址以及段長;
每個段還對應一個頁表;
邏輯地址的格式:段號,段內位移量(頁號,頁內位移量)
地址映射
本文插圖來自 http://codex.cs.yale.edu/avi/os-book/OS9/slide-dir/os-figures.zip
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。