操作系統(tǒng)的內(nèi)存究竟是怎么一回事?
1 內(nèi)存管理的概念
內(nèi)存管理指操作系統(tǒng)對(duì)內(nèi)存的劃分和動(dòng)態(tài)分配
地址空間:
邏輯地址空間:相對(duì)地址, 從0開始編址
物理地址空間:地址轉(zhuǎn)換的最終地址
程序運(yùn)行時(shí):
編譯:把源代碼編譯成目標(biāo)模塊
鏈接:把目標(biāo)模塊、庫(kù)函數(shù)鏈接成1個(gè)裝入模塊
鏈接屬于形成進(jìn)程邏輯地址的過程
裝入:
絕對(duì)裝入:編譯時(shí)就確定了裝入地址
可重定位裝入:根據(jù)內(nèi)存情況, 把程序裝到適當(dāng)位置
運(yùn)行時(shí)動(dòng)態(tài)裝入:運(yùn)行前才真正把程序裝起來(前面2個(gè)都是先分配,再裝,再運(yùn)行)
2 內(nèi)存防溢出機(jī)制
即怎么防止內(nèi)存越界
設(shè)置上下限寄存器:
存放內(nèi)存中該進(jìn)程的上下限地址
每次訪問時(shí),判斷是否越界
重定位+界地址:
重定位寄存器——存放物理地址的最小地址
界地址寄存器——存放邏輯地址的最大值
先把訪問地址(相對(duì)地址) 與界地址比較是否越界
再加到重定位寄存器上,作為物理地址
min + x, 且x <max, 這樣保證地址在min到min+max之內(nèi)
3 內(nèi)存分配機(jī)制
3.1 連續(xù)分配內(nèi)存
連續(xù)分配指 為用戶程序分配的內(nèi)存空間一定是連續(xù)的
3.1.1 單一連續(xù):
內(nèi)存分為系統(tǒng)區(qū)和用戶區(qū)2個(gè)區(qū)
每次用戶區(qū)只能放1個(gè)程序, 這樣可確保不會(huì)越界
3.1.2 固定分區(qū)分配
用戶區(qū)分成若干個(gè)大小的分區(qū), 每個(gè)分區(qū)只能裝一個(gè)作業(yè)。
程序如果大了會(huì)裝不下
程序小了則有內(nèi)存碎片
3.1.3 動(dòng)態(tài)分區(qū)分配
程序裝入內(nèi)存時(shí),按照所需大小動(dòng)態(tài)生成1個(gè)分區(qū)。有多少碎片空間就給多少
可能會(huì)存在碎片, 比如中間的進(jìn)程結(jié)束了, 于是中間就空出來一個(gè)內(nèi)存碎片,而可能因?yàn)樘。渌M(jìn)程帆布進(jìn)來。
動(dòng)態(tài)分配策略:
-
首次適應(yīng):從上往下找第一個(gè)滿足的分區(qū)——最簡(jiǎn)單也最好
-
最佳適應(yīng):找一個(gè)大小差距最小的分區(qū)——最爛,碎片最多
-
最壞適應(yīng):直接找最大的分區(qū)轉(zhuǎn)入
-
鄰近適應(yīng):從上次查找位置開始找,而不是從第一個(gè)碎片位置開始找。——末尾碎片會(huì)很多
3.2 非連續(xù)內(nèi)存分配
非連續(xù)指進(jìn)程內(nèi)存可以 分成不同地址存放,不一定全部集中在一起。
3.2.1 分頁
把內(nèi)存劃分成固定大小的塊, 進(jìn)程以塊為單位申請(qǐng)多個(gè)不同位置的塊作為空間。
-
頁表:
每個(gè)進(jìn)程PCB中會(huì)有一個(gè)頁面寄存器PRT, 告知頁表的起始位置和起始長(zhǎng)度
找到頁表后, 頁面中會(huì)告知你所持有的頁號(hào)和偏移。
通過 頁號(hào) * 塊大小 + 偏移, 可知道這段內(nèi)存的起始位置。
進(jìn)程每次想通過虛擬地址去定位物理地址時(shí),都需要先去頁表中找到虛擬地址對(duì)應(yīng)的頁,然后再得到物理地址。
-
快表TBL(Translation Lookaside Buffer )):
為了避免每次都取頁表換算地址, 快表會(huì)緩存 虛擬地址->物理地址的直接映射,加快速度
-
多級(jí)頁表
地址空間超級(jí)大, 1頁裝不下怎么辦?
用多級(jí)
一級(jí)頁表指明二級(jí)頁表的地址
二級(jí)頁表再去實(shí)際地址
這樣就可以有多頁了。

3.2.2 分段
分頁的話, 頁的長(zhǎng)度是固定的, 所以偏移量的最大值是固定的
分段的話不限制偏移量最大值,即可以很長(zhǎng)一段。
分段屬于二維地址空間, 因?yàn)樗私o出邏輯地址,還得給出段長(zhǎng)
有利于做動(dòng)態(tài)鏈接:程序動(dòng)態(tài)修改
3.2.3 段頁結(jié)合
作業(yè)先分成若干段, 再把段分頁, 每個(gè)段可以找到一個(gè)也變
段號(hào)S 頁號(hào)P 頁內(nèi)偏移
Q: 遍歷二維數(shù)組的時(shí)候, 行遍歷優(yōu)先和列遍歷優(yōu)先的效率差別, 為什么會(huì)這樣
A: 按行遍歷比按列遍歷的效率高體現(xiàn)在這些方面:
-
CPU高速緩存
-
CPU緩存從內(nèi)存中抓取一般都是整個(gè)數(shù)據(jù)塊,所以它的物理內(nèi)存是連續(xù)的,幾乎都是同行不同列的,而如果內(nèi)循環(huán)以列的方式進(jìn)行遍歷的話,將會(huì)使整個(gè)緩存塊無法被利用,而不得不從內(nèi)存中讀取數(shù)據(jù),而從內(nèi)存讀取速度是遠(yuǎn)遠(yuǎn)小于從緩存中讀取數(shù)據(jù)的。隨著數(shù)組元素越來越多,按列讀取速度也會(huì)越來越慢。
4 虛擬內(nèi)存
4.1 概念
虛擬地址可以讓進(jìn)程獲得比實(shí)際內(nèi)存要大的內(nèi)存
特征:
-
多次性——作業(yè)可分多次裝入內(nèi)存
-
對(duì)換性——可在運(yùn)行時(shí)對(duì)內(nèi)存做兌換處理
-
虛擬性——邏輯上可充分?jǐn)U充容量
要求:
必須使用非連續(xù)分配方式——分頁、分段、段頁
硬件需要支持 頁表、中斷、地址變換機(jī)構(gòu)
理論依據(jù):
時(shí)間局部性—— 指令和數(shù)據(jù)總是會(huì)在一段時(shí)間內(nèi)被連續(xù)訪問
空間局部性——某單元被訪問,那么他附件的單元也很大概率會(huì)被訪問
4.2 請(qǐng)求分頁機(jī)制
再分頁的基礎(chǔ)上, 增加了2個(gè)功能:
請(qǐng)求調(diào)頁——當(dāng)頁面不在內(nèi)存中時(shí),從外村申請(qǐng)調(diào)入
頁面置換——把暫時(shí)不用的內(nèi)存換出去,給其他需要進(jìn)來的頁騰出空間
頁表項(xiàng):
頁號(hào)、物理塊號(hào)
狀態(tài)位P:是否已經(jīng)調(diào)入內(nèi)存
訪問字段A:記錄訪問次數(shù)或者訪問標(biāo)記,用于置換策略判斷
修改維 M:記錄是否被修改過
外村地址——當(dāng)頁被換出去時(shí),指明這個(gè)頁在外存的何處
缺頁中斷機(jī)構(gòu):當(dāng)頁面不存在時(shí), 負(fù)責(zé)產(chǎn)生缺頁中斷,進(jìn)行頁面置換操作。
缺頁只能高端和系統(tǒng)中斷不同, 屬于指令中的操作,在執(zhí)行期產(chǎn)生多次
地址變換機(jī)構(gòu):
1.先檢索塊表,如果能找到,則直接修改頁表項(xiàng)的訪問位。
2.塊表中沒有,則去 再檢索內(nèi)存中的頁表,通過狀態(tài)為P確認(rèn)是否在內(nèi)存中
如果不在,則產(chǎn)生缺頁中斷。
4.3 工作集概念
駐留集:指系統(tǒng)給每個(gè)進(jìn)程分配的內(nèi)存中實(shí)際頁面集合
但是可能分配了10個(gè), 卻只有5個(gè)經(jīng)常在用
工作集:某時(shí)間段內(nèi),這個(gè)進(jìn)程訪問和使用的頁面集合
通過工作集, 系統(tǒng)可以評(píng)估這個(gè)駐留集是否需要做刪減,以及哪些頁應(yīng)該持續(xù)保留。
這樣可以減少抖動(dòng),即減少內(nèi)外村之間頻繁的交換頁
4.4 頁面置換算法
-
最佳置換算法:
選未來最長(zhǎng)時(shí)間不會(huì)被用到的頁
這個(gè)要基于預(yù)測(cè),比較難 -
先進(jìn)先出FIFO
可能引發(fā)bleady異常:
較早調(diào)入的頁往往是經(jīng)常被訪問的頁,這些頁在FIFO算法下被反復(fù)調(diào)入和調(diào)出,并且有Belady現(xiàn)象。所謂Belady現(xiàn)象是指:采用FIFO算法時(shí),如果對(duì)一個(gè)進(jìn)程未分配它所要求的全部頁面,有時(shí)就會(huì)出現(xiàn)分配的頁面數(shù)增多但缺頁率反而提高的異常現(xiàn)象。
-
最近最久未使用(LRU)
選之前最長(zhǎng)時(shí)間沒訪問的, 引入優(yōu)先隊(duì)列(最大堆)
需要設(shè)置訪問時(shí)間字段 -
簡(jiǎn)單時(shí)鐘clock(最近未使用NRU)
每個(gè)頁有個(gè)標(biāo)記。
剛換入內(nèi)存或者被訪問時(shí),都會(huì)置1
如果需要換頁時(shí),步驟如下:
-
掃描圍成換的頁鏈表
-
如果標(biāo)記為1,則改成0,繼續(xù)往下掃
-
如果位0, 則替換,并讓指針指向下一頁。
改進(jìn)的clock
把標(biāo)記為改成 訪問位u和修改維m
-
1類(A =0, M = 0):表示該頁面最近既未被訪問,又未被修改,是最佳淘汰頁。
-
2類(A =0, M = 1):表示該頁面最近未被訪問,但已被修改,并不是很好的淘汰頁。
-
3類(A =1, M = 0):表示該頁面最近已被訪問,但未被修改,該頁有可能再被訪問。
-
4類(A =1, M = 1):表示該頁最近已被訪問且被修改,該頁可能再被訪問。
-
先優(yōu)先找u=0和m=0的頁,有就直接替換
-
沒有,則找 u = 0 且m=1的頁( 沒訪問的最優(yōu)先替換), 做替換
-
如果中間遇到U=1的, 則都會(huì)置0, 如果m=1的也會(huì)置0
-
如果一圈都沒有,則下一圈肯定有01或者00的。
4.5 頁面分配量策略
-
固定分配,局部替換
每個(gè)進(jìn)程分配固定的物理塊, 且只能自己的塊之間做替換 -
可變分配,全局替換
缺頁時(shí),可以從全局隊(duì)列的頁替換 -
可變分配,局部置換
自己替換自己,但是不夠的時(shí)候可以加塊
分配來源:
對(duì)換區(qū):頻繁切換的區(qū)
文件區(qū):補(bǔ)怎么會(huì)變動(dòng)和修改的
鏈接:https://www.cnblogs.com/huaweiyun/p/16898931.html
(版權(quán)歸原作者所有,侵刪)

