一.內(nèi)存管理
1.主要功能
內(nèi)存管理的主要功能有:
- 內(nèi)存空間的分配與回收。由操作系統(tǒng)完成主存儲(chǔ)器空間的分配和管理,使程序員擺脫存儲(chǔ)分配的麻煩,提高編程效率。
- 地址轉(zhuǎn)換。在多道程序環(huán)境下,程序中的邏輯地址與內(nèi)存中的物理地址不可能一致, 因此存儲(chǔ)管理必須提供地址變換功能,把邏輯地址轉(zhuǎn)換成相應(yīng)的物理地址。
- 內(nèi)存空間的擴(kuò)充。利用虛擬存儲(chǔ)技術(shù)或自動(dòng)覆蓋技術(shù),從邏輯上擴(kuò)充內(nèi)存。
- 內(nèi)存共享。指允許多個(gè)進(jìn)程訪問(wèn)內(nèi)存的同一部分。例如,多個(gè)合作進(jìn)程可能需要訪問(wèn)同一塊數(shù)據(jù),因此必須支持對(duì)內(nèi)存共享區(qū)域進(jìn)行受控訪問(wèn)。
- 存儲(chǔ)保護(hù)。保證各道作業(yè)在各自的存儲(chǔ)空間內(nèi)運(yùn)行,互不干擾。
在進(jìn)行具體的內(nèi)存管理之前,需要了解進(jìn)程運(yùn)行的基本原理和要求。
2.補(bǔ)充
內(nèi)存管理就是就是圍繞這五個(gè)方面展開(kāi)的。
二.程序運(yùn)行的過(guò)程
1.過(guò)程
創(chuàng)建進(jìn)程首先要將程序和數(shù)據(jù)裝入內(nèi)存。將用戶源程序變?yōu)榭稍趦?nèi)存中執(zhí)行的程序,通常需
要以下幾個(gè)步驟:
●編譯。由編譯程序?qū)⒂脩粼创a編譯成若干目標(biāo)模塊。
●鏈接。由鏈接程序?qū)⒕幾g后形成的- -組目標(biāo)模塊及它們所需的庫(kù)函數(shù)鏈接在- -起,形成一個(gè)完整的裝入模塊。
●裝入。由裝入程序?qū)⒀b入模塊裝入內(nèi)存運(yùn)行。
2.個(gè)人理解
- 編譯:把你寫(xiě)的代碼各模塊編譯成對(duì)應(yīng)的機(jī)器語(yǔ)言。
- 鏈接:把各個(gè)模塊鏈接到一起形成一個(gè)裝入模塊,在這個(gè)時(shí)候形成邏輯地址。
- 裝入:裝入模塊(可執(zhí)行文件)進(jìn)入內(nèi)存,這個(gè)時(shí)候邏輯地址變成物理地址。
3.鏈接方式
程序的鏈接有三種方式:
- (1)靜態(tài)鏈接:
在程序運(yùn)行之前,先將各目標(biāo)模塊及它們所需的庫(kù)函數(shù)鏈接成-一個(gè)完整的裝配模塊,以后不再拆開(kāi)。將幾個(gè)目標(biāo)模塊裝配成一個(gè)裝入模塊時(shí),需要解決兩個(gè)問(wèn)題:①修改相對(duì)地址,編譯后的所有目標(biāo)模塊都是從0開(kāi)始的相對(duì)地址,當(dāng)鏈接成- -個(gè)裝入模塊時(shí)要修改相對(duì)地址。②變換外部調(diào)用符號(hào),將每個(gè)模塊中所用的外部調(diào)用符號(hào)也都變換為相對(duì)地址。 - (2)裝入時(shí)動(dòng)態(tài)鏈接:
將用戶源程序編譯后所得到的- -組目標(biāo)模塊,在裝入內(nèi)存時(shí),采用邊裝入邊鏈接的方式。其優(yōu)點(diǎn)是便于修改和更新,便于實(shí)現(xiàn)對(duì)目標(biāo)模塊的共享。 - (3)運(yùn)行時(shí)動(dòng)態(tài)鏈接:
對(duì)某些目標(biāo)模塊的鏈接,是在程序執(zhí)行中需要該目標(biāo)模塊時(shí)才進(jìn)行的。凡在執(zhí)行過(guò)程中未被用到的目標(biāo)模塊,都不會(huì)被調(diào)入內(nèi)存和被鏈接到裝入模塊上。其優(yōu)點(diǎn)是能加快程序的裝入過(guò)程,還可節(jié)省大量的內(nèi)存空間。
4.裝入方式
內(nèi)存的裝入模塊在裝入內(nèi)存時(shí),同樣有以下三種方式:
-
(1)絕對(duì)裝入
絕對(duì)裝入方式只適用于單道程序環(huán)境。在編譯時(shí),若知道程序?qū)Ⅰv留在內(nèi)存的某個(gè)位置,則編譯程序?qū)a(chǎn)生絕對(duì)地址的目標(biāo)代碼。絕對(duì)裝入程序按照裝入模塊中的地址,將程序和數(shù)據(jù)裝入內(nèi)存。由于程序中的邏輯地址與實(shí)際內(nèi)存地址完全相同,因此不需對(duì)程序和數(shù)據(jù)的地址進(jìn)行修改。另外,程序中所用的絕對(duì)地址,可在編譯或匯編時(shí)給出,也可由程序員直接賦予。而通常情況下在程序中采用的是符號(hào)地址,編譯或匯編時(shí)再轉(zhuǎn)換為絕對(duì)地址。 -
(2)可重定位裝入
在多道程序環(huán)境下,多個(gè)目標(biāo)模塊的起始地址通常都從0開(kāi)始,程序中的其他地址都是相對(duì)于起始地址的,此時(shí)應(yīng)采用可重定位裝入方式。根據(jù)內(nèi)存的當(dāng)前情況,將裝入模塊裝入內(nèi)存的適當(dāng)位置。在裝入時(shí)對(duì)目標(biāo)程序中指令和數(shù)據(jù)地址的修改過(guò)程稱為重定位,又因?yàn)榈刂纷儞Q通常是在進(jìn)程裝入時(shí)一次完成的,故稱為靜態(tài)重定位。當(dāng)一個(gè)作業(yè)裝入內(nèi)存時(shí),必須給它分配要求的全部?jī)?nèi)存空間,若沒(méi)有足夠的內(nèi)存,則無(wú)法裝
入。此外,作業(yè)一旦進(jìn)入內(nèi)存,整個(gè)運(yùn)行期間就不能在內(nèi)存中移動(dòng),也不能再申請(qǐng)內(nèi)存空間。 -
(3)動(dòng)態(tài)運(yùn)行時(shí)裝入
也稱動(dòng)態(tài)重定位。程序在內(nèi)存中若發(fā)生移動(dòng),則需要采用動(dòng)態(tài)的裝入方式。裝入程序把裝入模塊裝入內(nèi)存后,并不立即把裝入模塊中的相對(duì)地址轉(zhuǎn)換為絕對(duì)地址,而是把這種地址轉(zhuǎn)換推遲到程序真正要執(zhí)行時(shí)才進(jìn)行。因此,裝入內(nèi)存后的所有地址均為相對(duì)地址。這種方式需要一個(gè)重定位寄存器的支持。
動(dòng)態(tài)重定位的優(yōu)點(diǎn):可以將程序分配到不連續(xù)的存儲(chǔ)區(qū);在程序運(yùn)行之前可以只裝入部分代
碼即可投入運(yùn)行,然后在程序運(yùn)行期間,根據(jù)需要?jiǎng)討B(tài)申請(qǐng)分配內(nèi)存;便于程序段的共享。
三.其他功能
1.內(nèi)存保護(hù)
確保每個(gè)進(jìn)程都有一個(gè)單獨(dú)的內(nèi)存空間。內(nèi)存分配前,需要保護(hù)操作系統(tǒng)不受用戶進(jìn)程的影.響,同時(shí)保護(hù)用戶進(jìn)程不受其他用戶進(jìn)程的影響。內(nèi)存保護(hù)可采取兩種方法: .
- 1)在CPU中設(shè)置一-對(duì)上、下限寄存器,存放用戶作業(yè)在主存中的下限和上限地址,每當(dāng)
CPU要訪問(wèn)一個(gè)地址時(shí),分別和兩個(gè)寄存器的值相比,判斷有無(wú)越界。 - 2)采用重定位寄存器(又稱基地址寄存器)和界地址寄存器(又稱限長(zhǎng)寄存器)來(lái)實(shí)現(xiàn)這種保護(hù)。重定位寄存器含最小的物理地址值,界地址寄存器含邏輯地址的最大值。內(nèi)存管理機(jī)構(gòu)動(dòng)態(tài)地將邏輯地址與界地址寄存器進(jìn)行比較,若未發(fā)生地址越界,則加上重定位寄存器的值后映射成物理地址,再送交內(nèi)存單元。
2.內(nèi)存共享
并不是所有的進(jìn)程內(nèi)存空間都適合共享,只有那些只讀的區(qū)域才可以共享。可重入代碼又稱純代碼,是一種允許多個(gè)進(jìn)程同時(shí)訪問(wèn)但不允許被任何進(jìn)程修改的代碼。但在實(shí)際執(zhí)行時(shí),也可以為每個(gè)進(jìn)程配以局部數(shù)據(jù)區(qū),把在執(zhí)行中可能改變的部分復(fù)制到該數(shù)據(jù)區(qū),這樣,程序在執(zhí)行時(shí)只需對(duì)該私有數(shù)據(jù)區(qū)中的內(nèi)存進(jìn)行修改,并不去改變共享的代碼。
3.內(nèi)存空間的擴(kuò)充
交換技術(shù)主要在不同進(jìn)程( 或作業(yè))之間進(jìn)行,而覆蓋則用于同一個(gè)程序或進(jìn)程中。對(duì)于主.存無(wú)法存放用戶程序的矛盾,現(xiàn)代操作系統(tǒng)是通過(guò)虛擬內(nèi)存技術(shù)來(lái)解決的,覆蓋技術(shù)則已成為歷史;而交換技術(shù)在現(xiàn)代操作系統(tǒng)中仍具有較強(qiáng)的生命力。
四.內(nèi)存分配
1.連續(xù)分配方式
1.單一連續(xù)分配
內(nèi)存在此方式下分為系統(tǒng)區(qū)和用戶區(qū),系統(tǒng)區(qū)僅供操作系統(tǒng)使用,通常在低地址部分:在用戶區(qū)內(nèi)存中,僅有一道用戶程序,即整個(gè)內(nèi)存的用戶空間由該程序獨(dú)占。這種方式的優(yōu)點(diǎn)是簡(jiǎn)單、無(wú)外部碎片,無(wú)須進(jìn)行內(nèi)存保護(hù),因?yàn)閮?nèi)存中永遠(yuǎn)只有一道程序。缺點(diǎn)是只能用于單用戶、單任務(wù)的操作系統(tǒng)中,有內(nèi)部碎片,存儲(chǔ)器的利用率極低。
2.固定分區(qū)分配
固定分區(qū)分配是最簡(jiǎn)單的一種多道程序存儲(chǔ)管理方式,它將用戶內(nèi)存空間劃分為若干固定大
小的區(qū)域,每個(gè)分區(qū)只裝入一道作業(yè)。當(dāng)有空閑分區(qū)時(shí),便可再?gòu)耐獯娴暮髠渥鳂I(yè)隊(duì)列中選擇適
當(dāng)大小的作業(yè)裝入該分區(qū),如此循環(huán)。在劃分分區(qū)時(shí)有兩種不同的方法。
- 分區(qū)大小相等。程序太小會(huì)造成浪費(fèi),程序太大又無(wú)法裝入,缺乏靈活性。
- 分區(qū)大小不等。劃分為多個(gè)較小的分區(qū)、適量的中等分區(qū)和少量大分區(qū)。
3.動(dòng)態(tài)分區(qū)分配
又稱可變分區(qū)分配,它是在進(jìn)程裝入內(nèi)存時(shí),根據(jù)進(jìn)程的實(shí)際需要,動(dòng)態(tài)地為之分配內(nèi)存,并使分區(qū)的大小正好適合進(jìn)程的需要。因此,系統(tǒng)中分區(qū)的大小和數(shù)目是可變的。
在進(jìn)程裝入或換入主存時(shí),若內(nèi)存中有多個(gè)足夠大的空閑塊,則操作系統(tǒng)必須確定分配哪個(gè)
內(nèi)存塊給進(jìn)程使用,這就是動(dòng)態(tài)分區(qū)的分配策略??紤]以下幾種算法:
- 1)首次適應(yīng)(First Fit) 算法??臻e分區(qū)以地址遞增的次序鏈接。分配內(nèi)存時(shí),從鏈?zhǔn)组_(kāi)始
順序查找,找到大小能滿足要求的第一-個(gè)空閑分區(qū)分配給作業(yè)。 - 2)鄰近適應(yīng)(NextFit) 算法。又稱循環(huán)首次適應(yīng)算法,由首次適應(yīng)算法演變而成。不同之
處是,分配內(nèi)存時(shí)從上次查找結(jié)束的位置開(kāi)始繼續(xù)查找。 - 3)最佳適應(yīng)(Best Fit)算法??臻e分區(qū)按容量遞增的次序形成空閑分區(qū)鏈,找到第-一個(gè)能
滿足要求且最小的空閑分區(qū)分配給作業(yè),避免“大材小用”。 - 4)最壞適應(yīng)(Worst Fit) 算法??臻e分區(qū)以容量遞減的次序鏈接,找到第- -個(gè)能滿足要求的,
即最大的分區(qū),從中分割一部分 存儲(chǔ)空間給作業(yè)。
首次適應(yīng)算法最簡(jiǎn)單,通常也是最好和最快的。不過(guò),首次適應(yīng)算法會(huì)使得內(nèi)存的低地址部分出現(xiàn)很多小的空閑分區(qū),而每次分配查找時(shí)都要經(jīng)過(guò)這些分區(qū),因此增加了開(kāi)銷。
鄰近適應(yīng)算法試圖解決這個(gè)問(wèn)題。但它常常導(dǎo)致在內(nèi)存空間的尾部(因?yàn)樵? -遍掃描中,內(nèi)存前面部分使用后再釋放時(shí),不會(huì)參與分配)分裂成小碎片。通常比首次適應(yīng)算法要差。
最佳適應(yīng)算法雖然稱為“最佳”,但是性能通常很差,因?yàn)槊看巫罴训姆峙鋾?huì)留下很小的難以利用的內(nèi)存塊,會(huì)產(chǎn)生最多的外部碎片。
最壞適應(yīng)算法與最佳適應(yīng)算法相反,它選擇最大的可用塊,這看起來(lái)最不容易產(chǎn)生碎片,但是卻把最大的連續(xù)內(nèi)存劃分開(kāi),會(huì)很快導(dǎo)致沒(méi)有可用的大內(nèi)存塊,因此性能也非常差。
2.非連續(xù)分配方式
非連續(xù)分配方式根據(jù)分區(qū)的大小是否固定,分為分頁(yè)存儲(chǔ)管理和分段存儲(chǔ)管理。在分頁(yè)存儲(chǔ)管理中,又根據(jù)運(yùn)行作業(yè)時(shí)是否要把作業(yè)的所有頁(yè)面都裝入內(nèi)存才能運(yùn)行,分為基本分頁(yè)存儲(chǔ)管理和請(qǐng)求分頁(yè)存儲(chǔ)管理。
1.基本分頁(yè)存儲(chǔ)管理
基本分頁(yè)存儲(chǔ)管理是指將主存和輔存分成若干個(gè)大小相等的頁(yè),以頁(yè)為單位進(jìn)行數(shù)據(jù)的讀寫(xiě)和存儲(chǔ)。在基本分頁(yè)存儲(chǔ)管理中,每個(gè)進(jìn)程都有自己的頁(yè)表,用于記錄該進(jìn)程的邏輯地址與物理地址之間的映射關(guān)系。
當(dāng)進(jìn)程需要訪問(wèn)某個(gè)邏輯地址時(shí),首先通過(guò)頁(yè)表將邏輯地址轉(zhuǎn)換成物理地址,并判斷該物理地址是否已經(jīng)在主存中。如果該物理地址所對(duì)應(yīng)的頁(yè)不在主存中,則發(fā)生缺頁(yè)中斷,操作系統(tǒng)負(fù)責(zé)將該頁(yè)從輔存中調(diào)入主存,更新頁(yè)表,并重新執(zhí)行該指令。如果該物理地址所對(duì)應(yīng)的頁(yè)已經(jīng)在主存中,則直接訪問(wèn)該頁(yè)并執(zhí)行相應(yīng)的操作。
基本分頁(yè)存儲(chǔ)管理可以提高內(nèi)存的利用率,使得多個(gè)進(jìn)程可以同時(shí)共享主存。但是在實(shí)現(xiàn)過(guò)程中,需要考慮到頁(yè)面置換算法、頁(yè)表的管理以及缺頁(yè)中斷的處理等問(wèn)題。
2.基本分段存儲(chǔ)管理
基本分段存儲(chǔ)管理是指將主存和輔存分成若干個(gè)大小不等的段,以段為單位進(jìn)行數(shù)據(jù)的讀寫(xiě)和存儲(chǔ)。在基本分段存儲(chǔ)管理中,每個(gè)進(jìn)程都有自己的段表,用于記錄該進(jìn)程的邏輯地址與物理地址之間的映射關(guān)系。
當(dāng)進(jìn)程需要訪問(wèn)某個(gè)邏輯地址時(shí),首先根據(jù)該地址所屬的段,在段表中查找該段的物理地址,并計(jì)算出物理地址偏移量。然后將物理地址偏移量加上段的物理地址,得到最終的物理地址,并執(zhí)行相應(yīng)的操作。
在基本分段存儲(chǔ)管理中,不同的進(jìn)程可以共享相同的段,從而減少了內(nèi)存的浪費(fèi)。但是在實(shí)現(xiàn)過(guò)程中,需要考慮到段的分配、段的保護(hù)、段表的管理以及地址轉(zhuǎn)換等問(wèn)題。同時(shí),由于段的大小不同,因此還需要考慮段的碎片化問(wèn)題。
3.基本段頁(yè)式存儲(chǔ)管理
基本段頁(yè)式存儲(chǔ)管理是指將主存和輔存分成若干個(gè)大小不等的段和頁(yè),以段和頁(yè)為單位進(jìn)行數(shù)據(jù)的讀寫(xiě)和存儲(chǔ)。在基本段頁(yè)式存儲(chǔ)管理中,每個(gè)進(jìn)程都有自己的段表和頁(yè)表,用于記錄該進(jìn)程的邏輯地址與物理地址之間的映射關(guān)系。
當(dāng)進(jìn)程需要訪問(wèn)某個(gè)邏輯地址時(shí),首先根據(jù)該地址所屬的段,在段表中查找該段所對(duì)應(yīng)的頁(yè)表的物理地址,并計(jì)算出該地址所對(duì)應(yīng)的頁(yè)的物理地址。然后在頁(yè)表中查找該頁(yè)的物理地址,并計(jì)算出物理地址偏移量。最后將物理地址偏移量加上頁(yè)的物理地址,得到最終的物理地址,并執(zhí)行相應(yīng)的操作。
在基本段頁(yè)式存儲(chǔ)管理中,可以實(shí)現(xiàn)不同進(jìn)程之間的空間隔離和內(nèi)存共享,從而提高了內(nèi)存的利用率。但是在實(shí)現(xiàn)過(guò)程中,需要考慮到段的分配、段的保護(hù)、頁(yè)表的管理、頁(yè)面置換算法以及缺頁(yè)中斷的處理等問(wèn)題。同時(shí),由于段的大小不同,也會(huì)帶來(lái)段的碎片化問(wèn)題。
五.虛擬內(nèi)存的管理方式
1.結(jié)構(gòu)圖
2.請(qǐng)求分頁(yè)式存儲(chǔ)管理
請(qǐng)求分頁(yè)式存儲(chǔ)管理是基于基本分頁(yè)存儲(chǔ)管理的一種改進(jìn),它可以提高頁(yè)面置換算法的效率,并減少缺頁(yè)中斷的次數(shù)。在請(qǐng)求分頁(yè)式存儲(chǔ)管理中,每個(gè)進(jìn)程所占用的物理頁(yè)面數(shù)量并不是固定的,而是根據(jù)進(jìn)程的實(shí)際需要來(lái)動(dòng)態(tài)地進(jìn)行分配。
具體來(lái)說(shuō),當(dāng)一個(gè)進(jìn)程需要申請(qǐng)一頁(yè)新的物理頁(yè)面時(shí),操作系統(tǒng)會(huì)進(jìn)行以下步驟:
- 首先搜索空閑物理頁(yè)面池,查找是否有空閑的物理頁(yè)面可供使用。
- 如果沒(méi)有空閑的物理頁(yè)面,則采用頁(yè)面置換算法將一個(gè)已經(jīng)駐留在主存中但未被使用的頁(yè)替換出去,釋放其物理頁(yè)面,以供當(dāng)前進(jìn)程使用。
- 如果已經(jīng)找到了空閑的物理頁(yè)面,則將該頁(yè)面分配給當(dāng)前進(jìn)程,并在進(jìn)程的頁(yè)表中記錄該頁(yè)面的映射關(guān)系。
通過(guò)動(dòng)態(tài)地分配物理頁(yè)面,請(qǐng)求分頁(yè)式存儲(chǔ)管理可以避免浪費(fèi)物理內(nèi)存的情況發(fā)生,并且可以根據(jù)進(jìn)程的實(shí)際需要來(lái)動(dòng)態(tài)地分配物理內(nèi)存,從而提高了內(nèi)存的利用率。同時(shí),請(qǐng)求分頁(yè)式存儲(chǔ)管理還可以根據(jù)不同的頁(yè)面置換算法,如FIFO和LRU等,來(lái)選擇最優(yōu)的頁(yè)面置換策略,從而減少缺頁(yè)中斷的次數(shù),提高系統(tǒng)的性能。
3.請(qǐng)求分頁(yè)式存儲(chǔ)管理流程圖
4.補(bǔ)充
在計(jì)算機(jī)組成原理中,也涉及到虛擬內(nèi)存這一知識(shí)點(diǎn),在那里我有詳細(xì)解釋,這里就不贅述了。
點(diǎn)我了解虛擬存儲(chǔ)技術(shù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-484450.html
六.聲明
本文是從操作系統(tǒng)角度了解的內(nèi)存管理,可以結(jié)合從計(jì)算機(jī)組成原理一起觀看效果更佳。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-484450.html
到了這里,關(guān)于從操作系統(tǒng)角度了解內(nèi)存管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!