1.內(nèi)存管理的介紹
問(wèn)題:操作系統(tǒng)的內(nèi)存管理主要是做什么?
操作系統(tǒng)的內(nèi)存管理主要負(fù)責(zé)①內(nèi)存的分配與回收(malloc 函數(shù):申請(qǐng)內(nèi)存,free 函數(shù):釋放內(nèi)存),②地址轉(zhuǎn)換:將邏輯地址轉(zhuǎn)換成相應(yīng)的物理地址。
2.常見(jiàn)的內(nèi)存管理方式
內(nèi)存管理方式為連續(xù)分配管理方式和非連續(xù)分配管理方式這兩種。連續(xù)分配管理方式是指為一個(gè)用戶程序分配一個(gè)連續(xù)的內(nèi)存空間,例如塊式管理?。非連續(xù)分配管理方式允許一個(gè)程序使用的內(nèi)存分布在離散或者說(shuō)不相鄰的內(nèi)存中,例如頁(yè)式管理、段式管理。
2.1 連續(xù)分配管理方式
塊式管理
遠(yuǎn)古時(shí)代的計(jì)算機(jī)操系統(tǒng)的內(nèi)存管理方式。將內(nèi)存分為幾個(gè)固定大小的塊,每個(gè)塊中只包含一個(gè)進(jìn)程。如果程序運(yùn)行需要內(nèi)存的話,操作系統(tǒng)就分配給它一塊。如果程序運(yùn)行只需要很小的空間的話,分配的這塊內(nèi)存很大一部分幾乎被浪費(fèi)了。這些在每個(gè)塊中未被利用的空間,我們稱(chēng)之為碎片。
2.2 非連續(xù)分配管理方式
(1)頁(yè)式管理機(jī)制
把主存分為大小相等且固定的一頁(yè)一頁(yè)的形式,頁(yè)較小,對(duì)比塊式管理的劃分力度更大,提高了內(nèi)存利用率,減少了碎片。頁(yè)式管理通過(guò)頁(yè)表對(duì)應(yīng)虛擬地址和物理地址。
(2)段式管理機(jī)制
頁(yè)式管理雖然提高了內(nèi)存利用率,但是頁(yè)式管理其中的頁(yè)實(shí)際并無(wú)任何實(shí)際意義。 段式管理把主存分為一段段的,每一段的空間又要比一頁(yè)的空間小很多 。段是有實(shí)際意義的,每個(gè)段定義了一組邏輯信息,例如,主程序段 MAIN、子程序段 X、數(shù)據(jù)段 D 及棧段 S 等。 段式管理通過(guò)段表對(duì)應(yīng)虛擬地址和物理地址。
(3)段頁(yè)式管理機(jī)制
段式管理和頁(yè)式管理的共同點(diǎn)和不同點(diǎn)
共同點(diǎn)?:A.分頁(yè)機(jī)制和分段機(jī)制都是為了提高內(nèi)存利用率,較少內(nèi)存碎片。
? ? ? ? ? ? ? ?B.頁(yè)和段都是離散存儲(chǔ)的,所以?xún)烧叨际请x散分配內(nèi)存的方式。但是,每個(gè)頁(yè)和段? ? ? ? ? ? ? ? ? ? 中的內(nèi)存是連續(xù)的。
區(qū)別?:A.頁(yè)的大小是固定的,由操作系統(tǒng)決定;而段的大小不固定,取決于我們當(dāng)前運(yùn)行的? ? ? ? ? ? ? ? ?程序。
? ? ? ? ? ? B.分頁(yè)僅僅是為了滿足操作系統(tǒng)內(nèi)存管理的需求,而段是邏輯信息的單位,在程序中? ? ? ? ? ? ? ? ? 可以體現(xiàn)為代碼段,數(shù)據(jù)段,能夠更好滿足用戶的需要。
段頁(yè)式管理機(jī)制:將進(jìn)程按邏輯模塊分段,每個(gè)段都有自己的段號(hào),再將段分成若干大小固定的頁(yè)。對(duì)內(nèi)存空間的管理仍然和分頁(yè)存儲(chǔ)管理一樣,將其分成若干個(gè)和頁(yè)面大小相同的存儲(chǔ)塊,最后將進(jìn)程的各個(gè)頁(yè)分別裝入各個(gè)內(nèi)存塊中。
例子:如下圖所示,進(jìn)程A大小為16KB,按邏輯進(jìn)行分段,各個(gè)段大小分別為7KB,3KB和6KB。然后對(duì)各個(gè)段進(jìn)行分頁(yè),假設(shè)頁(yè)面大小為4KB,那么各個(gè)段都有各自對(duì)應(yīng)的頁(yè)面,即0號(hào)段分為兩個(gè)頁(yè)面0號(hào)頁(yè)和1號(hào)頁(yè),1號(hào)段和2號(hào)段同理。在運(yùn)行時(shí)將各個(gè)頁(yè)放入內(nèi)存塊中,各個(gè)頁(yè)之間同樣不需要相鄰。
?段頁(yè)式管理機(jī)制中由于每個(gè)段又進(jìn)行了分頁(yè),所以虛擬地址結(jié)構(gòu)由段號(hào)、頁(yè)號(hào)、頁(yè)內(nèi)地址(頁(yè)內(nèi)偏移量)組成。
①?段號(hào)的位數(shù)決定了每個(gè)進(jìn)程最多可以分為幾個(gè)段。
②?頁(yè)號(hào)的位數(shù)決定了每個(gè)段最大有多少頁(yè)。
③?頁(yè)內(nèi)偏移量決定了頁(yè)面的大小、內(nèi)存塊的大小是多少。
3.段表和頁(yè)表
3.1 段表和頁(yè)表
① 段表:每個(gè)段表項(xiàng)由段號(hào)、頁(yè)表長(zhǎng)度、頁(yè)號(hào)(頁(yè)表的起始地址)組成。每個(gè)段表項(xiàng)長(zhǎng)度相等,段號(hào)是隱含的。?
② 頁(yè)表:每個(gè)頁(yè)表由頁(yè)號(hào)、內(nèi)存塊號(hào)組成。每個(gè)頁(yè)表項(xiàng)長(zhǎng)度相等,頁(yè)號(hào)是隱含的。
例子:查找0號(hào)段對(duì)應(yīng)的頁(yè)表,0號(hào)段對(duì)應(yīng)的頁(yè)表存放在1號(hào)塊,所以就可以得到0號(hào)段頁(yè)表的起始地址。如果要查找0號(hào)段頁(yè)表的頁(yè),根據(jù)頁(yè)表也就可以找到相對(duì)應(yīng)的內(nèi)存塊號(hào),最后訪問(wèn)目標(biāo)單元。
3.2 快表和多級(jí)頁(yè)表
分頁(yè)內(nèi)存管理的問(wèn)題:
① 虛擬地址到物理地址的快速轉(zhuǎn)換?!?快表
② 虛擬地址空間大導(dǎo)致頁(yè)表也很大的問(wèn)題?!?多級(jí)頁(yè)表
(1)快表
操作系統(tǒng)在頁(yè)表的基礎(chǔ)上,引入了快表來(lái)加速虛擬地址到物理地址的轉(zhuǎn)換。快表實(shí)質(zhì)是使用CPU 高速緩沖存儲(chǔ)器緩存的頁(yè)表,其內(nèi)容是頁(yè)表的一部分或者全部?jī)?nèi)容??毂碜鳛轫?yè)表的緩存,其作用與頁(yè)表相似,同時(shí)提高了訪問(wèn)速率。(采用頁(yè)表關(guān)聯(lián)虛擬地址和物理地址時(shí),用戶程序通過(guò)快表,只需要訪問(wèn)一次 CPU 高速緩存就可以通過(guò)虛擬地址找到物理地址。)
采用快表的進(jìn)行地址轉(zhuǎn)換的流程:
① 根據(jù)虛擬地址中的頁(yè)號(hào)查快表;
② 如果該頁(yè)在快表中,直接從快表中讀取相應(yīng)的物理地址;
③ 如果該頁(yè)不在快表中,就訪問(wèn)內(nèi)存中的頁(yè)表,再?gòu)捻?yè)表中得到物理地址,同時(shí)將頁(yè)表中的該映射表項(xiàng)添加到快表中;
④ 當(dāng)快表填滿后,又要登記新頁(yè)時(shí),就按照一定的淘汰策略淘汰掉快表中的一個(gè)頁(yè)。
(2)多級(jí)頁(yè)表
① 單級(jí)頁(yè)表
② 2級(jí)頁(yè)表
?將頁(yè)表分為分為1024個(gè)表,每個(gè)表中包含1024個(gè)頁(yè)表項(xiàng),形成二級(jí)頁(yè)表。二級(jí)頁(yè)表結(jié)構(gòu)的虛擬地址結(jié)構(gòu)如下圖。
4.虛擬地址和物理地址
(1)虛擬地址的概念
虛擬地址:虛擬地址并不真實(shí)存在于計(jì)算機(jī)中。每個(gè)進(jìn)程都分配有自己的虛擬空間,而且只能訪問(wèn)自己被分配使用的空間。理論上,虛擬空間受物理內(nèi)存大小的限制,如給有4GB內(nèi)存,那么虛擬地址空間的地址范圍就應(yīng)該是0x00000000~0xFFFFFFFF。每個(gè)進(jìn)程都有自己獨(dú)立的虛擬地址空間。這樣每個(gè)進(jìn)程都能訪問(wèn)自己的地址空間,這樣做到了有效的隔離。
(2)物理地址的概念
物理地址指的是真實(shí)物理內(nèi)存中地址,即內(nèi)存地址寄存器中的地址。