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