翻譯并篡改更新自LWN.NET 2013年8月的一篇文章刽漂。
通常眨层,內(nèi)核開發(fā)人員更傾向于設(shè)計(jì)可讀性和可維護(hù)性高的數(shù)據(jù)結(jié)構(gòu)锁右。當(dāng)人們理解一段代碼使用的數(shù)據(jù)結(jié)構(gòu)時(shí),對代碼本身的理解通常就不會遙遠(yuǎn)很魂。因此扎酷,內(nèi)核使用最頻繁的數(shù)據(jù)結(jié)構(gòu)之一也是其可理解性最差的之一,這個(gè)事實(shí)可能會令人驚訝遏匆。這個(gè)數(shù)據(jù)結(jié)構(gòu)就是struct page法挨,代表物理內(nèi)存的頁面。最近的一個(gè)補(bǔ)丁集幅聘,使struct page更加復(fù)雜凡纳,當(dāng)然,這也為快速概述如何使用此結(jié)構(gòu)提供了契機(jī)喊暖。
在大多數(shù)Linux系統(tǒng)上惫企,一頁物理內(nèi)存包含4096個(gè)字節(jié)撕瞧,這意味著典型的系統(tǒng)包含數(shù)百萬個(gè)頁面陵叽。維護(hù)每一個(gè)頁面都需要一個(gè)struct page狞尔,這給struct page帶來了巨大壓力,因?yàn)樵趕truct page中每增加1個(gè)byte巩掺,大概都會提高上兆字節(jié)的內(nèi)存使用量偏序。這就造成了一種情況,即如果可以避免使struct page變大胖替,幾乎所有的技巧都是合理的研儒。
Enter Joonsoo Kim發(fā)布了一個(gè)補(bǔ)丁集,旨在將更多信息壓縮到struct page中独令,但不增加其大小端朵。特別是,他擔(dān)心struct slab占用的空間燃箭,該空間由slab內(nèi)存分配器使用(可以在內(nèi)核中配置的三個(gè)分配器之一冲呢,其他分配器稱為SLUB和SLOB)。關(guān)于slab的我就不翻譯了招狸,相關(guān)的slab單元也大量使用【赐兀現(xiàn)在作為編輯我的系統(tǒng)上的/proc/slabinfo僅顯示ext4 inode高速緩存的活動slab單元就超過28,000個(gè)。減少空間使用將是值得歡迎的裙戏; Joonsoo認(rèn)為可以做到這一點(diǎn)-通過將struct slab的內(nèi)容折疊到表示包含slab本身的內(nèi)存的頁面結(jié)構(gòu)中乘凸。