[英]Why is buffered I/O faster than unbuffered I/O
在閱讀本文時 ,我找到了一個合理的答案,其中說:
案例1:直接寫入磁盤上的文件
100 times x 1 ms = 100 ms
我明白。 下一個,
案例3:在寫入磁盤上的文件之前在內存中緩沖
(100 times x 0.5 ms) + 1 ms = 51 ms
我不明白1毫秒。 將100個數據寫入磁盤和將1個數據寫入磁盤之間有什么區別? 為什么兩個都花費1毫秒?
光盤訪問(將數據傳輸到磁盤)不是逐字節發生的,而是以塊的形式發生。 因此,我們無法斷定寫入1
字節數據所需的時間是1
ms,那么x
字節的數據將花費x
ms。 它不是線性關系。
一次寫入磁盤的數據量取決於塊大小。 例如,如果光盤訪問花費您1毫秒,並且塊大小為512字節,則寫入1到512字節之間的大小將花費相同的成本,僅1毫秒。
所以,回到eqation,如果你有,比如要在每個opeartion寫入16個字節的數據進行20次迭代,那么,
time =( 20
次迭代* 1
ms)== 20
ms。
time =( 20
次迭代* 0.5
ms (緩沖時間) )+ 1
ms(一次性寫入)= 10
+ 1
== 11
ms。
這是因為光盤的物理工作原理。 他們可以使用更大的緩沖區(稱為頁面)並一次性保存它們。 如果您想要一直保存數據需要對一個頁面進行多次更改,如果使用緩沖區進行更改,則可以編輯快速訪問的內存,然后一次性保存所有內容。
他的例子是解釋經營成本。 為了將內存加載到數據,您有100次操作0.5秒的成本,然后您有一個更改光盤(IO操作),答案中沒有描述,並且可能不明顯,幾乎所有光盤都提供批量傳輸更改操作。 所以1 IO操作意味着1保存到光盤,不一定是1位保存(它可以是更多的數據)。
除此之外,數據僅以整個“塊”寫入磁盤。 塊通常是512字節。 即使您只更改塊內的單個字節,操作系統和磁盤也必須寫入所有512個字節。 如果在寫入之前更改塊中的所有512個字節,則實際寫入將不會比僅更改一個字節時慢。
事實上,OS和/或磁盤內的自動緩存確實在很大程度上避免了這個問題。 但是,每次“真正的”寫操作都需要從程序調用OS到操作系統,並且可能需要一直調用磁盤驅動程序。 這需要一些時間。 相比之下,在RAM中自己的進程內存中寫入char / byte / ...數組實際上幾乎沒有成本。
每次寫入1個字節時,每次寫入都需要:
對每個字節重復所有上述操作(特別是因為磁盤比內存慢幾個數量級)需要很多時間。
編寫整個數據扇區不再需要更新單個字節。
這就是為什么寫一個充滿數據的緩沖區比寫一系列單個字節要快得多。
還有其他開銷,如更新inode:
每次更新文件時,都會更新每個目錄和文件inode。
那些inode(簡稱)是磁盤上的其他扇區。 總的來說,每次修改文件時都會發生大量磁盤活動。
因此,僅修改文件一次而不是多次修改是節省時間的主要時間。 緩沖是用於最小化磁盤活動數量的技術。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.