之前對python的標準輸入輸出關註不多,所以在碰到flush的時候有了諸多疑惑。 本文記錄了和flush方法相關的緩衝的相關內容,供學習參考。 數據緩衝 在電腦科學中,數據緩衝(data buffer)是一個當數據需要從一個地方移到另一個地方時,用來暫時保存數據的物理區域。常見的情況是,當輸入數 ...
之前對python的標準輸入輸出關註不多,所以在碰到flush的時候有了諸多疑惑。
本文記錄了和flush方法相關的緩衝的相關內容,供學習參考。
數據緩衝
在電腦科學中,數據緩衝(data buffer)是一個當數據需要從一個地方移到另一個地方時,用來暫時保存數據的物理區域。常見的情況是,當輸入數據(例如從麥克風)或者在輸出數據到輸出設備(例如揚聲器)之前,數據會被存儲到buffer中。不過,在電腦程式之間交換數據也會使用到buffer。可以將其與電信通信中的buffer進行對比。緩衝可以通過硬體中固定的存儲位置實現,也可以在軟體中利用虛擬的數據緩衝來實現——只要將其指向一個在物理存儲設備上的地址就可以。在所有情況下,存儲在數據緩衝中的數據都存儲在物理存儲介質中。大部分的緩衝應用在軟體中,一般使用RAM來存儲臨時數據,因為它相較硬碟而言有更快的存取速度。緩衝經常用在接收數據和處理數據的速度不一樣的場景,或者接收、處理數據速度可變的場景,例如印表機隊列以及線上視頻流。
為了適應需要考慮時序的場景,緩衝在記憶體中使用了隊列實現(FIFO)的演算法,以一種速率將數據寫入隊列的同時,以另外一種速率讀數據。
應用
緩衝常用來作為IO和硬體間的連接(conjunction),例如硬碟,從網路中發送或者接收數據,或是在揚聲器上播放音頻。這和過山車前排的長隊是一樣的。游客來玩過山車的頻率通常是未知且變化的,但是過山車來了以後能夠承載很大一批游客(load people in bursts)。排隊的區域就像緩衝一樣——給游客們等待過山車的一個臨時的空間。一般而言,緩衝用FIFO的方法實現,然後按照數據輸入的順序對其進行輸出。
緩衝能夠通過允許同步操作增加應用的性能,例如更快速的文件讀寫,而不是在系統對硬體子系統存取數據時形成阻塞等,取而代之的是,操作系統能夠馬上返回正確的介面調用結果,允許應用在內核還在後臺進行磁碟操作的同時繼續工作。
緩衝帶來的益處還包括當應用在讀寫的數據塊大小與硬碟子系統的塊大小不一致時,緩衝可以用來聚集許多的小數據塊的讀寫操作,有時能夠完全避免針對硬碟的存取操作,以此提高執行效率。
Buffer versus cache
高速緩存通常也作為緩衝區,反之亦然。但是,高速緩存運行的前提是相同的數據將被多次讀取、寫入的數據很快就會被讀取,亦或是有很大概率進行多次讀取,或者多次寫入並以此形成一個較大的塊。他們唯一的目的是減少對底層緩存的訪問。緩存通常被設計為一個不可見的抽象層。
“磁碟高速緩存”或“文件高速緩存”保留數據中包含的統計信息,併在回寫模式下,在超時期限內提交數據。緩衝沒有這個用途。
緩衝區主要用於輸入,輸出,有時是臨時的數據存儲,這些數據可以是其他介質之間的路徑,也可以是在順序寫入(或讀取)數據之前以非順序方式修改的數據。
Buffered vs unbuffered IO
只要在繼續之前能確保輸出已被寫入,就可以使用無緩衝的輸出。一個例子是C runtime library中的標準錯誤 - 預設情況下這通常是無緩衝的。由於錯誤不常發生,所以希望立即知道這些錯誤。另一方面,標準輸出被緩衝,因為預設情況下它有更多的數據通過它。
另一個例子是日誌庫。如果你的日誌消息被保存在你的進程中的緩衝區中,並且你的進程轉儲了核心(core dump),那麼輸出很有可能永遠不會被寫入。
另外,這不僅僅是最小化系統調用,還有最小化磁碟I / O。假設一個程式一次讀取一個位元組的文件,使用無緩衝輸入時,不管怎樣都必須讀取整個數據塊(磁碟硬體本身可能有緩衝區,但仍然要用到磁碟控制器,這將比記憶體訪問慢得多)。
而通過緩衝,整個塊被一次性地讀入緩衝區,然後單個位元組從(記憶體中,超級快)緩衝區傳遞給你。
sys.stdout.flush方法
python的標準輸出是被緩衝的(buffered),意味著在輸出到終端之前,會收集一些數據,寫入標準輸出中。調用sys.stdout.flush()方法會強制地清空buffer,會將buffer中的所有數據輸出到終端中,即便通常情況下會在清空緩衝區之前等待。
本文編譯自wikipedia和stackoverflow,錯誤之處歡迎指正~
參考資料:
Usage of sys.stdout.flush() method
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO
Python StringIO模塊實現在記憶體緩衝區中讀寫數據
記憶體緩衝區解析