無緩衝i/o :不是核心不提供緩衝,而是對於使用者層來說,沒有提供快取,而對核心來說還是有快取的
資料:資料流->核心快取->磁碟
有緩衝i/o:是指在使用者層上再建立了一層快取區(流快取區),目的是為了減少read,write等系統呼叫的使用次數,降低系統開銷。
資料:資料流->流快取區->核心快取->磁碟
e.g當用fwrite函式網磁碟寫資料時,先把資料寫入流緩衝區中,當達到一定條件,比如流緩衝區滿了,或重新整理流緩衝,這時候才會把資料一次送往核心提供的塊緩衝,再經塊緩衝寫入磁碟。(雙重緩衝)
/*標準io就是帶快取的io,提供了三種型別的快取
全快取:當填滿標準io快取後才執行io操作,磁碟上的檔案通常都是全快取的
行快取:當輸入輸出遇到換行符或快取滿時,才執行io操作,stdin和stdout通常是行快取的
無快取:stderr通常是無快取的,因為它必須盡快輸出
是什麼樣的緩衝跟使用那個函式沒有關係
,而跟你讀寫什麼型別的檔案有關係
. 帶
快取的檔案操作時標準c庫的實現,第一次呼叫帶快取的檔案操作函式時,標準庫會自動分配記憶體並且讀出一段固定大小的記憶體儲存在快取中。以後每次的讀寫操作並不是針對硬碟上的檔案直接進行的,而是針對記憶體中的快取的。
思考:為什麼總是要將資料從使用者快取區弄到核心緩衝區或者相反呢?
核心緩衝存在的價值: 使用者是執行在使用者空間的,不能直接操作核心緩衝區的資料。使用者進行到系統呼叫時,會由使用者態變到核心態,待核心使用完後再變到使用者態。
/*摘錄:
應
用緩衝技術能很明顯的提高系統效率。核心與外圍裝置的資料交換,核心與使用者空間的資料交換都是比較費時的,使用緩衝區就是為了優化這些費時的操作。其實核心到使用者空間的操作本身是不buffer的,是由i/o庫用buffer來優化了這個操作。比如read本來從核心讀取資料時是比較費時的,所以一次取出一塊,以避免多次陷入核心。
應用核心緩衝區的 主要思想就是一次讀入大量的資料放在緩衝區,需要的時候從緩衝區取得資料
。管理員模式和使用者模式之間的切換需要消耗時間,但相比之下,磁碟的i/o操作消耗的時間更多,為了提高效率,核心也使用緩衝區技術來提高對磁碟的訪問速度。
磁碟是資料塊 的集合,核心會對磁碟上的資料塊做緩衝。核心將磁碟上的資料塊複製到核心緩衝區中,當乙個使用者空間中的程序要從磁碟上讀資料時,核心一般不直接讀磁碟,而 是將核心緩衝區中的資料複製到程序的緩衝區中。當程序所要求的資料塊不在核心緩衝區時,核心會把相應的資料塊加入到請求佇列,然後把該程序掛起,接著為其 他程序服務。一段時間之後(其實很短的時間),核心把相應的資料塊從磁碟讀到核心緩衝區,然後再把資料複製到程序的緩衝區中,最後喚醒被掛起的程序
。 注:理解核心緩衝區技術的原理有助於更好的掌握系統呼叫read&write,read把資料從核心緩衝區複製到程序緩衝區,write把資料從程序緩衝區複製到核心緩衝區,它們不等價於資料在核心緩衝區和磁碟之間的交換。
從理論上講,核心可以在任何時候寫磁碟,但並不是所有的write操作都會導致核心的寫動作。核心會把要寫的資料暫時存在緩衝區中,積累到一定數量後再一 次寫入。有時會導致意外情況,比如斷電,核心還來不及把核心緩衝區中的資料寫道磁碟上,這些更新的資料就會丟失。
應用核心緩衝技術導致的結果是:提高了磁碟的i/o效率;優化了磁碟的寫操作;需要及時的將緩衝資料寫到磁碟。
緩衝 與 無緩衝
先看下面的程式 在上面的程式中printf函式列印的字串最後沒有帶換行符,而且最後呼叫了 exit 函式,這導致了最後沒有列印出 hello world 下面先介紹幾種緩衝機制 1 全緩衝 全緩衝指的是系統在填滿標準io緩衝區之後才進行實際的io操作 注意,對於駐留在磁碟上的檔案來說通常是由標準io...
無緩衝和帶緩衝channel的區別
常規定義的channel都是預設不帶緩衝的,如下 所示 package main import fmt func main 執行上述 會產生乙個錯誤 因為在預設不帶緩衝的channel中,每乙個傳送者與接收者都會阻塞當前執行緒,只有當接受者與傳送者都準備就緒了,channel才能正常使用,正確的使用...
標準I O緩衝 全緩衝 行緩衝 無緩衝
說明 我只對網路資源進行了整合,方便學習 基於流的操作最終會呼叫read或者write函式進行i o操作。為了使程式的執行效率最高,流物件通常會提供緩衝區,以減少呼叫系統i o庫函式的次數。基於流的i o提供以下3種緩衝 全緩衝 直到緩衝區被填滿,才呼叫系統i o函式。對於讀操作來說,直到讀入的內容...