操作系统--内存管理超详细整理!
操作系統--內存管理超詳細整理!
操作系統之內存管理
程序的裝入和鏈接(確定邏輯地址產生的過程)
連續分配管理方式
非連續分配管理方式
基本分頁存儲管理方式
多級頁表
TLB
基本分段存儲管理(這是早于分頁的)
段頁式內存管理
操作系統之內存管理
學完一遍,做題像沒學一樣,特來整理
借用了小林coding圖解幫助記憶,🙏膜大佬
多個進程同時運行,要避免掉單片機那種絕對物理地址,將進程地址分隔開,獲得自己的虛擬地址(邏輯),互不影響。
內存管理的功能:
內存空間的分配和回收
地址轉換
內存空間的擴充
存儲保護
程序的裝入和鏈接(確定邏輯地址產生的過程)
編譯:編譯程序將用戶的代碼編譯成目標模塊(*.c —> .o)
這些目標模塊邏輯地址都是0開始,只是相對于該模塊的邏輯地址
鏈接:鏈接程序將目標模塊和所需庫函數鏈接在一起,形成裝入模塊(.exe)
鏈接階段完成重定位,形成完整邏輯地址空間
1.靜態鏈接:程序運行之前,鏈接成完整的可執行程序
2.裝入時動態鏈接:邊裝入邊鏈接
3.運行時鏈接:程序執行中需要才進行。便于修改更新、便于實現共享。
裝入:裝入程序將裝入模塊裝入內存運行
裝入程序將可執行代碼裝入內存時,必須通過地址轉換(邏輯->物理)
1.絕對裝入:無操作系統
2.可重定位裝入(靜態重定位):必須分配要求的全部內存空間,一旦進入內存,整個運行期間不能移動,不可再次申請內存空間
3.動態運行時裝入(動態重定位):轉換地址推遲到程序執行時,需要重定位寄存器。裝入部分可以運行,運行期間動態分配內存,便于程序段共享,可以提供比存儲空間大多的地址空間。
連續分配管理方式
單一連續分配(無需內存保護,內存中只有一道程序,有內部碎片)
固定分區分配(可劃分為大小相等和大小不等)(缺點:不能實現多進程共享一個主存區,利用率低)
動態分區分配(外部碎片產生)(首次適應算法是最好的!)
非連續分配管理方式
(加入額外的空間存儲分散區域的索引,實現利用分散的空閑分區)
基本分頁存儲管理方式
(由避免產生碎片引入分頁思想:主存空間劃分小塊,大小相等固定的基本單位,將每個進程以塊為單位劃分,進程執行時以塊申請主存的塊空間)
每個進程平均只產生半個塊大小的內部碎片🧩
理解過程:重點理解
內存:
大小相等的分區是“頁框”(頁框 = 頁幀 = 內存塊 = 物理塊 = 物理頁面)
每個頁框的編號是“頁框號”(頁框號 = 頁幀號 = 內存塊號 = 物理塊號 = 物理頁號)
進程:
邏輯地址空間分為小塊,每個稱為“頁面”,編號是“頁號”
頁面與頁框一一對應
頁表:
一個進程對應一張頁表
進程每個頁面對應一個頁表項
頁表項由 頁號 | 塊號組成
頁表記錄進程頁面和實際存放內存塊的映射關系
考點:重點
內存塊數 -> 頁表項占用字節
頁表記錄的是內存塊號,求起始地址 = 號 * 內存塊大小
2的整數次冪:頁號 (m位)+ 頁內偏移量(k位)(2的m次方個頁面,2的k次方的內存單元)
地址轉換:
相對于下面的分段:分頁有內部碎片。由于一一對應,不會產生外部碎片。同時換入換出寫入磁盤的只會是少數一個頁或幾個頁,不會花太多時間,交換效率高。
自身問題:頁表占用內存空間很大!
多級頁表
上面談到了占用內存空間很大,比如對于我們常見的題目,一個4GB的內存,每個頁面4KB,那么需要2^20個頁(十進制:一百萬左右),每個頁表項需要4字節大小存儲的話,那整個4GB的空間映射需要4MB內存存儲頁表,對于我們多進程cpu,100個進程就400MB內存存儲頁表。
那多級頁表怎么節省的空間呢?
我們對于上面100萬頁表項(單頁表)(1024*1024)分頁,將頁表(一級頁表)分為1024個頁表(二級頁表),每個二級頁表包含1024個頁表項,如圖
理解這個空間減少的過程(局部性原理):
每個進程有4GB邏輯地址空間,但是大多程序使用不到那么多,好多頁表項是空的,沒有分配。同時分配的頁表項,如果最近一段時間未訪問可以考慮換出到硬盤,不占用內存。
對于二級分頁,一級頁表可以覆蓋整個4GB邏輯地址空間,對于某一級頁表的頁表項不被用到,就不用創建對應的二級頁表,需要時創建。
頁表覆蓋全部邏輯地址空間,不分級頁表就需要100萬個頁表項,二級分頁只需要1024頁表項。
(比如:64位系統,用四級目錄)
缺點:地址轉換增加了時間開銷
TLB
緩解時間開銷,加入了具有并行查找能力的高速緩沖存儲器—快表(TLB)
cpu尋址先查TLB,沒命中再常規查找(由于局部性原理,命中率高!)
基本分段存儲管理(這是早于分頁的)
包括兩種越界保護:1.邏輯地址中段號與寄存器中段長比較 2.段表項內的段長與邏輯地址段內偏移量比較
用戶進程比如包括主程序、2個子程序、棧、數據,可以劃分為5段。
分段地址下的邏輯地址結構:段號+段內偏移量
(小林大佬的圖解更加清楚)
1-段表寄存器:段表始址+段表長度
2-段表:段號+基址+段長
如果一個邏輯地址(2,500)可以得到物理地址3000+500 = 3500
優點:
1.提高內存利用率
2.考慮用戶程序員:
方便編程、
信息保護和共享(兩個作業的段表中相應的表項指向被共享段的同一個物理副本)
動態增長、
動態鏈接
缺點:
1.碎片問題:
外部碎片:產生了多個不連續的小物理內存,新的程序不能裝載(內存交換解決)
無內部碎片
但是分頁就會出現內存碎片🧩,由于分頁是會將比如main函數分開放入4KB里面,會空余
2.內存交換效率低
多進程對于碎片進行處理,要交換,涉及訪問磁盤,速度很慢
段頁式內存管理
該邏輯地址: 段號 + 段內頁號 + 頁內偏移量
一個進程中一個段表,可以有多個頁表
3次訪存:
1.訪問段表,得到頁表起始地址
2.訪問頁表,得到物理頁號
3.物理頁號和頁內位移組合,得到物理地址
————————————————
版權聲明:本文為CSDN博主「_蘇沐」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43786143/article/details/118469401
總結
以上是生活随笔為你收集整理的操作系统--内存管理超详细整理!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 开发环境搭建
- 下一篇: java信息管理系统总结_java实现科