
第三章
緩衝式 I/O
第 1 章所提到的
區塊
(
block
)是一個抽象概念,代表一個檔案系統的最小儲存單位。核
心內部,所有檔案系統的操作皆以區塊為單位。的確,區塊是 I/O(輸出入)的共同語
言。因此,I/O 操作所處理的資料量不得小於區塊的大小或是區塊大小的整數倍。如果
你只想要讀取一個位元組,那就太糟糕了:你將必須讀取一個整個區塊。若想要寫出大
小 4.5 個區塊的資料呢?你將需要寫出 5 個區塊,這意味著,在它的整個區塊中只有部
分的區塊會被讀取,而且即使只有一半的區塊遭到修改,仍必須寫回一整個區塊。
如你所見,這麼做所導致的問題是:對部分區塊進行操作很沒有效率。作業系統必須透
過讓一切操作發生在與區塊對齊的邊界上,以及上取整數(round up)到下一個最大區
塊來修正你的 I/O。不幸的是,用戶空間程式的撰寫方式通常不是這樣。多數應用程式
所操作的是較高階的抽象概念,例如欄位以及字串,其大小不斷變化而且不受區塊大小
的影響。最壞的情況下,用戶空間應用程式可能一次只讀寫一個位元組!這會造成很大
的浪費。儘管只有一個位元組要寫出,但是實際上所寫出的是一整個區塊。
讀取操作所需要進行的系統呼叫次數增加時,會導致效能變差;例如,是讀取一個位元
組 1024 次,而不是一次讀取 1024 個位元組。
用戶緩衝式輸出入
(
user-buffered I/O
)
是此類效能問題的解決方案,它讓應用程式得以按自己的意思讀寫資料,但是實際的
I/O 操作卻以檔案系統的區塊大小為單位。
用戶緩衝式 I/O
必須對正規檔案發出許多小型 ...