IO緩衝區管理的實例詳解
Linux系統IO中write原型為 ssize_t write(int filedes, const void * buff, size_t nbytes) ;
#當呼叫write寫資料的時候,呼叫完成後write直接返回,但是磁碟是個慢速設備,作業系統會將資料保存在核心中的緩衝區中,並負責異步地將資料寫至磁碟。當然如果此時系統宕機了則會遺失資料。 write是系統調用,每次調用都會陷入內核,所以選取一個合適的塊長度buffsize,並儘量減少它的調用可以優化效率。在ANSI C的標準IO中我們呼叫printf/fprintf/fputs等會以流的方式進行處理,我們只需要寫入流中,而不用像write一樣選擇一個buffsize,因為標準IO庫幫我們處理了很多細節,例如緩衝區分配,以優化長度執行IO等。這樣的話就會減少wirte/read系統呼叫的數量,提高效率。但同時會引入另一個問題:資料拷貝,例如使用函數fgets和fputs時,通常需要經過兩次緩衝區:一次是標準IO緩衝區,還有一次是呼叫read和write的核心緩衝區。但總的來說使用標準IO相對於系統IO來說介面簡單,且效率相當。
標準IO提供了三種類型的緩衝區:全緩存,行緩存和不帶緩存,全緩存只有在緩衝區滿時才會主動flush,通常用在對一個磁碟檔案IO。行緩存在緩衝區中遇到換行符就會flush,還有一種情況是需要從標準輸入輸出得到輸入資料時也會flush緩衝區,行緩存一般用在交互的終端中。不含快取則相當於直接 write系統呼叫輸出,標準出錯流stderr通常是不含快取的,這就使得出錯訊息可以盡快顯示出來。除了預設的flush條件外,明確呼叫fflush函數和程式正常終止時也會flush緩衝區。我們可以使用setbuf/setvbuf來更改預設的緩衝區長度,請參閱APUE 5.4節。
在使用標準IO的程式中,當我們將一個標準輸出重新定向到一個檔案時,會將行緩存變成全緩存,在某些情況下可能會導致有些非預期錯誤,例如呼叫printf(“*****\n”)時,當以互動方式執行程式時,會正常輸出。但是當將標準輸出重新定向到一個檔案時,緩衝區區變成全緩存,printf就不會正常輸出,該行資料仍在緩衝區中。如果此時再fork一個子進程,資料空間被複製到子進程中時,該緩衝區資料也被複製到子進程中。接著在子行程中如果輸出則會刷新先前在緩衝區的內容,產生一些非預期的輸出。
在網路程式設計中,應該直接使用系統IO,標準IO為提升效能而引入緩衝機制增加了網路應用程式的複雜性。並且,某種意義上說標準IO流是全雙工的,能同時執行輸入和輸出,然而對流的限制和對套接字的限制,有時會互相衝突。 (參見CSAPP P611)
某些高階的網路庫中(比如說muduo函式庫)在使用系統IO的基礎上會建立自己的緩衝區,幫助使用者屏蔽系統IO的某些不便,例如呼叫write發送大量資料的時候,發送緩衝區滿時需要應用層等待,read接收資料的時候黏包和資料接受的緩慢。當增加應用層緩衝區後,由網路庫處理這些實作細節,簡化使用者操作。
Linux也提供了零拷貝技術來減少記憶體拷貝,進而提升效率,我們知道利用read/write從磁碟發送資料到網卡會經過四次拷貝操作:當應用程式需要存取某塊資料的時候,作業系統核心會先檢查這塊資料是不是因為前一次對相同檔案的存取而已經被存放在作業系統核心位址空間的緩衝區內,如果在核心緩衝區中找不到這塊數據,Linux作業系統核心會先將這塊資料從磁碟讀出來放到作業系統核心的緩衝區。如果這個資料讀取操作是由DMA 完成的,那麼在DMA 進行資料讀取的這一過程中,CPU 只需要進行緩衝區管理,以及建立和處理DMA ,除此之外,CPU 不需要再做更多的事情,DMA 執行完資料讀取操作之後,會通知作業系統做進一步的處理。 Linux 作業系統會根據read系統呼叫指定的應用程式位址空間的位址,把這塊資料存放到請求這塊資料的應用程式的位址空間去,待使用者對資料完成操作後,作業系統需要將資料再一次從使用者應用程式位址空間的緩衝區拷貝到與網路堆疊相關的核心緩衝區中去,這個過程也是需要佔用CPU 的。資料拷貝作業結束以後,資料會被打包,然後傳送到網路介面卡上去。從上面的描述可以看出,在這種傳統的資料傳輸過程中,資料至少發生了四次拷貝操作,即便是使用了 DMA 來進行與硬體的通訊,CPU 仍然需要存取資料兩次。
(ps:我記得之前看過一個面試題說是printf輸出過程經過幾次緩衝區,現在大家明白了吧!)
使用零拷貝技術可以避免資料在系統核心位址空間的緩衝區和使用者應用程式位址空間的緩衝區進行拷貝。有時候,應用程式在資料傳輸的過程中不需要對資料進行訪問,傳輸的資料可以不用複製到使用者應用區,直接透過核心傳送到網路卡就可以,這樣可以提高效能,而此時就需要零拷貝技術。 linux下可以用mmap,sendfile,splice實作零拷貝。
以上是IO緩衝區管理的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Discuz後台登入問題解決方法大揭秘,需要具體程式碼範例隨著網路的快速發展,網站建置變得越來越普遍,而Discuz作為一款常用的論壇建站系統,受到了許多站長的青睞。然而,正是因為其功能強大,有時候我們在使用Discuz的過程中會遇到一些問題,例如後台登入問題。今天,我們就來大揭秘Discuz後台登入問題的解決方法,並且提供具體的程式碼範例,希望能幫助到有需要

如何利用Redis實現分散式事務管理引言:隨著網際網路的快速發展,分散式系統的使用越來越廣泛。在分散式系統中,事務管理是一項重要的挑戰。傳統的事務管理方式在分散式系統中難以實現,且效率低。而利用Redis的特性,我們可以輕鬆實現分散式事務管理,提高系統的效能和可靠性。一、Redis簡介Redis是一種基於記憶體的資料儲存系統,具有高效的讀寫效能和豐富的數據

WordPress後台亂碼煩惱?試試這些解決方案,需要具體程式碼範例隨著WordPress在網站建置中的廣泛應用,許多用戶可能會遇到WordPress後台亂碼的問題。這種問題會導致後台管理介面顯示亂碼,對使用者的使用帶來極大困擾。本文將介紹一些常見的解決方案,幫助使用者解決WordPress後台亂碼的煩惱。修改wp-config.php檔案開啟wp-config.

如何實現Java中的學生成績管理功能?在現代教育系統中,學生成績管理是一項非常重要的任務。透過對學生成績的管理,學校能夠更好地監測學生的學習進度、了解他們的弱點和優勢,並根據這些資訊做出更有針對性的教學計劃。在這篇文章中,我們將討論如何使用Java程式語言來實現學生成績管理功能。首先,我們需要確定學生成績的資料結構。通常,學生成績可以被表示為一個包含學生訊息

Laravel擴充包管理:輕鬆整合第三方程式碼和功能引言:在Laravel開發中,我們經常使用第三方程式碼和功能來提高專案的效率和穩定性。而Laravel擴充包管理系統讓我們可以輕鬆整合這些第三方程式碼和功能,使得我們的開發工作更加便利和有效率。本文將介紹Laravel擴充包管理的基本概念和使用方法,並透過一些實際的程式碼範例來幫助讀者更好地理解和應用。什麼是Lara

標題:Discuz後台帳號登入異常,如何處理?當你使用Discuz論壇系統的後台管理時,有時候可能會遇到帳號登入異常的情況。這可能是由於多種原因導致的,可能是密碼錯誤、帳號被封鎖、網路連線問題等。在遇到這種情況時,我們需要透過簡單的排查和處理來解決這個問題。檢查帳號和密碼是否正確:首先,確認你輸入的帳號和密碼是否正確。登入時,請確保大小寫輸入正確,密碼是否

我們在使用win10系統的時候,使用滑鼠去右鍵桌面或是右鍵選單的時候,發現選單等都打不開,無法正常的去使用電腦了,這時候就需要恢復系統來解決問題。 win10右鍵選單管理打不開:1、先開啟我們的控制面板,然後點選。 2、然後點選安全性和維護下的。 3.再點擊右側的來恢復系統即可。 4.如果還是無法使用,是看是否是滑鼠本身出了問題。 5.如果確定滑鼠沒有問題的話,按下+,輸入。 6.執行完畢後,重啟電腦即可。

大家好,今天讓我們來聊聊Linux零拷貝技術。我們將以sendfile系統呼叫作為切入點,深入探討零拷貝技術的基本原理。零拷貝技術的核心思想是盡量減少資料在記憶體之間的複製,透過優化資料傳輸路徑,提高資料傳輸的效率和效能。 1.零拷貝技術簡介Linux零拷貝技術是一種用於最佳化資料傳輸的技術,透過減少資料在內核態和使用者態之間的複製次數,進而提高資料傳輸的效率。在資料傳輸的過程中,通常需要將資料從核心緩衝區複製到應用程式的緩衝區,再從應用程式緩衝區複製到網路裝置的緩衝區,最終才能完成傳送。零拷貝技術的優
