簡體   English   中英

在C ++中使用緩沖區

[英]Use of Buffer in C++

我是c語言的新手,由Andrew Koenig和Barbara E. Moo通過Accelerated C ++學習。

我無法理解C ++中緩沖區的概念,因為這本書說: “無論要寫入多少個字符,大多數系統都會花費大量時間將字符寫入輸出設備。為避免響應寫入的開銷對於每個輸出請求,庫都使用緩沖區來累積要寫入的字符,並僅在必要時通過將其內容寫入輸出設備來刷新緩沖區,從而可以將多個輸出操作合並為一個寫入操作”。

為什么大多數系統會花費大量時間將字符寫入輸出設備? 這個緩沖區是什么,為什么需要它?為什么需要刷新緩沖區?

有多種原因導致系統花費大量時間進行I / O操作:設備可能很慢(硬盤驅動器),可能需要在寫入之前和/或之后執行各種操作,等等。

然后,緩沖區通過進行較大但較不頻繁的讀/寫操作來減少與設備的交互次數。 然后,它減少了執行該操作所需的開銷(在硬盤驅動器的情況下,您不希望頻繁寫入大塊數據,而不是頻繁寫入小塊數據,因為這會花費寫數據的位置,等等)。 。

而且,使用緩沖區,您甚至可以控制何時要執行I / O操作,這在特定情況下會很有用(例如,在實時應用程序中,您希望在執行I / O操作的同時避免正在運行代碼的時間限制部分,將數據存儲在緩沖區中,並且僅在退出代碼的時間限制部分后才執行I / O操作)。

為什么大多數系統會花費大量時間將字符寫入輸出設備?

由於大多數設備是通過總線與CPU分開的,因此跨設備發送數據要比寫入CPU寄存器或(緩存的)內存慢得多。 許多設備還涉及運動部件(旋轉盤或電動激光器等),它們又慢得多。

這個緩沖區是什么,為什么我們需要它?

我們可以非常快速地寫入單個字符,然后將它們全部批量發送到設備中,這是一個巨大的內存。 通常,這比單獨發送每個字符更有效(通常效率更高)。

例如,存儲設備通常一次只能讀取和寫入相當大的數據塊。 通常為幾千字節。 因此,編寫一個字符需要讀取一個塊,修改一個字符並寫回整個塊。 而刷新較大的緩沖區可能只需要將每個塊寫入一次。

為什么我們需要刷新緩沖區?

因為如果數據保留在緩沖區中,它將永遠不會到達設備。

例如,輸出設備可能是硬盤,寫入硬盤涉及到移動寫頭並等待磁盤旋轉到正確的位置。 對於寫入文件的每個字符,這樣做都會非常緩慢。

緩沖區是准備寫的字符隊列。 當隊列中有足夠的字符時,它們將在一個操作中全部寫入在一起。

某些設備運行緩慢,因此一次寫入一個字符效率不高。 寫入設備的有效方法是一次寫入更大的數據塊。 因此,緩沖區用於累積更多字符並將它們全部寫入一次寫入操作。

讓我們考慮將HDD作為輸出設備。 與RAM相比,寫入HDD非常慢。 在HDD上一次寫入大量數據要快於寫入許多小的數據塊。 緩沖區用於累積這些塊。 例如,它可能要等到您要求總共寫入1 MB的數據。 之后,緩沖區將刷新(寫入)到磁盤上。 所以緩沖區只是一個存儲

為什么大多數系統會花費大量時間將字符寫入輸出設備?

對於普通計算機,將任何內容寫入典型的輸出設備將比寫入內部易失性存儲器花費更長的時間。

這個緩沖區是什么,為什么我們需要它?

緩沖區是用於臨時存儲數據的臨時存儲。

為什么我們需要刷新緩沖區?

這是緩沖區的功能,在上面的鏈接中進行了描述。

我不熟悉這本書或報價,因此這可能無法回答您的確切觀點。

本質上,計算機非常快。 快速移動電子到該位置並執行計算等。 相比之下,輸入/輸出設備的速度要慢得多-磁盤需要轉動以便可以寫入或讀取表面的正確部分,屏幕需要一些時間才能使正確的部分以正確的顏色發光,等等。

但是,寫入輸出設備的大量開銷是花在寫入第一個字符(或字節,或其他)上的,而寫入另外幾個字符幾乎沒有額外的開銷-一旦磁盤位於第一個字節的正確位置,就可以在幾乎合適的位置放置下一個,依此類推; 人們不是一次真正地在屏幕上閱讀一個字符,他們傾向於閱讀單詞或整個句子,因此快速獲得屏幕上的第一個字母是不值得擔心的,您最好等到幾個字符再讀。

因此,有意義的是收集許多字節,字符或其他內容,然后一次全部寫入。 此過程稱為緩沖,將其中收集數據的內存區域稱為緩沖區。

將緩沖區中的數據寫入設備稱為刷新緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM