創作不易,來了的客官點點關注,收藏,訂閱一鍵三連?😜

系列文章目錄
作業系統NO.1 | 了解作業系統的基礎知識
概述
作業系統NO.2 | 詳解作業系統的非連續記憶體管理,通過本期內容你將了解內層的層次結構、分頁、分段等知識,
目錄
系列文章目錄
概述
作業系統思維導圖
計算機系統基本結構和作業原理
計算機系統的基礎結構
計算機硬體系統作業原理
記憶體的層次結構
記憶體分層體系
記憶體管理目標
在作業系統中管理記憶體的不同方法
地址空間和地址生產
地址空間的定義
地址的生成
地址安全檢查
連續記憶體分配
記憶體碎片問題
磁區的動態分配
第一匹配分配
最優適配分配
最差適配分配
碎片整理方法
非連續記憶體管理
何為非連續記憶體管理?
非連續記憶體管理的優缺點
分段
段訪問機制
分段尋址方案
分頁
分頁地址空間
幀(frame)
頁(page)
頁尋址機制
頁表
分頁機制存在的問題
TLB(Translation Look-aside Buffer)
反向頁表
分頁和分段的區別
作業系統思維導圖

計算機系統基本結構和作業原理
計算機系統的基礎結構
計算機系統是由硬體系統和軟體系統兩大部分組成,
計算機硬體: 計算機硬體由五個基本部分組成:運算器、控制器、存盤器、輸入設備和輸出設備,硬體是構成計算機系統各功能部件的集合,是由電子、機械和光電元件組成的各種計算機部件和設備的總稱,是計算機完成各項作業的物質基礎,計算機硬體是看得見、摸得著的,實實在在存在的物理物體,
計算機軟體:指與計算機系統操作有關的各種程式以及任何與之相關的檔案和資料的集合,其中程式是用程式設計語言描述的適合計算機執行的陳述句指令序列,

CPU:程式執行的地方
記憶體:防止程式的代碼和需要處理的資料
設備:主要是外設,例如硬碟、滑鼠等
計算機硬體系統作業原理
(1)計算機內部采用二進制來表示程式和資料,
(2)采用“存盤程式”的方式,將程式和資料放入同一個存盤器中(記憶體儲器),計算機能夠自動高速地從存盤器中取出指令加以執行,

作業原理
記憶體的層次結構
記憶體分層體系
運行記憶體(主存) / 磁盤(虛擬記憶體). 主存是在運行程式時所需要保存的資料空間,而磁盤是用于持久化資料保存的資料空間
CPU可以訪問的記憶體包括兩大類 : 暫存器 / cache(L1快取 / L2快取)

層次如下:
微處理器(CPU訪問)
|___CPU暫存器 / L1快取
|___L2快取
主存(程式訪問)
磁盤(程式訪問)
從CPU暫存器到磁盤,讀寫速度不斷降低,單位成本不斷降低,大小不斷增大,
記憶體管理目標
抽象:邏輯地址空間,應用程式在記憶體中運行有利于作業系統的有效管理,讓作業系統不要考慮太多底層的原理,只需要訪問一個連續地址空間,即邏輯地址空間,
保護:獨立地址空間,記憶體中可以運行多個不同的應用程式,應用程式相互之間可以訪問別的行程的地址空間,可能造成破壞,為了保護行程間的地址空間,需要進行隔離,因此需要獨立的地址空間,
共享:訪問相同記憶體,行程之間也需要互動,因此需要作業系統提供一個共享的空間,讓行程來訪問相同的記憶體,
虛擬:更多的地址空間,當我們在記憶體運行了較多行程后,記憶體可能不夠,此時我們可以將最需要最必要的程式(行程)放到記憶體中,而其他程式(行程,不需要進行訪問的程式)放到硬碟(磁盤)上,通過此方法可以實作更多的地址空間,

圖解:從圖中可以看到,在作業系統管理下,有四個放在記憶體中的程式(P1、P2、P3、P4),而正在運行的程式是P1,而其他等待中,尤其是P4可能由于當前正在等待某個行程需要一段時間后發生,因此P4的資料沒有必要放到記憶體中,作業系統就將P4匯入到硬碟中(虛擬),這樣也有利于P1、P2、P3程式的進行,
在作業系統中管理記憶體的不同方法
地址空間和地址生產
地址空間的定義
地址空間:地址空間分為物理地址空間和邏輯地址空間,
物理地址空間:硬體支持的地址空間,比如記憶體條代表的主存,以及硬碟代表的存盤空間,這兩種存盤空間即為物理記憶體,物理記憶體的控制和管理是由硬體來完成的,( address : [0, Max_sys] )
邏輯地址空間:一個運行的程式所看到的地址空間,一維的線性地址空間,( address : [0, Max_prog] )
地址的生成

邏輯地址的生成經過了很多轉換程序,該程序基本上不需要作業系統的幫助,是通過應用程式、編譯器、loader等來完成,執行的程式放大記憶體中后,仍然是邏輯地址,不是物理地址,這兩者的區別如下:

物理地址的生多了一條映射關系,圖中的指令有自己的邏輯地址,需要將次邏輯地址取出來,然后放到物理記憶體中,而這個程序中CPU的MMU表示了此程序的映射關系,從而得到邏輯地址對應的物理地址,
因此物理地址的生成步驟如下:
1.CPU執行指令時,ALU部件會需要指令的內容,它會發出請求獲取指令內容
2.CPU的MMU會查找邏輯地址的映射表,從而得出是否有對應的物理地址,找到后CPU就會給主存發送請求,告訴主存需要的物理地址
3.主存會把記憶體的內容通過總線傳給CPU,隨后CPU繼續執行指令
地址安全檢查

作業系統需要設定邏輯地址空間的基址和界限:
作業系統首先要確保每一個程式它可以有效訪問的地址空間,即起始地址和長度,因此得到哪塊區域是可以合法訪問的;
一旦CPU需要執行指令時,作業系統會查找map,map會指出邏輯地址是否滿足區域的限制,滿足限制就會得到物理地址的位置,否則CPU就會產生記憶體訪問例外,
連續記憶體分配
當一個程式準許運行在記憶體中時,分配一個連續的區間;
分配一個連續的記憶體空間給運行的程式以此訪問資料,
記憶體碎片問題
記憶體碎片問題指的是空閑的記憶體無法被利用的情況,記憶體碎片問題需要有效的避免,
記憶體碎片又分為外部碎片和內部碎片:
外部碎片 : 分配單元間的未使用記憶體
內部碎片 : 分配單元內的未使用記憶體
磁區的動態分配
簡單的記憶體管理方法,磁區的動態分配方式有以下三種 :
第一匹配分配
為了分配n位元組,使用第一個可用空閑塊以致塊的尺寸比n大,即在記憶體中找到第一個比需求大的空閑塊, 分配給應用程式,基本原理和實作方法:重按地址排序的空閑塊串列,分配需要尋找一個合適的磁區,重分配需要檢查,看是否自由磁區能合并于相鄰的空閑磁區,
優勢:簡單;易于產生更大空閑塊、想著地址空間的結尾,
劣勢:容易產生外部碎片,不確定性大,
最優適配分配
為了分配n位元組,使用最小的可用空閑塊,以致塊的尺寸比n大,即在記憶體中找到最小的空閑塊, 分配給應用程式,
基本原理和實作方法:為了避免分割大空閑塊,為了最小化外部碎片產生的尺寸,需要按照尺寸排列的空閑塊串列,分配需要尋找一個合適的磁區,重分配需要搜索和合并于相鄰的空閑分塊(若有),
優勢:當大部分分配時小尺寸時非常有效,比較簡單,
劣勢:外部碎片產生,重分配慢,以產生很多沒用的微小碎片,
最差適配分配
為了分配n位元組,使用最大可用空閑塊,以致快的尺寸比n大,即在記憶體中找到最大的空閑塊, 分配給應用程式,
基本原理和實作方法:為了避免有太多微小的碎片;按尺寸排列的空閑塊串列,分配很快(獲得最大的磁區),重分配需要合并于相鄰的空閑磁區,若有,需要調整空閑塊串列,
優勢:假如分配是中等尺寸效果最好,
劣勢:重新分配慢,產生外部碎片,易于破碎大的空閑塊以致大磁區無法被分配,

以上三種分配演算法,并沒有最好的一種的說法,根據需求不同,演算法適配不同,因此三者都不能滿足同時滿足需求,
碎片整理方法
壓縮式碎片整理
重置程式來合并孔洞,要求所有程式是動態可重置的,
注意:當程式處于等待時進行重置,同時需要考慮開銷,
交換式碎片整理
運行程式需要更多的記憶體,搶占等待的程式并回收他們的記憶體,
注意:需要考慮什么時候進行程式交換
非連續記憶體管理
何為非連續記憶體管理?
連續記憶體存在分配的缺點:分配給一個程式的物理記憶體是連續的;記憶體利用率較低以及有外碎片和內碎片的問題,而非連續記憶體分配管理可以來改善連續分配的問題,
非連續記憶體管理的優缺點
優勢:
一個程式的物理記憶體是非連續的;
更好的記憶體利用和管理;
允許共享代碼和資料;
支持動態加載和動態鏈接,
劣勢:
建立虛擬地址和物理地址的轉換難度大,因此有軟體方案和硬體方案,
硬體方案:分段和分頁,
軟體方案:虛擬記憶體
分段
分段的邏輯視圖


段訪問機制
段 : 一個段相當于一個記憶體“塊”,即一個邏輯地址空間,在程式中會有來自不同檔案的函式 ; 在程式執行時, 不同的資料也有不同的欄位, 比如 : 堆 / 堆疊 / .bss / .data 等

圖片:從左至右是硬體實作方案
分段尋址方案
邏輯地址空間連續,但是物理地址空間不連續,使用映射機制進行關聯
程式訪問記憶體地址需要:一個二維的元組(s,addr),即一個段號(S)和段內偏移(addr)
作業系統:作業系統建立并維護一張段表, 存盤(段號, 物理地址中的起始地址, 長度限制)
物理地址 : 段表中的起始地址 + 二元組中的偏移地址
分頁
分頁地址空間
1.劃分物理記憶體至固定大小的幀(物理頁),大小是2的冪
2.劃分邏輯地址空間至相同大小頁(邏輯頁),大小是2的冪
3.建立方案:轉換邏輯地址為物理地址,需要頁表和MMU/TLB
幀(frame)
物理記憶體被分割為大小相等的幀,
一個記憶體物理地址是一個二元組(f,o),f代表頁幀號,o代表幀內偏移(S位),
物理地址=2S*f+o
eg:16-bit的地址空間,9-bit(512byte)大小的頁幀物理地址(3,6)
物理地址=(3,6)
物理地址=1542

頁(page)
一個程式的邏輯地址空間被劃分為大俠相等的頁,
頁內偏移的大小=幀內偏移的大小
一個邏輯地址是一個二元組(p,o):
p:頁號(P位,2p個頁)
o:頁內偏移(S位,每頁有2s位元組)

頁尋址機制

程式運行的時候,CPU會尋址(邏輯地址以及虛擬地址),CPU通過(p,o)以及頁表來尋找幀號和幀內偏移,隨后幀號和幀內偏移得到物理地址,
因此,我們可以得到頁尋址機制:
1.頁映射到幀
2.頁是連續的虛擬記憶體
3.真是非連續的物理記憶體
4.不是所有的頁都有對應的幀
頁表
每個運行的程式都有一個頁表,頁表類似于一個陣列的對應關系,頁表的索引是頁號,對應的頁表項的內容是幀號,
屬于程式運行狀態,頁表會動態變化
地址轉換實體

記憶體空間的大小:邏輯地址空間(16bit即64kb),物理記憶體空間(32kb)
頁內的偏移和頁幀的偏移一致,頁、幀大小一樣;
(4,0):頁號4,頁內偏移:0
(3,1023):頁號3,頁內偏移:1023
紅色的0和1:
0代表物理頁幀在物理記憶體中不存在,CPU訪問到0會產生例外,
1代表物理頁幀在物理記憶體中存在,對應的頁幀號位00100即為4,因此映射出來頁號對應幀號是4,幀偏移和頁偏移一致為1023.
分頁機制存在的問題
1.空間代價問題
2.時間的開銷問題,訪問一個記憶體單元需要2次記憶體訪問,一次用于獲取頁表項,一次用于訪問資料
3.頁表可能非常大,64位機器(2^64)如果每頁1024位元組,會需要2^54大小的頁表
解決方法:
1.建立快取(caching),把最常用的程式和內容快取到接近CPU的地方
2.通過間接訪問的方式
3.為了讓頁表的記憶體空間盡量小,我們可以通過多級多層頁表來解決此問題,
TLB(Translation Look-aside Buffer)
TLB位于CPU內部(MMU里),是一種快取(cache),它的內容是一個鍵值對,key為p頁號和f幀號,得到f,因為頁偏移和幀偏移一致,就可以得到物理記憶體地址,
TLB使用關聯記憶體實作,具備快速訪問性能,
如果TLB命中,物理頁號可以很快備貨區;未命中對應的表項,回到頁表里面去查找f,隨后通過(CPU或軟體,具體看系統版本)執行會被更新到TLB中,
圖示如下:

二級頁表

二級串列:即拆分為了一級頁表和二級頁表,對于它的尋址程序,首先會找一級頁表,將p(頁號)作為index
查找一級頁面對應的頁表項,這個值是二級串列的起始地址,形成一個在二級頁表對于P2的頁表項,對應二級頁表映射的幀號,隨后根據頁內偏移o可以得到物理記憶體地址,
如果映射關系不存在,就沒必要再頁表中存放,以此節省了空間,
多級頁表
多級頁表:通過把頁號分位k個部分,來實作多級間接頁表,

反向頁表
反向頁表:不是讓頁表與邏輯地址的大小相對應,而是讓頁表與物理地址空間的大小相對應,即通過幀號f來查找邏輯地址里面的p頁號,



頁暫存器方案的權衡

基于關聯記憶體的方案

key:頁號,value:幀號
此方案同時也存在開銷過大的問題,技術復雜,
基于哈希查找方案

輸入的是:頁號+pid,中間通過哈希函式,輸出的幀號,
在反向頁表中通過哈希演算法來搜索一個頁對應的幀號
1.對頁號做哈希計算, 為了在幀表中獲取對應的幀號
2.頁 i 被放置在表 f(i) 位置, 其中 f 是設定的哈希函式
3.為了查找頁 i , 執行下列操作 :
計算哈希函式 f(i) 并且使用它作為頁暫存器表的索引, 獲取對應的頁暫存器
檢查暫存器標簽是否包含 i, 如果包含, 則代表成功, 否則失敗
分頁和分段的區別
1.目的的區別
頁是資訊的物理單位,分頁是為實作離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率,分頁是出于系統管理的需要而不是用戶需要,
段是資訊的邏輯單位,它含有一組其意義相對完整的資訊,分段的目的是為了更好地滿足用戶的需要,
2.長度的區別
頁的大小固定而且由系統決定,由系統把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬體實作的,因而在系統中只能有一種大小的頁面,
段的長度不固定,決定于用戶所撰寫的程式,通常由編譯程式在對程式進行編譯時,根據資訊的性質來劃分,
即分段時段的尺寸可以改變,而分頁時的頁增是不變的,
3.地址空間
頁的地址空間是一維的,即單一的線形地址空間,程式員只要利用一個記憶符就可以表示一個地址,
作業地址空間是二維的,程式員在標識一個地址時,既需要給出段名,又需給出段內地址,
4.碎片的區別
分頁有內部碎片無外部碎片;分段有外部碎片無內部碎片
5.絕對地址
處理器使用頁號和偏移量計算絕對地址;處理器使用段號和偏移量計算絕對地址
6.管理方式
對于分頁,作業系統必須為每個行程維護一個頁表,以說明每個頁對應的的頁框,當行程運行時,它的所有頁都必須在記憶體中,除非使用覆寫技識訓虛擬技術,另外作業系統需要維護一個空閑頁框串列,
對于分段,作業系統必須為每個行程維護一個段表,以說明每個段的加載地址和長度,當行程運行時,它的所有短都必須在記憶體中,除非使用覆寫技識訓虛擬技術,另外作業系統需要維護一個記憶體中的空閑的空洞串列,
特別的,當使用虛擬技術是,把一頁或一段寫入記憶體時可能需要把一頁或幾個段寫入磁盤,
7.共享和動態鏈接
分頁不容易實作,分段容易實作
此處參考https://blog.csdn.net/zhongyangtony
創作不易,客官點個贊,評論一下吧!超超和你一起加油?😜
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298112.html
標籤:其他
上一篇:??十大排序演算法詳解??——可能是你看過最全的,完整版代碼
下一篇:動態記憶體管理(下)
