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中文網其他相關文章!

Linux的5個核心組件分別是內核、Shell、文件系統、系統庫和系統工具。 1.內核管理硬件資源並為應用程序提供服務。 2.Shell作為用戶與系統的接口,解釋並執行命令。 3.文件系統負責數據的存儲和組織。 4.系統庫提供預編譯函數供應用程序調用。 5.系統工具用於系統管理和維護。這些組件協同工作,賦予Linux強大的功能和靈活性。

本文介紹幾種檢查Debian系統OpenSSL配置的方法,助您快速掌握系統安全狀態。一、確認OpenSSL版本首先,驗證OpenSSL是否已安裝及版本信息。在終端輸入以下命令:opensslversion若未安裝,系統將提示錯誤。二、查看配置文件OpenSSL主配置文件通常位於/etc/ssl/openssl.cnf。您可以使用文本編輯器(例如nano)查看:sudonano/etc/ssl/openssl.cnf此文件包含密鑰、證書路徑及加密算法等重要配置信息。三、利用ope

本指南詳細介紹如何在Debian系統上搭建Hadoop開發環境。一、安裝Java開發套件(JDK)首先,安裝OpenJDK:sudoaptupdatesudoaptinstallopenjdk-11-jdk-y配置JAVA_HOME環境變量:sudonano/etc/environment在文件末尾添加(根據實際JDK版本調整路徑):JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"保存並退出,然後執行:source/etc

在Debian系統上有效管理Hadoop資源,需要遵循以下步驟:Hadoop部署:首先,在Debian系統上完成Hadoop的安裝與配置。這包括下載Hadoop發行包、解壓、設置環境變量等必要操作。集群配置:安裝完成後,對Hadoop集群進行配置,涵蓋HDFS(Hadoop分佈式文件系統)和YARN(YetAnotherResourceNegotiator)的設置。需要修改核心配置文件,例如:core-site.xml、hdfs-site.xml、mapred-site.x

提升DebianTomcat日誌安全性,需關注以下關鍵策略:一、權限控制與文件管理:日誌文件權限:默認日誌文件權限(640)限制了訪問,建議修改catalina.sh腳本中的UMASK值(例如,從0027改為0022),或在log4j2配置文件中直接設置filePermissions,以確保合適的讀寫權限。日誌文件位置:Tomcat日誌通常位於/opt/tomcat/logs(或類似路徑),需定期檢查該目錄的權限設置。二、日誌輪轉與格式:日誌輪轉:配置server.xml

Tomcat服務器日誌中的警告信息提示潛在問題,可能影響應用性能或穩定性。有效解讀這些警告信息需要關注以下幾個關鍵點:警告內容:仔細研讀警告信息,明確問題類型、成因及可能的解決方法。警告信息通常會提供詳細描述。日誌級別:Tomcat日誌包含不同級別信息,例如INFO、WARN、ERROR等。 “WARN”級別的警告提示非致命性問題,但需要關注。時間戳:記錄警告發生的時間,以便追溯問題出現的時間點,分析其與特定事件或操作的關係。上下文信息:查看警告信息前後日誌內容,獲取

Tomcat日誌是診斷內存洩漏問題的關鍵。通過分析Tomcat日誌,您可以深入了解內存使用情況和垃圾回收(GC)行為,從而有效定位和解決內存洩漏。以下是如何利用Tomcat日誌排查內存洩漏:1.GC日誌分析首先,啟用詳細的GC日誌記錄。在Tomcat啟動參數中添加以下JVM選項:-XX: PrintGCDetails-XX: PrintGCDateStamps-Xloggc:gc.log這些參數會生成詳細的GC日誌(gc.log),包含GC類型、回收對像大小和時間等信息。分析gc.log

Debian系統下Apache日誌對服務器性能的影響是雙刃劍,既有積極作用,也有潛在的負面影響。積極方面:問題診斷利器:Apache日誌詳細記錄服務器所有請求和響應,是快速定位故障的寶貴資源。通過分析錯誤日誌,可以輕鬆識別配置錯誤、權限問題及其他異常。安全監控哨兵:訪問日誌能夠追踪潛在安全威脅,例如惡意攻擊嘗試。通過設置日誌審計規則,可以有效檢測異常活動。性能分析助手:訪問日誌記錄請求頻率和資源消耗,幫助分析哪些頁面或服務最受歡迎,從而優化資源分配。結合top或htop等


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。