天天看點

buffer_head和bio

buffer_head完全按照裝置塊來進行io,塊大小取決于裝置但是普遍比頁面小,bh的中繼資料比率開銷過大,bio則按照頁面大小進行io,然而一個bio中可以包含多個頁面,是以聚集的基于page的io吞吐量更大些,這就好比用桶提水比用湯勺舀水效率高一樣。是以2.6核心普遍使用bio代替了bh,然而傳統的bh并沒有消失,隻是它完全用bio來實作了,在讀取小資料的時候,基于裝置塊來讀取還是很可取的,是以核心幹脆設計出一個 bh_lru緩存結構體來緩存8個最近使用并且猜測還将被使用的bh,這可能是一些塊裝置的中繼資料。在2.6核心中,bh退化成了一個接口層,雖然2.6核心完全使用了基于page的塊io,但是卻并沒有喪失基于塊映射io的高效性,隻是這個工作交給了更底層的塊裝置驅動程式來做了,最終驅動程式還是成塊成塊地來讀寫資料的...早先對于bh來說,每一個塊都要有一個bh結構體來描述,如果寫一個很大的資料,就需要很多的bh連結成一個鍊,然後一個循環将它們全部寫入裝置,如果是bio的,使用mpage機制可以盡可能多地搜集很多的page,然後交給更底層的驅動。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271154

繼續閱讀