
緩衝式 I/O
|
75
區塊大小
事實上,區塊的大小通常是 512、1,024、2,048 或 4,096 個位元組。
如表 3-1 所示,效能要獲得最大的提升,只需要所操作的資料團塊是區塊大小的整數倍
或是區塊大小的因數。那是因為,區塊是核心和硬體的共同語言。所以,採用區塊大小
的值或是可以對齊區塊的值,保證能夠進行對齊區塊的 I/O 要求,以及避免核心在內部
進行非必要的工作。
想知道特定裝置的區塊大小,只需要使用
stat()
系統呼叫(第 8 章會討論到)或
stat
(1)
命令。然而,事實上,你通常不需要知道實際的區塊大小。
為你的 I/O 操作挑選區塊大小的主要目標在於不要選到奇怪的大小,例如 1,130。Unix
從未使用過大小 1,130 位元組的區塊,為你的操作使用此類大小的區塊,會在首次送出
要求之後產生非對齊的 I/O。然而,選用區塊大小的整數倍或因數,就可以避免非對齊
的要求。只要你所選用的大小維持在與區塊對齊,效能就不會變差。較大的尺寸只會導
致系統呼叫變少的結果。
因此,進行 I/O 時最簡單的選擇,就是使用大尺寸的緩衝區,而且該尺寸是區塊大小的
倍數。例如 4,096 和 8,192 位元組就可以運作得很好。
所以使用大小 4 或 8KB 的團塊來進行所有的 I/O,一切都可以運作得很好?還沒有那麼
快。當然,問題在於程式很少會用到區塊。程式一般只處理到欄位(field)、 列 ( line)
以及字符(character),而不會處理到區塊之類的抽象概念。「用戶緩衝式」 I/O