操作系統(tǒng)內(nèi)存管理:總的來(lái)說(shuō)屡立,操作系統(tǒng)內(nèi)存管理包括物理內(nèi)存管理和虛擬內(nèi)存管理。
物理內(nèi)存管理:
包括程序裝入等概念搀军、交換技術(shù)膨俐、連續(xù)分配管理方式和非連續(xù)分配管理方式(分頁(yè)勇皇、分段、段頁(yè)式)焚刺。
虛擬內(nèi)存管理:
虛擬內(nèi)存管理包括虛擬內(nèi)存概念敛摘、請(qǐng)求分頁(yè)管理方式、頁(yè)面置換算法檩坚、頁(yè)面分配策略着撩、工作集和抖動(dòng)。
這個(gè)系列主要使用linux內(nèi)存管理來(lái)具體說(shuō)明:linux內(nèi)存管理
一匾委、 計(jì)算機(jī)的存儲(chǔ)體系
內(nèi)存是計(jì)算機(jī)很重要的一個(gè)資源拖叙,因?yàn)槌绦蛑挥斜患虞d到內(nèi)存中才可以運(yùn)行;此外赂乐,CPU所需要的指令與數(shù)據(jù)也都是來(lái)自內(nèi)存的薯鳍。可以說(shuō)挨措,內(nèi)存是影響計(jì)算機(jī)性能的一個(gè)很重要的因素挖滤。
分層存儲(chǔ)器體系
在介紹內(nèi)存管理的細(xì)節(jié)前,先要了解一下分層存儲(chǔ)器體系:
大部分的計(jì)算機(jī)都有一個(gè)存儲(chǔ)器層次結(jié)構(gòu)浅役,即少量的非痴端桑快速、昂貴觉既、易變的高速緩存(cache)惧盹;若干兆字節(jié)的中等速度、中等價(jià)格瞪讼、易變的主存儲(chǔ)器(RAM)钧椰;數(shù)百兆或數(shù)千兆的低速、廉價(jià)符欠、不易變的磁盤(pán)嫡霞。這些資源的合理使用與否直接關(guān)系著系統(tǒng)的效率。
CPU緩存(Cache Memory):是位于CPU與內(nèi)存之間的臨時(shí)存儲(chǔ)器希柿,它的容量比內(nèi)存小的多但是交換速度卻比內(nèi)存要快得多诊沪。緩存的出現(xiàn)主要是為了解決CPU運(yùn)算速度與內(nèi)存 讀寫(xiě)速度不匹配的矛盾,因?yàn)镃PU運(yùn)算速度要比內(nèi)存讀寫(xiě)速度快很多曾撤,這樣會(huì)使CPU花費(fèi)很長(zhǎng)時(shí)間等待數(shù)據(jù)到來(lái)或把數(shù)據(jù)寫(xiě)入內(nèi)存娄徊。
計(jì)算機(jī)是一種數(shù)據(jù)處理設(shè)備,它由CPU和內(nèi)存以及外部設(shè)備組成盾戴。CPU負(fù)責(zé)數(shù)據(jù)處理寄锐,內(nèi)存負(fù)責(zé)存儲(chǔ),外部設(shè)備負(fù)責(zé)數(shù)據(jù)的輸入和輸出,它們之間通過(guò)總線連接在一起橄仆。CPU內(nèi)部主要由控制器剩膘、運(yùn)算器和寄存器組成∨韫耍控制器負(fù)責(zé)指令的讀取和調(diào)度怠褐,運(yùn)算器負(fù)責(zé)指令的運(yùn)算執(zhí)行,寄存器負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)您宪,它們之間通過(guò)CPU內(nèi)的總線連接在一起奈懒。每個(gè)外部設(shè)備(例如:顯示器、硬盤(pán)宪巨、鍵盤(pán)磷杏、鼠標(biāo)、網(wǎng)卡等等)則是由外設(shè)控制器捏卓、I/O端口极祸、和輸入輸出硬件組成。外設(shè)控制器負(fù)責(zé)設(shè)備的控制和操作怠晴,I/O端口負(fù)責(zé)數(shù)據(jù)的臨時(shí)存儲(chǔ)遥金,輸入輸出硬件則負(fù)責(zé)具體的輸入輸出,它們間也通過(guò)外部設(shè)備內(nèi)的總線連接在一起蒜田。
上面計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)圖中我們可以看出硬件系統(tǒng)的這種組件化的設(shè)計(jì)思路總是貫徹到各個(gè)環(huán)節(jié)稿械。
在這套設(shè)計(jì)思想(馮.諾依曼體系架構(gòu))里面: 總是有一部分負(fù)責(zé)控制、一部分負(fù)責(zé)執(zhí)行冲粤、一部分則負(fù)責(zé)存儲(chǔ)美莫,它之間進(jìn)行交互以及接口通信則總是通過(guò)總線來(lái)完成。這種設(shè)計(jì)思路一樣的可以應(yīng)用在我們的軟件設(shè)計(jì)體系里面:組件和組件之間通信通過(guò)事件的方式來(lái)進(jìn)行解耦處理色解,而一個(gè)組件內(nèi)部同樣也需要明確好各個(gè)部分的職責(zé)(一部分負(fù)責(zé)調(diào)度控制、一部分負(fù)責(zé)執(zhí)行實(shí)現(xiàn)餐茵、一部分負(fù)責(zé)數(shù)據(jù)存儲(chǔ))科阎。
計(jì)算存儲(chǔ)的層次結(jié)構(gòu)
當(dāng)前技術(shù)沒(méi)有能夠提供這樣的存儲(chǔ)器,因此大部分的計(jì)算機(jī)都有一個(gè)存儲(chǔ)器層次結(jié)構(gòu):
高速緩存(cache): 少量的非撤拮澹快速锣笨、昂貴、易變的高速緩存(cache)道批;
主存儲(chǔ)器(RAM): 若干兆字節(jié)的中等速度错英、中等價(jià)格、易變的主存儲(chǔ)器(RAM)隆豹;
磁盤(pán): 數(shù)百兆或數(shù)千兆的低速椭岩、廉價(jià)、不易變的磁盤(pán)。
這些資源的合理使用與否直接關(guān)系著系統(tǒng)的效率判哥。
二献雅、內(nèi)存使用演化
1、沒(méi)有內(nèi)存抽象的年代
在早些的操作系統(tǒng)中塌计,并沒(méi)有引入內(nèi)存抽象的概念挺身。程序直接訪問(wèn)和操作的都是物理內(nèi)存,內(nèi)存的管理也非常簡(jiǎn)單锌仅,除去操作系統(tǒng)所用的內(nèi)存之外章钾,全部給用戶程序使用,想怎么折騰都行热芹,只要?jiǎng)e超出最大的容量贱傀。比如當(dāng)執(zhí)行如下指令時(shí):mov reg1,1000
1、無(wú)內(nèi)存抽象存在的問(wèn)題:
這條指令會(huì)毫無(wú)想象力的將物理地址1000中的內(nèi)容賦值給寄存器剿吻。不難想象窍箍,這種內(nèi)存操作方式使得操作系統(tǒng)中存在多進(jìn)程變得完全不可能,比如MS-DOS丽旅,你必須執(zhí)行完一條指令后才能接著執(zhí)行下一條椰棘。如果是多進(jìn)程的話,由于直接操作物理內(nèi)存地址榄笙,當(dāng)一個(gè)進(jìn)程給內(nèi)存地址1000賦值后邪狞,另一個(gè)進(jìn)程也同樣給內(nèi)存地址賦值,那么第二個(gè)進(jìn)程對(duì)內(nèi)存的賦值會(huì)覆蓋第一個(gè)進(jìn)程所賦的值茅撞,這回造成兩條進(jìn)程同時(shí)崩潰帆卓。
帶來(lái)兩個(gè)問(wèn)題:
用戶程序可以訪問(wèn)任意內(nèi)存,容易破壞操作系統(tǒng)米丘,造成崩潰
同時(shí)運(yùn)行多個(gè)程序特別困難
隨著計(jì)算機(jī)技術(shù)發(fā)展剑令,要求操作系統(tǒng)支持多進(jìn)程的需求,所謂多進(jìn)程拄查,并不需要同時(shí)運(yùn)行這些進(jìn)程吁津,只要它們都處于 ready 狀態(tài),操作系統(tǒng)快速地在它們之間切換堕扶,就能達(dá)到同時(shí)運(yùn)行的假象碍脏。每個(gè)進(jìn)程都需要內(nèi)存,Context Switch 時(shí)稍算,之前內(nèi)存里的內(nèi)容怎么辦典尾?簡(jiǎn)單粗暴的方式就是先 dump 到磁盤(pán)上,然后再?gòu)拇疟P(pán)上 restore 之前 dump 的內(nèi)容(如果有的話)糊探,但效果并不好钾埂,太慢了河闰!
2、內(nèi)存抽象:地址空間
那怎么才能不慢呢勃教?把進(jìn)程對(duì)應(yīng)的內(nèi)存依舊留在物理內(nèi)存中淤击,需要的時(shí)候就切換到特定的區(qū)域。這就涉及到了內(nèi)存的保護(hù)機(jī)制故源,畢竟進(jìn)程之間可以隨意讀取污抬、寫(xiě)入內(nèi)容就亂套了,非常不安全绳军。因此操作系統(tǒng)需要對(duì)物理內(nèi)存做一層抽象印机,也就是「地址空間」(Address Space),一個(gè)進(jìn)程的地址空間包含了該進(jìn)程所有相關(guān)內(nèi)存门驾,比如 code / stack / heap射赛。一個(gè) 16 KB 的地址空間可能長(zhǎng)這樣:
當(dāng)程序運(yùn)行時(shí),heap 和 stack 共用中間 free 的區(qū)域奶是,當(dāng)然這只是 OS 層面的抽象楣责。比如下面這段代碼:
intx;x=x+3;// this is the line of code we are interested in
變成匯編指令后,大概是這樣:
128:movl0x0(%ebx),%eax;load0+ebxintoeax132:addl$0x03,%eax;add3toeaxregister135:movl%eax,0x0(%ebx);storeeaxbacktomem
最前面的是 PC (Program Counter)聂沙,用來(lái)表示當(dāng)前 code 的索引秆麸,比如 CPU 執(zhí)行到 128 時(shí),進(jìn)行了 Context Switch(上下文切換)及汉,那么在 Switch 回來(lái)后沮趣,還可以接著從 132 開(kāi)始執(zhí)行(當(dāng)然需要先把 PC 存起來(lái))。之后的就是匯編代碼坷随,告訴 CPU 該如何操作房铭。
從進(jìn)程的角度看,內(nèi)存可能是這樣的:
真實(shí)的物理內(nèi)存可能是這樣的:
基址寄存器與界限寄存器可以簡(jiǎn)單的動(dòng)態(tài)重定位:每個(gè)內(nèi)存地址送到內(nèi)存之前温眉,都會(huì)自動(dòng)加上基址寄存器的內(nèi)容缸匪。
從 32KB 處作為開(kāi)始,48KB 作為結(jié)束类溢。那 32 / 48 可不可以動(dòng)態(tài)設(shè)置呢凌蔬,只要在 CPU 上整兩個(gè)寄存器,基址寄存器base 和 界限寄存器bounds 就可以了豌骏,base 指明從哪里開(kāi)始龟梦,bounds 指定哪里是邊界隐锭。 因此真實(shí)物理地址和虛擬地址之間的關(guān)系是:
physicaladdress=virtualaddress+base
有時(shí)窃躲,CPU 上用來(lái)做內(nèi)存地址翻譯的也會(huì)被叫做「內(nèi)存管理單元 MMU」(Memory Management Unit),隨著功能越來(lái)越強(qiáng)大钦睡,MMU 也會(huì)變得越來(lái)越復(fù)雜蒂窒。
base and bounds 這種做法最大的問(wèn)題在于空間浪費(fèi),Stack 和 Heap 中間有一塊 free space,即使沒(méi)有用洒琢,也被占著秧秉,那如何才能解放這塊區(qū)域呢,進(jìn)入虛擬內(nèi)存衰抑。
3象迎、虛擬內(nèi)存
虛擬內(nèi)存是現(xiàn)代操作系統(tǒng)普遍使用的一種技術(shù)。前面所講的抽象滿足了多進(jìn)程的要求呛踊,但很多情況下砾淌,現(xiàn)有內(nèi)存無(wú)法滿足僅僅一個(gè)大進(jìn)程的內(nèi)存要求。物理內(nèi)存不夠用的情況下谭网,如何解決呢汪厨?
覆蓋overlays:在早期的操作系統(tǒng)曾使用覆蓋技術(shù)來(lái)解決這個(gè)問(wèn)題,將一個(gè)程序分為多個(gè)塊愉择,基本思想是先將塊0加入內(nèi)存劫乱,塊0執(zhí)行完后,將塊1加入內(nèi)存锥涕。依次往復(fù)衷戈,這個(gè)解決方案最大的問(wèn)題是需要程序員去程序進(jìn)行分塊,這是一個(gè)費(fèi)時(shí)費(fèi)力讓人痛苦不堪的過(guò)程站楚。后來(lái)這個(gè)解決方案的修正版就是虛擬內(nèi)存脱惰。
交換swapping:可以將暫時(shí)不能執(zhí)行的程序(進(jìn)程)送到外存中,從而獲得空閑內(nèi)存空間來(lái)裝入新程序(進(jìn)程)窿春,或讀人保存在外存中而處于就緒狀態(tài)的程序拉一。
虛擬內(nèi)存:虛擬內(nèi)存的基本思想是琢蛤,每個(gè)進(jìn)程有用獨(dú)立的邏輯地址空間孔庭,內(nèi)存被分為大小相等的多個(gè)塊,稱為頁(yè)(Page).每個(gè)頁(yè)都是一段連續(xù)的地址菩佑。對(duì)于進(jìn)程來(lái)看,邏輯上貌似有很多內(nèi)存空間墨礁,其中一部分對(duì)應(yīng)物理內(nèi)存上的一塊(稱為頁(yè)框麸俘,通常頁(yè)和頁(yè)框大小相等)漓骚,還有一些沒(méi)加載在內(nèi)存中的對(duì)應(yīng)在硬盤(pán)上递沪。
三. 物理內(nèi)存:連續(xù)分配存儲(chǔ)管理方式
連續(xù)分配是指為一個(gè)用戶程序分配連續(xù)的內(nèi)存空間丸冕。連續(xù)分配有單一連續(xù)存儲(chǔ)管理和分區(qū)式儲(chǔ)管理兩種方式延赌。
1. 單一連續(xù)存儲(chǔ)管理
在這種管理方式中除盏,內(nèi)存被分為兩個(gè)區(qū)域:系統(tǒng)區(qū)和用戶區(qū)。應(yīng)用程序裝入到用戶區(qū)挫以,可使用用戶區(qū)全部空間者蠕。其特點(diǎn)是,最簡(jiǎn)單掐松,適用于單用戶踱侣、單任務(wù)的操作系統(tǒng)粪小。CP/M和 DOS 2.0以下就是采用此種方式。這種方式的最大優(yōu)點(diǎn)就是易于管理抡句。但也存在著一些問(wèn)題和不足之處探膊,例如對(duì)要求內(nèi)存空間少的程序,造成內(nèi)存浪費(fèi)待榔;程序全部裝入逞壁,使得很少使用的程序部分也占用—定數(shù)量的內(nèi)存。
2. 分區(qū)式存儲(chǔ)管理
為了支持多道程序系統(tǒng)和分時(shí)系統(tǒng)锐锣,支持多個(gè)程序并發(fā)執(zhí)行猾担,引入了分區(qū)式存儲(chǔ)管理。分區(qū)式存儲(chǔ)管理是把內(nèi)存分為一些大小相等或不等的分區(qū)刺下,操作系統(tǒng)占用其中一個(gè)分區(qū)绑嘹,其余的分區(qū)由應(yīng)用程序使用,每個(gè)應(yīng)用程序占用一個(gè)或幾個(gè)分區(qū)橘茉。分區(qū)式存儲(chǔ)管理雖然可以支持并發(fā)工腋,但難以進(jìn)行內(nèi)存分區(qū)的共享。
分區(qū)式存儲(chǔ)管理引人了兩個(gè)新的問(wèn)題:內(nèi)碎片和外碎片畅卓。
內(nèi)碎片是占用分區(qū)內(nèi)未被利用的空間擅腰,外碎片是占用分區(qū)之間難以利用的空閑分區(qū)(通常是小空閑分區(qū))。
為實(shí)現(xiàn)分區(qū)式存儲(chǔ)管理翁潘,操作系統(tǒng)應(yīng)維護(hù)的數(shù)據(jù)結(jié)構(gòu)為分區(qū)表或分區(qū)鏈表趁冈。表中各表項(xiàng)一般包括每個(gè)分區(qū)的起始地址、大小及狀態(tài)(是否已分配)拜马。
分區(qū)式存儲(chǔ)管理常采用的一項(xiàng)技術(shù)就是內(nèi)存緊縮(compaction)渗勘。
1) 固定分區(qū)(nxedpartitioning)。
固定式分區(qū)的特點(diǎn)是把內(nèi)存劃分為若干個(gè)固定大小的連續(xù)分區(qū)俩莽。分區(qū)大小可以相等:這種作法只適合于多個(gè)相同程序的并發(fā)執(zhí)行(處理多個(gè)類型相同的對(duì)象)旺坠。分區(qū)大小也可以不等:有多個(gè)小分區(qū)、適量的中等分區(qū)以及少量的大分區(qū)扮超。根據(jù)程序的大小取刃,分配當(dāng)前空閑的、適當(dāng)大小的分區(qū)出刷。
優(yōu)點(diǎn):易于實(shí)現(xiàn)璧疗,開(kāi)銷小。
缺點(diǎn)主要有兩個(gè):內(nèi)碎片造成浪費(fèi)馁龟;分區(qū)總數(shù)固定崩侠,限制了并發(fā)執(zhí)行的程序數(shù)目。
2)動(dòng)態(tài)分區(qū)(dynamic partitioning)屁柏。
動(dòng)態(tài)分區(qū)的特點(diǎn)是動(dòng)態(tài)創(chuàng)建分區(qū):在裝入程序時(shí)按其初始要求分配啦膜,或在其執(zhí)行過(guò)程中通過(guò)系統(tǒng)調(diào)用進(jìn)行分配或改變分區(qū)大小。與固定分區(qū)相比較其優(yōu)點(diǎn)是:沒(méi)有內(nèi)碎片淌喻。但它卻引入了另一種碎片——外碎片僧家。動(dòng)態(tài)分區(qū)的分區(qū)分配就是尋找某個(gè)空閑分區(qū),其大小需大于或等于程序的要求裸删。若是大于要求八拱,則將該分區(qū)分割成兩個(gè)分區(qū),其中一個(gè)分區(qū)為要求的大小并標(biāo)記為“占用”涯塔,而另一個(gè)分區(qū)為余下部分并標(biāo)記為“空閑”肌稻。分區(qū)分配的先后次序通常是從內(nèi)存低端到高端。動(dòng)態(tài)分區(qū)的分區(qū)釋放過(guò)程中有一個(gè)要注意的問(wèn)題是匕荸,將相鄰的空閑分區(qū)合并成一個(gè)大的空閑分區(qū)爹谭。
下面列出了幾種常用的分區(qū)分配算法:
最先適配法(nrst-fit):按分區(qū)在內(nèi)存的先后次序從頭查找,找到符合要求的第一個(gè)分區(qū)進(jìn)行分配榛搔。該算法的分配和釋放的時(shí)間性能較好诺凡,較大的空閑分區(qū)可以被保留在內(nèi)存高端。但隨著低端分區(qū)不斷劃分會(huì)產(chǎn)生較多小分區(qū)践惑,每次分配時(shí)查找時(shí)間開(kāi)銷便會(huì)增大腹泌。
下次適配法(循環(huán)首次適應(yīng)算法 next fit):按分區(qū)在內(nèi)存的先后次序,從上次分配的分區(qū)起查找(到最后{區(qū)時(shí)再?gòu)念^開(kāi)始}尔觉,找到符合要求的第一個(gè)分區(qū)進(jìn)行分配凉袱。該算法的分配和釋放的時(shí)間性能較好,使空閑分區(qū)分布得更均勻侦铜,但較大空閑分區(qū)不易保留专甩。
最佳適配法(best-fit):按分區(qū)在內(nèi)存的先后次序從頭查找,找到其大小與要求相差最小的空閑分區(qū)進(jìn)行分配钉稍。從個(gè)別來(lái)看配深,外碎片較小嫁盲;但從整體來(lái)看篓叶,會(huì)形成較多外碎片優(yōu)點(diǎn)是較大的空閑分區(qū)可以被保留。
最壞適配法(worst- fit):按分區(qū)在內(nèi)存的先后次序從頭查找羞秤,找到最大的空閑分區(qū)進(jìn)行分配缸托。基本不留下小空閑分區(qū)瘾蛋,不易形成外碎片俐镐。但由于較大的空閑分區(qū)不被保留,當(dāng)對(duì)內(nèi)存需求較大的進(jìn)程需要運(yùn)行時(shí)哺哼,其要求不易被滿足佩抹。
3. 伙伴系統(tǒng)
固定分區(qū)和動(dòng)態(tài)分區(qū)方式都有不足之處叼风。固定分區(qū)方式限制了活動(dòng)進(jìn)程的數(shù)目,當(dāng)進(jìn)程大小與空閑分區(qū)大小不匹配時(shí)棍苹,內(nèi)存空間利用率很低无宿。動(dòng)態(tài)分區(qū)方式算法復(fù)雜,回收空閑分區(qū)時(shí)需要進(jìn)行分區(qū)合并等枢里,系統(tǒng)開(kāi)銷較大孽鸡。伙伴系統(tǒng)方式是對(duì)以上兩種內(nèi)存方式的一種折衷方案栏豺。
伙伴系統(tǒng)規(guī)定彬碱,無(wú)論已分配分區(qū)或空閑分區(qū),其大小均為 2 的 k 次冪奥洼,k 為整數(shù)巷疼, l≤k≤m,其中:
2^1 表示分配的最小分區(qū)的大小灵奖,
2^m 表示分配的最大分區(qū)的大小皮迟,
通常 2^m是整個(gè)可分配內(nèi)存的大小。
假設(shè)系統(tǒng)的可利用空間容量為2^m個(gè)字桑寨, 則系統(tǒng)開(kāi)始運(yùn)行時(shí)伏尼, 整個(gè)內(nèi)存區(qū)是一個(gè)大小為2^m的空閑分區(qū)。在系統(tǒng)運(yùn)行過(guò)中尉尾, 由于不斷的劃分爆阶,可能會(huì)形成若干個(gè)不連續(xù)的空閑分區(qū),將這些空閑分區(qū)根據(jù)分區(qū)的大小進(jìn)行分類沙咏,對(duì)于每一類具有相同大小的所有空閑分區(qū)辨图,單獨(dú)設(shè)立一個(gè)空閑分區(qū)雙向鏈表。這樣肢藐,不同大小的空閑分區(qū)形成了k(0≤k≤m)個(gè)空閑分區(qū)鏈表故河。
分配步驟:
當(dāng)需要為進(jìn)程分配一個(gè)長(zhǎng)度為n 的存儲(chǔ)空間時(shí):
首先計(jì)算一個(gè)i 值,使 2^(i-1) <n ≤ 2^i吆豹,
然后在空閑分區(qū)大小為2^i的空閑分區(qū)鏈表中查找鱼的。
若找到,即把該空閑分區(qū)分配給進(jìn)程痘煤。
否則凑阶,表明長(zhǎng)度為2^i的空閑分區(qū)已經(jīng)耗盡,則在分區(qū)大小為2^(i+1)的空閑分區(qū)鏈表中尋找衷快。
若存在 2^(i+1)的一個(gè)空閑分區(qū)宙橱,則把該空閑分區(qū)分為相等的兩個(gè)分區(qū),這兩個(gè)分區(qū)稱為一對(duì)伙伴,其中的一個(gè)分區(qū)用于配师郑, 而把另一個(gè)加入分區(qū)大小為2^i的空閑分區(qū)鏈表中环葵。
若大小為2^(i+1)的空閑分區(qū)也不存在,則需要查找大小為2^(i+2)的空閑分區(qū)宝冕, 若找到則對(duì)其進(jìn)行兩次分割:
第一次张遭,將其分割為大小為 2^(i+1)的兩個(gè)分區(qū),一個(gè)用于分配猬仁,一個(gè)加入到大小為 2^(i+1)的空閑分區(qū)鏈表中;
第二次先誉,將第一次用于分配的空閑區(qū)分割為 2^i的兩個(gè)分區(qū)湿刽,一個(gè)用于分配,一個(gè)加入到大小為 2^i的空閑分區(qū)鏈表中褐耳。
若仍然找不到诈闺,則繼續(xù)查找大小為 2^(i+3)的空閑分區(qū),以此類推铃芦。
由此可見(jiàn)雅镊,在最壞的情況下,可能需要對(duì) 2^k的空閑分區(qū)進(jìn)行 k 次分割才能得到所需分區(qū)刃滓。
與一次分配可能要進(jìn)行多次分割一樣仁烹,一次回收也可能要進(jìn)行多次合并,如回收大小為2^i的空閑分區(qū)時(shí)咧虎,若事先已存在2^i的空閑分區(qū)時(shí)卓缰,則應(yīng)將其與伙伴分區(qū)合并為大小為2^i+1的空閑分區(qū),若事先已存在2^i+1的空閑分區(qū)時(shí)砰诵,又應(yīng)繼續(xù)與其伙伴分區(qū)合并為大小為2^i+2的空閑分區(qū)征唬,依此類推。
在伙伴系統(tǒng)中茁彭,其分配和回收的時(shí)間性能取決于查找空閑分區(qū)的位置和分割总寒、合并空閑分區(qū)所花費(fèi)的時(shí)間。與前面所述的多種方法相比較理肺,由于該算法在回收空閑分區(qū)時(shí)摄闸,需要對(duì)空閑分區(qū)進(jìn)行合并,所以其時(shí)間性能比前面所述的分類搜索算法差妹萨,但比順序搜索算法好贪薪,而其空間性能則遠(yuǎn)優(yōu)于前面所述的分類搜索法,比順序搜索法略差眠副。 需要指出的是画切,在當(dāng)前的操作系統(tǒng)中,普遍采用的是下面將要講述的基于分頁(yè)和分段機(jī)制的虛擬內(nèi)存機(jī)制囱怕,該機(jī)制較伙伴算法更為合理和高效霍弹,但在多處理機(jī)系統(tǒng)中毫别,伙伴系統(tǒng)仍不失為一種有效的內(nèi)存分配和釋放的方法,得到了大量的應(yīng)用典格。
4. 內(nèi)存緊縮(內(nèi)存碎片化處理)
內(nèi)存緊縮:將各個(gè)占用分區(qū)向內(nèi)存一端移動(dòng)岛宦,然后將各個(gè)空閑分區(qū)合并成為一個(gè)空閑分區(qū)。
這種技術(shù)在提供了某種程度上的靈活性的同時(shí)耍缴,也存在著一些弊端砾肺,例如:對(duì)占用分區(qū)進(jìn)行內(nèi)存數(shù)據(jù)搬移占用CPU時(shí)間;如果對(duì)占用分區(qū)中的程序進(jìn)行“浮動(dòng)”防嗡,則其重定位需要硬件支持变汪。
緊縮時(shí)機(jī):每個(gè)分區(qū)釋放后,或內(nèi)存分配找不到滿足條件的空閑分區(qū)時(shí)蚁趁。
堆結(jié)構(gòu)的存儲(chǔ)管理的分配算法:
在動(dòng)態(tài)存儲(chǔ)過(guò)程中裙盾,不管哪個(gè)時(shí)刻,可利用空間都是-一個(gè)地址連續(xù)的存儲(chǔ)區(qū)他嫡,在編譯程序中稱之為"堆"番官,每次分配都是從這個(gè)可利用空間中劃出一塊。其實(shí)現(xiàn)辦法是:設(shè)立一個(gè)指針钢属,稱之為堆指針徘熔,始終指向堆的最低(或鍛聯(lián))地址。當(dāng)用戶申請(qǐng)N個(gè)單位的存儲(chǔ)塊時(shí)淆党,堆指針向高地址(或 低地址)稱動(dòng)N個(gè)存儲(chǔ)單位近顷,而移動(dòng)之前的堆指針的值就是分配給用戶的占用塊的初始地址。例如宁否,某個(gè)串處理系統(tǒng)中有A窒升、B、C慕匠、D這4個(gè)串饱须,其串值長(zhǎng)度分別為12,6,10和8. 假設(shè)堆指針free的初值為零,則分配給這4個(gè)串值的存儲(chǔ)空間的初始地址分別為0.12.18和 28,如圖8.12(a)和(b)所示台谊,分配后的堆指針的值為36蓉媳。 因此,這種堆結(jié)構(gòu)的存儲(chǔ)管理的分配算法非常簡(jiǎn)單锅铅,
釋放內(nèi)存空間執(zhí)行內(nèi)存緊縮:
回收用戶釋放的空閑塊就比較麻煩.由于系統(tǒng)的可利用空間始終是一個(gè)絕址連續(xù)的存儲(chǔ)塊酪呻,因此回收時(shí)必須將所釋放的空間塊合并到整個(gè)堆上去才 能重新使用,這就是"存儲(chǔ)策縮"的任務(wù).通常盐须,有兩種做法:
一種是一旦有用戶釋放存儲(chǔ)塊即進(jìn)行回收緊縮玩荠,例始,圖8.12 (a)的堆,在c串釋放存儲(chǔ)塊時(shí)即回收緊縮阶冈,例如圖8.12 (c)的堆闷尿,同時(shí)修改串的存儲(chǔ)映像成圖8.12(d)的狀態(tài);
另一種是在程序執(zhí)行過(guò)程中不回收用戶隨時(shí)釋放的存儲(chǔ)塊女坑,直到可利用空同不夠分配或堆指針指向最高地址時(shí)才進(jìn)行存儲(chǔ)緊縮填具。此時(shí)緊縮的目的是將堆中所有的空間塊連成一塊,即將所有的占用塊部集中到 可利用空間的低地地區(qū)匆骗,而剩余的高地址區(qū)成為一整個(gè)地繼連續(xù)的空閑塊劳景,如圖8.13所示,其中(a)為緊縮前的狀態(tài)碉就,(b)為緊縮后的狀態(tài)?
和無(wú)用單元收集類似盟广,為實(shí)現(xiàn)存儲(chǔ)紫編,首先要對(duì)占用塊進(jìn)行“標(biāo)志”,標(biāo)志算法和無(wú)用單元收集類同(存儲(chǔ)塊的結(jié)構(gòu)可能不同),其次需進(jìn)行下列4步雄作:
(1)計(jì)算占用塊的新地址铝噩。從最低地址開(kāi)始巡査整個(gè)存儲(chǔ)空間衡蚂,對(duì)每一個(gè)占用塊找到它在緊縮后的新地址窿克。 為此,需設(shè)立兩個(gè)指針隨巡查向前移動(dòng),這兩個(gè)指針?lè)謩e指示占用 塊在緊縮之前和之后的原地址和新地址骏庸。因此,在每個(gè)占用塊的第-·個(gè)存儲(chǔ)單位中,除了 設(shè)立長(zhǎng)度域(存儲(chǔ)該占用換的大心甓!)和標(biāo)志域(存儲(chǔ)區(qū)別該存儲(chǔ)塊是占用塊或空閑塊的標(biāo) 志)之外具被,還需設(shè)立一個(gè)新地址城,以存儲(chǔ)占用塊在緊縮后應(yīng)有的新地址只损,即建立一張新一姿, 舊地址的對(duì)照表m
(2)修改用戶觸初始變量表,以便在存儲(chǔ)緊縮后用戶程序能繼續(xù)正常運(yùn)行*跃惫。
(3)檢查每個(gè)占用塊中存儲(chǔ)的數(shù)據(jù)叮叹, 若有指向其他存儲(chǔ)換的指針先较,則需作相應(yīng)修改.
(4)將所有占用塊遷移到新地址走翘地,這實(shí)質(zhì)上是作傳送數(shù)據(jù)的工作臭杰。
至此磁奖,完成了存儲(chǔ)緊縮的操作蜜托,最后,將堆指針賦以新值(即緊縮后的空閑存儲(chǔ)區(qū)的最低地址)嗓化。
可見(jiàn),存儲(chǔ)緊縮法比無(wú)用單元收集法更為復(fù)雜,前者不僅要傳送數(shù)據(jù)(進(jìn)行占用塊遷移),而且還有需要修改所有占用塊中的指針值。因此孕暇,存儲(chǔ)緊縮也是個(gè)系統(tǒng)操作,且非不得已就不用桶良。
5. 覆蓋技術(shù)
引入覆蓋 (overlay)技術(shù)的目標(biāo)是在較小的可用內(nèi)存中運(yùn)行較大的程序座舍。這種技術(shù)常用于多道程序系統(tǒng)之中,與分區(qū)式存儲(chǔ)管理配合使用陨帆。
覆蓋技術(shù)的原理:一個(gè)程序的幾個(gè)代碼段或數(shù)據(jù)段曲秉,按照時(shí)間先后來(lái)占用公共的內(nèi)存空間。將程序必要部分(常用功能)的代碼和數(shù)據(jù)常駐內(nèi)存疲牵;可選部分(不常用功能)平時(shí)存放在外存(覆蓋文件)中承二,在需要時(shí)才裝入內(nèi)存。不存在調(diào)用關(guān)系的模塊不必同時(shí)裝入到內(nèi)存瑰步,從而可以相互覆蓋矢洲。
在任何時(shí)候只在內(nèi)存中保留所需的指令和數(shù)據(jù)璧眠;當(dāng)需要其它指令時(shí)缩焦,它們會(huì)裝入到剛剛不再需要的指令所占用的內(nèi)存空間;
如在同一時(shí)刻责静,CPU只能執(zhí)行B袁滥,C中某一條。B灾螃,C之間就可以做覆蓋题翻。
覆蓋技術(shù)的缺點(diǎn)是編程時(shí)必須劃分程序模塊和確定程序模塊之間的覆蓋關(guān)系,增加編程復(fù)雜度腰鬼;從外存裝入覆蓋文件嵌赠,以時(shí)間延長(zhǎng)換取空間節(jié)省。
覆蓋的實(shí)現(xiàn)方式有兩種:以函數(shù)庫(kù)方式實(shí)現(xiàn)或操作系統(tǒng)支持熄赡。
6. 交換技術(shù)
交換 (swapping)技術(shù)在多個(gè)程序并發(fā)執(zhí)行時(shí)姜挺,可以將暫時(shí)不能執(zhí)行的程序(進(jìn)程)送到外存中,從而獲得空閑內(nèi)存空間來(lái)裝入新程序(進(jìn)程)彼硫,或讀人保存在外存中而處于就緒狀態(tài)的程序炊豪。交換單位為整個(gè)進(jìn)程的地址空間凌箕。交換技術(shù)常用于多道程序系統(tǒng)或小型分時(shí)系統(tǒng)中,因?yàn)檫@些系統(tǒng)大多采用分區(qū)存儲(chǔ)管理方式词渤。與分區(qū)式存儲(chǔ)管理配合使用又稱作“對(duì)換”或“滾進(jìn)/滾出” (roll-in/roll-out)牵舱。
原理:暫停執(zhí)行內(nèi)存中的進(jìn)程,將整個(gè)進(jìn)程的地址空間保存到外存的交換區(qū)中(換出swap out)缺虐,而將外存中由阻塞變?yōu)榫途w的進(jìn)程的地址空間讀入到內(nèi)存中芜壁,并將該進(jìn)程送到就緒隊(duì)列(換入swap in)。
交換技術(shù)優(yōu)點(diǎn)之一是增加并發(fā)運(yùn)行的程序數(shù)目高氮,并給用戶提供適當(dāng)?shù)捻憫?yīng)時(shí)間沿盅;與覆蓋技術(shù)相比交換技術(shù)另一個(gè)顯著的優(yōu)點(diǎn)是不影響程序結(jié)構(gòu)。交換技術(shù)本身也存在著不足纫溃,例如:對(duì)換人和換出的控制增加處理器開(kāi)銷腰涧;程序整個(gè)地址空間都進(jìn)行對(duì)換,沒(méi)有考慮執(zhí)行過(guò)程中地址訪問(wèn)的統(tǒng)計(jì)特性紊浩。
7. 覆蓋與交換比較
1)與覆蓋技術(shù)相比窖铡,交換不要求程序員給出程序段之間的覆蓋結(jié)構(gòu)。
2)交換主要是在進(jìn)程與作業(yè)之間進(jìn)行坊谁,而覆蓋則主要在同一作業(yè)或進(jìn)程內(nèi)進(jìn)行费彼。 另外覆蓋只能覆蓋那些與覆蓋程序段無(wú)關(guān)的程序段。
四. 物理內(nèi)存非連續(xù):頁(yè)式和段式存儲(chǔ)管理
在前面的幾種存儲(chǔ)管理方法中口芍,為進(jìn)程分配的空間是連續(xù)的箍铲,使用的地址都是物理地址。如果允許將一個(gè)進(jìn)程分散到許多不連續(xù)的空間鬓椭,就可以避免內(nèi)存緊縮颠猴,減少碎片⌒∪荆基于這一思想翘瓮,通過(guò)引入進(jìn)程的邏輯地址,把進(jìn)程地址空間與實(shí)際存儲(chǔ)空間分離裤翩,增加存儲(chǔ)管理的靈活性资盅。地址空間和存儲(chǔ)空間兩個(gè)基本概念的定義如下:
地址空間:將源程序經(jīng)過(guò)編譯后得到的目標(biāo)程序,存在于它所限定的地址范圍內(nèi)踊赠,這個(gè)范圍稱為地址空間呵扛。地址空間是邏輯地址的集合。
存儲(chǔ)空間:指主存中一系列存儲(chǔ)信息的物理單元的集合筐带,這些單元的編號(hào)稱為物理地址存儲(chǔ)空間是物理地址的集合今穿。
根據(jù)分配時(shí)所采用的基本單位不同,可將離散分配的管理方式分為以下三種:
頁(yè)式存儲(chǔ)管理烫堤、段式存儲(chǔ)管理和段頁(yè)式存儲(chǔ)管理荣赶。其中段頁(yè)式存儲(chǔ)管理是前兩種結(jié)合的產(chǎn)物凤价。
頁(yè)式和段式管理區(qū)別
頁(yè)式和段式系統(tǒng)有許多相似之處。比如拔创,兩者都采用離散分配方式利诺,且都通過(guò)地址映射機(jī)構(gòu)來(lái)實(shí)現(xiàn)地址變換。但概念上兩者也有很多區(qū)別剩燥,主要表現(xiàn)在:
1)慢逾、需求:是信息的物理單位,分頁(yè)是為了實(shí)現(xiàn)離散分配方式灭红,以減少內(nèi)存的碎片侣滩,提高內(nèi)存的利用率”淝埽或者說(shuō)君珠,分頁(yè)僅僅是由于系統(tǒng)管理的需要,而不是用戶的需要娇斑。段是信息的邏輯單位策添,它含有一組其意義相對(duì)完整的信息。分段的目的是為了更好地滿足用戶的需要毫缆。
一條指令或一個(gè)操作數(shù)可能會(huì)跨越兩個(gè)頁(yè)的分界處唯竹,而不會(huì)跨越兩個(gè)段的分界處。
2)苦丁、大薪恰:頁(yè)大小固定且由系統(tǒng)決定,把邏輯地址劃分為頁(yè)號(hào)和頁(yè)內(nèi)地址兩部分旺拉,是由機(jī)器硬件實(shí)現(xiàn)的产上。段的長(zhǎng)度不固定,且決定于用戶所編寫(xiě)的程序账阻,通常由編譯系統(tǒng)在對(duì)源程序進(jìn)行編譯時(shí)根據(jù)信息的性質(zhì)來(lái)劃分蒂秘。
3)泽本、邏輯地址表示:頁(yè)式系統(tǒng)地址空間是一維的淘太,即單一的線性地址空間,程序員只需利用一個(gè)標(biāo)識(shí)符规丽,即可表示一個(gè)地址蒲牧。分段的作業(yè)地址空間是二維的,程序員在標(biāo)識(shí)一個(gè)地址時(shí)赌莺,既需給出段名冰抢,又需給出段內(nèi)地址。
4)艘狭、比頁(yè)大挎扰,因而段表比頁(yè)表短翠订,可以縮短查找時(shí)間,提高訪問(wèn)速度遵倦。
五. 頁(yè)式存儲(chǔ)管理
1. 基本原理
將程序的邏輯地址空間劃分為固定大小的頁(yè)(page)尽超,而物理內(nèi)存劃分為同樣大小的頁(yè)框(page frame)。程序加載時(shí)梧躺,可將任意一頁(yè)放人內(nèi)存中任意一個(gè)頁(yè)框似谁,這些頁(yè)框不必連續(xù),從而實(shí)現(xiàn)了離散分配掠哥。該方法需要CPU的硬件支持巩踏,來(lái)實(shí)現(xiàn)邏輯地址和物理地址之間的映射。在頁(yè)式存儲(chǔ)管理方式中地址結(jié)構(gòu)由兩部構(gòu)成续搀,前一部分是頁(yè)號(hào)塞琼,后一部分為頁(yè)內(nèi)地址w(位移量),如圖4所示:
頁(yè)式管理方式的優(yōu)點(diǎn)是:
1)沒(méi)有外碎片禁舷,每個(gè)內(nèi)碎片不超過(guò)頁(yè)大比前面所討論的幾種管理方式的最大進(jìn)步是屈梁,
2)一個(gè)程序不必連續(xù)存放。
3)便于改變程序占用空間的大小(主要指隨著程序運(yùn)行榛了,動(dòng)態(tài)生成的數(shù)據(jù)增多在讶,所要求的地址空間相應(yīng)增長(zhǎng))。
缺點(diǎn)是:要求程序全部裝入內(nèi)存霜大,沒(méi)有足夠的內(nèi)存构哺,程序就不能執(zhí)行。
2. 頁(yè)式管理的數(shù)據(jù)結(jié)構(gòu)
在頁(yè)式系統(tǒng)中進(jìn)程建立時(shí)战坤,操作系統(tǒng)為進(jìn)程中所有的頁(yè)分配頁(yè)框曙强。當(dāng)進(jìn)程撤銷時(shí)收回所有分配給它的頁(yè)框。在程序的運(yùn)行期間途茫,如果允許進(jìn)程動(dòng)態(tài)地申請(qǐng)空間碟嘴,操作系統(tǒng)還要為進(jìn)程申請(qǐng)的空間分配物理頁(yè)框。操作系統(tǒng)為了完成這些功能囊卜,必須記錄系統(tǒng)內(nèi)存中實(shí)際的頁(yè)框使用情況娜扇。操作系統(tǒng)還要在進(jìn)程切換時(shí),正確地切換兩個(gè)不同的進(jìn)程地址空間到物理內(nèi)存空間的映射栅组。這就要求操作系統(tǒng)要記錄每個(gè)進(jìn)程頁(yè)表的相關(guān)信息雀瓢。為了完成上述的功能,—個(gè)頁(yè)式系統(tǒng)中玉掸,一般要采用如下的數(shù)據(jù)結(jié)構(gòu)刃麸。
進(jìn)程頁(yè)表:完成邏輯頁(yè)號(hào)(本進(jìn)程的地址空間)到物理頁(yè)面號(hào)(實(shí)際內(nèi)存空間,也叫塊號(hào))的映射司浪。
每個(gè)進(jìn)程有一個(gè)頁(yè)表泊业,描述該進(jìn)程占用的物理頁(yè)面及邏輯排列順序把沼,如圖:
物理頁(yè)面表:整個(gè)系統(tǒng)有一個(gè)物理頁(yè)面表,描述物理內(nèi)存空間的分配使用狀況吁伺,其數(shù)據(jù)結(jié)構(gòu)可采用位示圖和空閑頁(yè)鏈表智政。
對(duì)于位示圖法,即如果該頁(yè)面已被分配箱蝠,則對(duì)應(yīng)比特位置1续捂,否置0.
請(qǐng)求表:整個(gè)系統(tǒng)有一個(gè)請(qǐng)求表,描述系統(tǒng)內(nèi)各個(gè)進(jìn)程頁(yè)表的位置和大小宦搬,用于地址轉(zhuǎn)換也可以結(jié)合到各進(jìn)程的PCB(進(jìn)程控制塊)里牙瓢。如圖:
3. 頁(yè)式管理地址變換
在頁(yè)式系統(tǒng)中,指令所給出的地址分為兩部分:邏輯頁(yè)號(hào)和頁(yè)內(nèi)地址间校。
原理:CPU中的內(nèi)存管理單元(MMU)按邏輯頁(yè)號(hào)通過(guò)查進(jìn)程頁(yè)表得到物理頁(yè)框號(hào)矾克,將物理頁(yè)框號(hào)與頁(yè)內(nèi)地址相加形成物理地址(見(jiàn)圖4-4)。
邏輯頁(yè)號(hào)憔足,頁(yè)內(nèi)偏移地址->查進(jìn)程頁(yè)表胁附,得物理頁(yè)號(hào)->物理地址:
上述過(guò)程通常由處理器的硬件直接完成,不需要軟件參與滓彰。通常控妻,操作系統(tǒng)只需在進(jìn)程切換時(shí),把進(jìn)程頁(yè)表的首地址裝入處理器特定的寄存器中即可揭绑。一般來(lái)說(shuō)弓候,頁(yè)表存儲(chǔ)在主存之中。這樣處理器每訪問(wèn)一個(gè)在內(nèi)存中的操作數(shù)他匪,就要訪問(wèn)兩次內(nèi)存:
第一次用來(lái)查找頁(yè)表將操作數(shù)的 邏輯地址變換為物理地址菇存;
第二次完成真正的讀寫(xiě)操作。
這樣做時(shí)間上耗費(fèi)嚴(yán)重邦蜜。為縮短查找時(shí)間依鸥,可以將頁(yè)表從內(nèi)存裝入CPU內(nèi)部的關(guān)聯(lián)存儲(chǔ)器(例如,快表) 中悼沈,實(shí)現(xiàn)按內(nèi)容查找贱迟。此時(shí)的地址變換過(guò)程是:在CPU給出有效地址后,由地址變換機(jī)構(gòu)自動(dòng)將頁(yè)號(hào)送人快表井辆,并將此頁(yè)號(hào)與快表中的所有頁(yè)號(hào)進(jìn)行比較关筒,而且這 種比較是同時(shí)進(jìn)行的。若其中有與此相匹配的頁(yè)號(hào)杯缺,表示要訪問(wèn)的頁(yè)的頁(yè)表項(xiàng)在快表中。于是可直接讀出該頁(yè)所對(duì)應(yīng)的物理頁(yè)號(hào)睡榆,這樣就無(wú)需訪問(wèn)內(nèi)存中的頁(yè)表萍肆。由于關(guān)聯(lián)存儲(chǔ)器的訪問(wèn)速度比內(nèi)存的訪問(wèn)速度快得多袍榆。
六. 段式存儲(chǔ)管理
1. 基本原理
在段式存儲(chǔ)管理中,將程序的地址空間劃分為若干個(gè)段(segment)塘揣,這樣每個(gè)進(jìn)程有一個(gè)二維的地址空間包雀。在前面所介紹的動(dòng)態(tài)分區(qū)分配方式中,系統(tǒng)為整個(gè)進(jìn)程分配一個(gè)連續(xù)的內(nèi)存空間亲铡。而在段式存儲(chǔ)管理系統(tǒng)中才写,則為每個(gè)段分配一個(gè)連續(xù)的分區(qū),而進(jìn)程中的各個(gè)段可以不連續(xù)地存放在內(nèi)存的不同分區(qū)中奖蔓。程序加載時(shí)赞草,操作系統(tǒng)為所有段分配其所需內(nèi)存,這些段不必連續(xù)吆鹤,物理內(nèi)存的管理采用動(dòng)態(tài)分區(qū)的管理方法厨疙。
在為某個(gè)段分配物理內(nèi)存時(shí),可以采用首先適配法疑务、下次適配法沾凄、最佳適配法等方法。
在回收某個(gè)段所占用的空間時(shí)知允,要注意將收回的空間與其相鄰的空間合并撒蟀。
段式存儲(chǔ)管理也需要硬件支持,實(shí)現(xiàn)邏輯地址到物理地址的映射温鸽。
程序通過(guò)分段劃分為多個(gè)模塊牙肝,如代碼段、數(shù)據(jù)段嗤朴、共享段:
–可以分別編寫(xiě)和編譯
–可以針對(duì)不同類型的段采取不同的保護(hù)
–可以按段為單位來(lái)進(jìn)行共享配椭,包括通過(guò)動(dòng)態(tài)鏈接進(jìn)行代碼共享
這樣做的優(yōu)點(diǎn)是:可以分別編寫(xiě)和編譯源程序的一個(gè)文件,并且可以針對(duì)不同類型的段采取不同的保護(hù)雹姊,也可以按段為單位來(lái)進(jìn)行共享股缸。
總的來(lái)說(shuō),段式存儲(chǔ)管理的優(yōu)點(diǎn)是:沒(méi)有內(nèi)碎片吱雏,外碎片可以通過(guò)內(nèi)存緊縮來(lái)消除敦姻;便于實(shí)現(xiàn)內(nèi)存共享。缺點(diǎn)與頁(yè)式存儲(chǔ)管理的缺點(diǎn)相同歧杏,進(jìn)程必須全部裝入內(nèi)存镰惦。
2. 段式管理的數(shù)據(jù)結(jié)構(gòu)
為了實(shí)現(xiàn)段式管理,操作系統(tǒng)需要如下的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)進(jìn)程的地址空間到物理內(nèi)存空間的映射犬绒,并跟蹤物理內(nèi)存的使用情況旺入,以便在裝入新的段的時(shí)候,合理地分配內(nèi)存空間。
·進(jìn)程段表:描述組成進(jìn)程地址空間的各段茵瘾,可以是指向系統(tǒng)段表中表項(xiàng)的索引礼华。每段有段基址(baseaddress),即段內(nèi)地址拗秘。
在系統(tǒng)中為每個(gè)進(jìn)程建立一張段映射表圣絮,如圖:
·系統(tǒng)段表:系統(tǒng)所有占用段(已經(jīng)分配的段)。
·空閑段表:內(nèi)存中所有空閑段雕旨,可以結(jié)合到系統(tǒng)段表中扮匠。
3. 段式管理的地址變換
在段式 管理系統(tǒng)中,整個(gè)進(jìn)程的地址空間是二維的凡涩,即其邏輯地址由段號(hào)和段內(nèi)地址兩部分組成棒搜。為了完成進(jìn)程邏輯地址到物理地址的映射,處理器會(huì)查找內(nèi)存中的段表突照,由段號(hào)得到段的首地址帮非,加上段內(nèi)地址,得到實(shí)際的物理地址讹蘑。這個(gè)過(guò)程也是由處理器的硬件直接完成的末盔,操作系統(tǒng)只需在進(jìn)程切換時(shí),將進(jìn)程段表的首地址裝入處理器的特定寄存器當(dāng)中座慰。這個(gè)寄存器一般被稱作段表地址寄存器陨舱。
更多Linux內(nèi)核源碼高階知識(shí)請(qǐng)加開(kāi)發(fā)交流Q群篇【318652197】獲取,進(jìn)群免費(fèi)獲取相關(guān)資料版仔,免費(fèi)觀看公開(kāi)課技術(shù)分享游盲,入群不虧,快來(lái)加入我們吧~