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