內存分頁
分段的好處是能產生連續的內存空間,但是會出現大量內存碎片與內存交換效率低的問題
先思考一下怎么解決這兩個問題,內存碎片是由多個不連續的小物理內存空間造成,如果把這些不連續的小物理內存空間組合起來,是不是解決了這個問題?同樣的,內存交換的時候我們保證交換的數據小,是不是能提高內存交換的效率?
這個辦法就是內存分頁,分頁是把整個虛擬與物理空間切成一段段固定尺寸的大小,這樣一個連續并且尺寸固定的空間,我們叫頁,在 Linux 下,每一頁的大小為4KB。(虛擬空間是指存儲一套虛擬地址的空間)
虛擬地址與物理地址是通過頁表來映射,虛擬空間內的虛擬地址一定是連續的,物理地址不一定,但可以通過連續的虛擬地址把多個不連續的物理內存組合使用。
而當進程訪問的虛擬地址在頁表中查不到時,系統會產生一個缺頁異常,進入系統內核空間分配物理內存、更新進程頁表,最后再返回用戶空間,恢復進程的運行。
分頁方式是如何解決內存碎片與內存交換效率慢的問題呢?內存碎片的解決:
因為使用內存的單位變成固定大小的頁,所以每個程序的虛擬空間維護的也是連續的頁(虛擬地址),通過頁表再映射到物理內存頁,雖然映射的物理內存頁不連續,但是虛擬空間是連續的,可以讓它們組合起來使用,但這也只能解決外部內存碎片問題,沒有解決內部內碎片問題,因為每頁都有固定大小,可能某一頁只使用了部分,依然會造成一些浪費。
內存交換效率慢的解決:
之前說過,減少交換數據的大小,可以提高內存交換效率,分頁方式是這樣解決的,如果內存空間不夠時,操作系統會把其他正在運行的進程中的「最近沒被使用」的內存頁釋放掉,也就是加載到硬盤,稱為換出,一旦需要的時候再加載進來,稱為換入。所以一次性寫入硬盤的也只有一個頁或幾個頁,內存的交換效率自然就提升了。
分頁方式使加載程序的時候,不再需要一次性都把程序加載到物理內存中。完全可以在進行虛擬內存和物理內存的頁之間的映射之后,并不真的把頁加載到物理內存里,而是只有在程序運行中,需要用到對應虛擬內存頁里面的指令和數據時,再加載到物理內存里面去(用大白話說,當你需要用到的時候才會去使用對應的物理內存)。
在內存分頁方式下,虛擬地址和物理地址是如何映射的?
在分頁機制下,每個進程都會分配一個頁表,虛擬地址會分為兩部分,頁號和頁內偏移量,頁號作為頁表的索引,頁表包含物理頁每頁所在物理內存的基地址,頁內偏移量+物理內存基地址就組成了物理內存地址,如下圖所示
就是下面這幾步
頁號找到頁表中的頁項
獲取頁項的物理頁號基地址
偏移量+物理頁號基地址計算出物理內存地址
-
數據
+關注
關注
8文章
7139瀏覽量
89574 -
內存
+關注
關注
8文章
3055瀏覽量
74327 -
操作系統
+關注
關注
37文章
6892瀏覽量
123742 -
地址
+關注
關注
1文章
32瀏覽量
10816
發布評論請先 登錄
相關推薦
請問mymalloc會產生內存碎片嗎?
如何避免內存碎片的產生
虛擬內存是什么_虛擬內存有什么用
![虛擬<b class='flag-5'>內存</b>是什么_虛擬<b class='flag-5'>內存</b>有什么用](https://file1.elecfans.com//web2/M00/A6/DA/wKgZomUMQN-AVZnTAABf1kokxy8156.png)
如何避免Linux的物理內存碎片化
![如何避免Linux的物理<b class='flag-5'>內存</b><b class='flag-5'>碎片</b>化](https://file.elecfans.com/web1/M00/4F/C9/o4YBAFri43yAUBH3AAAeiuQDZ2o967.png)
你知道linux kernel內存碎片防治技術?
OPPO內存反碎片化引擎的作業
內存分段是如何產生內存碎片的
![<b class='flag-5'>內存</b>分段是如何產生<b class='flag-5'>內存</b><b class='flag-5'>碎片</b>的](https://file1.elecfans.com/web2/M00/A9/30/wKgZomUjuQKAXw7pAAB-qkHaaBU761.jpg)
評論