內(nèi)存分頁(yè)
分段的好處是能產(chǎn)生連續(xù)的內(nèi)存空間,但是會(huì)出現(xiàn)大量?jī)?nèi)存碎片與內(nèi)存交換效率低的問(wèn)題
先思考一下怎么解決這兩個(gè)問(wèn)題,內(nèi)存碎片是由多個(gè)不連續(xù)的小物理內(nèi)存空間造成,如果把這些不連續(xù)的小物理內(nèi)存空間組合起來(lái),是不是解決了這個(gè)問(wèn)題?同樣的,內(nèi)存交換的時(shí)候我們保證交換的數(shù)據(jù)小,是不是能提高內(nèi)存交換的效率?
這個(gè)辦法就是內(nèi)存分頁(yè),分頁(yè)是把整個(gè)虛擬與物理空間切成一段段固定尺寸的大小,這樣一個(gè)連續(xù)并且尺寸固定的空間,我們叫頁(yè),在 Linux 下,每一頁(yè)的大小為4KB。(虛擬空間是指存儲(chǔ)一套虛擬地址的空間)
虛擬地址與物理地址是通過(guò)頁(yè)表來(lái)映射,虛擬空間內(nèi)的虛擬地址一定是連續(xù)的,物理地址不一定,但可以通過(guò)連續(xù)的虛擬地址把多個(gè)不連續(xù)的物理內(nèi)存組合使用。
而當(dāng)進(jìn)程訪問(wèn)的虛擬地址在頁(yè)表中查不到時(shí),系統(tǒng)會(huì)產(chǎn)生一個(gè)缺頁(yè)異常,進(jìn)入系統(tǒng)內(nèi)核空間分配物理內(nèi)存、更新進(jìn)程頁(yè)表,最后再返回用戶空間,恢復(fù)進(jìn)程的運(yùn)行。
分頁(yè)方式是如何解決內(nèi)存碎片與內(nèi)存交換效率慢的問(wèn)題呢??jī)?nèi)存碎片的解決:
因?yàn)槭褂脙?nèi)存的單位變成固定大小的頁(yè),所以每個(gè)程序的虛擬空間維護(hù)的也是連續(xù)的頁(yè)(虛擬地址),通過(guò)頁(yè)表再映射到物理內(nèi)存頁(yè),雖然映射的物理內(nèi)存頁(yè)不連續(xù),但是虛擬空間是連續(xù)的,可以讓它們組合起來(lái)使用,但這也只能解決外部?jī)?nèi)存碎片問(wèn)題,沒(méi)有解決內(nèi)部?jī)?nèi)碎片問(wèn)題,因?yàn)槊宽?yè)都有固定大小,可能某一頁(yè)只使用了部分,依然會(huì)造成一些浪費(fèi)。
內(nèi)存交換效率慢的解決:
之前說(shuō)過(guò),減少交換數(shù)據(jù)的大小,可以提高內(nèi)存交換效率,分頁(yè)方式是這樣解決的,如果內(nèi)存空間不夠時(shí),操作系統(tǒng)會(huì)把其他正在運(yùn)行的進(jìn)程中的「最近沒(méi)被使用」的內(nèi)存頁(yè)釋放掉,也就是加載到硬盤(pán),稱(chēng)為換出,一旦需要的時(shí)候再加載進(jìn)來(lái),稱(chēng)為換入。所以一次性寫(xiě)入硬盤(pán)的也只有一個(gè)頁(yè)或幾個(gè)頁(yè),內(nèi)存的交換效率自然就提升了。
分頁(yè)方式使加載程序的時(shí)候,不再需要一次性都把程序加載到物理內(nèi)存中。完全可以在進(jìn)行虛擬內(nèi)存和物理內(nèi)存的頁(yè)之間的映射之后,并不真的把頁(yè)加載到物理內(nèi)存里,而是只有在程序運(yùn)行中,需要用到對(duì)應(yīng)虛擬內(nèi)存頁(yè)里面的指令和數(shù)據(jù)時(shí),再加載到物理內(nèi)存里面去(用大白話說(shuō),當(dāng)你需要用到的時(shí)候才會(huì)去使用對(duì)應(yīng)的物理內(nèi)存)。
在內(nèi)存分頁(yè)方式下,虛擬地址和物理地址是如何映射的?
在分頁(yè)機(jī)制下,每個(gè)進(jìn)程都會(huì)分配一個(gè)頁(yè)表,虛擬地址會(huì)分為兩部分,頁(yè)號(hào)和頁(yè)內(nèi)偏移量,頁(yè)號(hào)作為頁(yè)表的索引,頁(yè)表包含物理頁(yè)每頁(yè)所在物理內(nèi)存的基地址,頁(yè)內(nèi)偏移量+物理內(nèi)存基地址就組成了物理內(nèi)存地址,如下圖所示
就是下面這幾步
頁(yè)號(hào)找到頁(yè)表中的頁(yè)項(xiàng)
獲取頁(yè)項(xiàng)的物理頁(yè)號(hào)基地址
偏移量+物理頁(yè)號(hào)基地址計(jì)算出物理內(nèi)存地址
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7233瀏覽量
90725 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3102瀏覽量
74878 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7025瀏覽量
124690 -
地址
+關(guān)注
關(guān)注
1文章
32瀏覽量
10942
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C語(yǔ)言malloc申請(qǐng)內(nèi)存時(shí)的碎片問(wèn)題

Linux內(nèi)核內(nèi)存規(guī)整總結(jié)

請(qǐng)問(wèn)mymalloc會(huì)產(chǎn)生內(nèi)存碎片嗎?
如何避免內(nèi)存碎片的產(chǎn)生
虛擬內(nèi)存是什么_虛擬內(nèi)存有什么用

基于線段樹(shù)的內(nèi)存管理方法

如何避免Linux的物理內(nèi)存碎片化

你知道linux kernel內(nèi)存碎片防治技術(shù)?
OPPO內(nèi)存反碎片化引擎的作業(yè)
探索內(nèi)存交換的新出路

FreeRTOS內(nèi)存碎片是怎么來(lái)的

什么是內(nèi)存碎片Linux

內(nèi)存分段是如何產(chǎn)生內(nèi)存碎片的

評(píng)論