爲何linux kernel默認的頁面大小是4K,而不是4M或8M?

相信不少人在看內核內存管理部分的時候,都有這樣一個疑問,爲何物理頁面的大小選擇4K,而不是大一些或者小一些呢?
這個問題沒有固定的答案,仁者見仁智者見智,每一個人的關注點不同。因此這篇文章不是說給出一個固定的答案,更多的只是一篇討論性的文章。
內核的頁面大小首先跟CPU有關,不一樣的架構支持的頁面大小也不相同,但有一個共同點,那就是確定支持4K的頁面大小。爲何處理器在設計的時候會選擇4K,而不是其餘,這個只有熟悉CPU歷史的人才能給出答案,本人才疏學淺,回答不上來,有興趣的本身找一找。固然處理器的設計者在考慮頁面大小的時候,也不是憑空就選擇了這個大小,除了歷史因素,確定綜合了考慮了大頁面、小頁面的優缺點,因此這裏主要列出這些優缺點,經過這些比較來發現內核爲何將默認的頁面大小選擇爲4K。
如今更多爭論的是大頁面仍是維持如今的頁面4K大小,因此小頁面的狀況咱們就不考慮了,經過比較前二者也能夠得出小頁面的狀況。支持大頁面的人一般認爲大頁面有如下好處:
一、減少page table佔用的內存。
假設內存必定的話,頁面大小越大,管理頁面佔用的內存也越小。如今內核中每一個頁面假設是4K的話,這4K不是全均可用,還有一部分用做struct page(大約是64bytes),若是是2.6.32的話,每一個頁還有一個page_cgroup(32bytes),也就是說內存大小的2.3%(96/4096)會被內核固定使用。若是頁面大小是4M的話,這個比率大約是0.0006%。假設內存時64G的話,頁面大小是4K,管理頁佔用的內存爲1.472G,而頁面大小是4M,管理頁面佔用的內存爲0.393M。因此頁面比較大時,節省的內存比較多。
二、提升TLB的命中率
每次訪問內存的時候,都要將虛擬地址轉換爲物理地址,若是每次都訪問頁表的話,消耗比較大。所以,一般使用TLB來加速這個過程。可是TLB的能夠直接轉換的地址範圍是有限的(具體就是項數乘以頁面大小),一旦出現TLB miss,這時就必須去頁表中查找。因此,若是是大頁面的話,一樣TLB項數的狀況下,能夠跟蹤更大的內存。
三、提升磁盤I/O
咱們知道在訪問磁盤時,最耗時的操做就是查找寫入盤區的起始位置,也就是在磁盤盤片上將讀寫頭置於正確的位置上。因此若是是大頁面的話,能夠減小寫入磁盤的次數。好比要寫入4M的緩存,頁面大小是4M的話,只需寫入1次,而頁面大小是4K的話,則須要寫入4次。
四、提供緩存利用率
若是是大頁面的話,能夠減小訪問夥伴系統的次數。調用夥伴系統的操做隊系統的數據和指令高速緩存有至關的影響。內核越浪費這些資源,這些資源對用戶空間進程就越不可用。
除了上面提升的好處,確定還有的好處,就不一一列舉了。那既然有這麼好處,並且如今內存愈來愈大,爲何不更多地採用大頁面呢?好比4M?
軟件開發中,歷來不會有很是完美的方案,都是在優缺點之間找到平衡點。一樣,大頁面有這樣那樣的好處,缺點也很明顯。
一、最大的問題就是內存浪費,並且這個問題很是嚴重。好比這時要分配的內存是4M+1byte,這時須要兩個頁面才能知足分配的須要,這個時候浪費的內存爲4M-1byte。若是頁面是4K的話,浪費的內存數量爲4k-1byte。頁面太大,可能致使每一個頁面都只使用了部分空間,剩餘的空間就被浪費了。固然對於數據庫這樣的系統來講,頁面越大會越好,可是內核要考慮到通用的狀況,而不是專一於特殊的應用場景。再好比,如今系統都是隻分配虛擬地址空間,虛擬地址空間只有在真正被訪問的時候,才映射物理頁面,並且爲了減小物理頁面的浪費,對不訪問的部分,則不做映射。若是頁面太大,在映射很小的部分時,分配的內存會越大,浪費也就越大。系統在運行時,會頻繁地請求內存頁的操做,這樣致使潛在的浪費會很是嚴重。這樣的浪費會徹底抵消減少page table的優點。
二、頁面太大,會致使大量的內存碎片。由於底層的內存管理是以頁面爲單位。若是系統運行了很長時間,空閒的內存不少,可是連續的內存塊都小於要分配的頁面數。這時能夠經過移動內存塊或者利用swap來獲取可用內存,可是會致使分配內存的操做很慢,這種慢會造成惡性循環,嚴重影響系統的性能。若是是小頁面的話,內存的利用會比較緊湊,分配頁面時須要的連續內存塊的大小不像大頁面那樣須要的那麼大。
三、若是CPU崩潰,TLB能夠訪問的內存越大,對系統的影響也越大。這時一把雙刃劍,大頁面能夠提供TLB訪問的內存數量,可是CPU崩潰時,會致使不少內存訪問要去頁表中請求物理地址。
四、兼容性問題。X86處理器支持的頁面大小隻有4K,因此若是頁面過大的話,會致使兼容性問題。
五、若是頁面太大,在將內存頁換出到swap分區時,須要換出的內存也就越大,會影響性能。
總之,這個頁面大小4K是在計算機發展過程當中選擇的,也是在實踐中通過檢驗的,如今看來這個頁面是合適的。
若是你仍是想找到更多的證聽說服本身的話,能夠看看Linus Torvalds是怎麼解釋這個問題的:
http://yarchive.net/comp/linux/page_sizes.htmlhtml

相關文章
相關標籤/搜索