帶緩衝的IO和不帶緩衝的IO

2021-06-22 18:30:37 字數 1109 閱讀 9497

首先說說帶緩衝的i/o是什麼意思,在unix環境高階程式設計裡面,是這樣解釋的:「術語不帶緩衝指的是每個read和write都呼叫核心中的乙個系統呼叫。所有的磁碟i/o都要經過核心的塊緩衝(也稱核心的緩衝區快取記憶體),唯一例外的是對原始磁碟裝置的i/o。既然read或write的資料都要被核心緩衝,那麼術語「不帶緩衝的i/o「指的是在使用者的程序中對這兩個函式不會自動緩衝,每次read或write就要進行一次系統呼叫。「

就像上面所說的,既然所有的磁碟都要經過核心的塊緩衝,那麼帶緩衝的io特指在使用者程序與系統呼叫之間是否有緩衝。unix的read,write函式是系統呼叫,是不帶緩衝的。二者的原型為:

ssize_t read( int fd, void* buf, size_t nbytes );              // 若成功返回讀到的位元組數

ssize_t write( int fd, const void* buf, size_t nbytes ); // 若成功返回已寫的位元組數

不帶緩衝的i/o對檔案描述符進行操作,帶緩衝的i/o針對流操作。

標準i/o庫就是帶快取的i/o,它由ansi c標準說明。當然,標準i/o最終都會呼叫上面的系統呼叫。標準i/o庫代替使用者處理很多細節,比如快取分配、以優化長度執行i/o等。

標準i/o提供快取的目的就是減少呼叫read和write的次數,它對每個i/o流自動進行快取管理(標準i/o函式通常呼叫malloc來分配快取)。它提供了三種型別的快取:

1) 全快取。當填滿標準i/o快取後才執行i/o操作。磁碟上的檔案通常是全快取的。

2) 行快取。當輸入輸出遇到新行符或快取滿時,才由標準i/o庫執行實際i/o操作。stdin、stdout通常是行快取的。

3) 無快取。相當於read、write了。stderr通常是無快取的,因為它必須盡快輸出。

一般而言,由系統選擇快取的長度,並自動分配。標準i/o庫在關閉流的時候自動釋放快取。

在標準i/o庫中,乙個效率不高的不足之處是需要複製的資料量。當每次使用行函式fgets和fputs時,通常需要複製兩次資料:一次是在核心和標準i/o快取之間(當呼叫read和write時),第二次是在標準i/o快取(通常系統分配和管理)和使用者程式中的行快取(fgets的引數就需要乙個使用者行快取指標)之間。

帶緩衝的IO和不帶緩衝的IO

檔案描述符 檔案描述符是乙個小的非負整數,是核心用來標識特定程序正在訪問的檔案 標準輸入 輸出 出錯 shell為每個程式開啟了三個檔案描述符,stdin fileon,stdout fileon,stderr fileon,預設這三個檔案描述符都鏈向終端 不帶緩衝的io 函式open read w...

帶緩衝I O 和 不帶緩衝I O詳解

帶快取的檔案操作 是標準c 庫的實現,第一次呼叫帶快取的檔案操作函式時標準庫會自動分配記憶體並且讀出一段固定大小的內容儲存在快取中。所以以後每次的讀寫操作並不是針對硬碟上的檔案直接進行的,而是針對記憶體中的快取的。何時從硬碟中讀取檔案或者向硬碟中寫入檔案有標準庫的機制控制。不帶快取的檔案操作通常都是...

帶緩衝的IO流和不帶緩衝的IO流

先來看看不帶快取的i o和標準 帶快取的 i o都有那些 不帶快取的i o read,write,open.標準 帶快取的 i o fgets,fread,fwrite.這裡使用兩個對應的函式進行比較 ssize t write int filedes,const void buff,size t ...