內(nèi)存分頁
分段的好處是能產(chǎn)生連續(xù)的內(nèi)存空間,但是會(huì)出現(xiàn)大量?jī)?nèi)存碎片與內(nèi)存交換效率低的問題
先思考一下怎么解決這兩個(gè)問題,內(nèi)存碎片是由多個(gè)不連續(xù)的小物理內(nèi)存空間造成,如果把這些不連續(xù)的小物理內(nèi)存空間組合起來,是不是解決了這個(gè)問題?同樣的,內(nèi)存交換的時(shí)候我們保證交換的數(shù)據(jù)小,是不是能提高內(nèi)存交換的效率?
這個(gè)辦法就是內(nèi)存分頁,分頁是把整個(gè)虛擬與物理空間切成一段段固定尺寸的大小,這樣一個(gè)連續(xù)并且尺寸固定的空間,我們叫頁,在 Linux 下,每一頁的大小為4KB。(虛擬空間是指存儲(chǔ)一套虛擬地址的空間)
虛擬地址與物理地址是通過頁表來映射,虛擬空間內(nèi)的虛擬地址一定是連續(xù)的,物理地址不一定,但可以通過連續(xù)的虛擬地址把多個(gè)不連續(xù)的物理內(nèi)存組合使用。

而當(dāng)進(jìn)程訪問的虛擬地址在頁表中查不到時(shí),系統(tǒng)會(huì)產(chǎn)生一個(gè)缺頁異常,進(jìn)入系統(tǒng)內(nèi)核空間分配物理內(nèi)存、更新進(jìn)程頁表,最后再返回用戶空間,恢復(fù)進(jìn)程的運(yùn)行。
分頁方式是如何解決內(nèi)存碎片與內(nèi)存交換效率慢的問題呢??jī)?nèi)存碎片的解決:
因?yàn)槭褂脙?nèi)存的單位變成固定大小的頁,所以每個(gè)程序的虛擬空間維護(hù)的也是連續(xù)的頁(虛擬地址),通過頁表再映射到物理內(nèi)存頁,雖然映射的物理內(nèi)存頁不連續(xù),但是虛擬空間是連續(xù)的,可以讓它們組合起來使用,但這也只能解決外部?jī)?nèi)存碎片問題,沒有解決內(nèi)部?jī)?nèi)碎片問題,因?yàn)槊宽摱加泄潭ù笮?,可能某一頁只使用了部分,依然?huì)造成一些浪費(fèi)。
內(nèi)存交換效率慢的解決:
之前說過,減少交換數(shù)據(jù)的大小,可以提高內(nèi)存交換效率,分頁方式是這樣解決的,如果內(nèi)存空間不夠時(shí),操作系統(tǒng)會(huì)把其他正在運(yùn)行的進(jìn)程中的「最近沒被使用」的內(nèi)存頁釋放掉,也就是加載到硬盤,稱為換出,一旦需要的時(shí)候再加載進(jìn)來,稱為換入。所以一次性寫入硬盤的也只有一個(gè)頁或幾個(gè)頁,內(nèi)存的交換效率自然就提升了。
分頁方式使加載程序的時(shí)候,不再需要一次性都把程序加載到物理內(nèi)存中。完全可以在進(jìn)行虛擬內(nèi)存和物理內(nèi)存的頁之間的映射之后,并不真的把頁加載到物理內(nèi)存里,而是只有在程序運(yùn)行中,需要用到對(duì)應(yīng)虛擬內(nèi)存頁里面的指令和數(shù)據(jù)時(shí),再加載到物理內(nèi)存里面去(用大白話說,當(dāng)你需要用到的時(shí)候才會(huì)去使用對(duì)應(yīng)的物理內(nèi)存)。
在內(nèi)存分頁方式下,虛擬地址和物理地址是如何映射的?
在分頁機(jī)制下,每個(gè)進(jìn)程都會(huì)分配一個(gè)頁表,虛擬地址會(huì)分為兩部分,頁號(hào)和頁內(nèi)偏移量,頁號(hào)作為頁表的索引,頁表包含物理頁每頁所在物理內(nèi)存的基地址,頁內(nèi)偏移量+物理內(nèi)存基地址就組成了物理內(nèi)存地址,如下圖所示

就是下面這幾步
頁號(hào)找到頁表中的頁項(xiàng)
獲取頁項(xiàng)的物理頁號(hào)基地址
偏移量+物理頁號(hào)基地址計(jì)算出物理內(nèi)存地址
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7347瀏覽量
94994 -
內(nèi)存
+關(guān)注
關(guān)注
9文章
3229瀏覽量
76486 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7431瀏覽量
129587 -
地址
+關(guān)注
關(guān)注
1文章
32瀏覽量
11240
發(fā)布評(píng)論請(qǐng)先 登錄
C語言malloc申請(qǐng)內(nèi)存時(shí)的碎片問題
Linux內(nèi)核內(nèi)存規(guī)整總結(jié)
請(qǐng)問mymalloc會(huì)產(chǎn)生內(nèi)存碎片嗎?
如何避免內(nèi)存碎片的產(chǎn)生
虛擬內(nèi)存是什么_虛擬內(nèi)存有什么用
基于線段樹的內(nèi)存管理方法
如何避免Linux的物理內(nèi)存碎片化
你知道linux kernel內(nèi)存碎片防治技術(shù)?
OPPO內(nèi)存反碎片化引擎的作業(yè)
探索內(nèi)存交換的新出路
什么是內(nèi)存碎片Linux
內(nèi)存分段是如何產(chǎn)生內(nèi)存碎片的
如何解決內(nèi)存碎片與內(nèi)存交換效率慢的問題
評(píng)論