對檔案I 0緩衝的認識

2021-07-04 02:49:04 字數 2201 閱讀 8397

或許很多初學檔案i/o時會認為read()或write()系統呼叫會直接對磁碟中的檔案發起訪問,其實不然,此倆個呼叫只會使使用者空間緩衝區與核心的高速緩衝區之間複製資料。

write(fd,"12345");
例如上述操作,當write返回後,在之後的某個時刻核心會將該資料寫入(重新整理至)磁碟(所以系統呼叫其實並不與磁碟同步)如果在此期間,另乙個程式試圖讀取這些位元組,將會直接存核心快取記憶體區讀走

與此相同,對於從磁碟讀,核心也會先讀到核心緩衝區中,read呼叫將從這裡讀走資料。對於序列化的檔案訪問,核心通常會嘗試預讀,以確保在需要之前就將該檔案的下一資料快讀入緩衝區,採用這一設計,可以使read()和write()的操作加快

linux的核心緩衝區沒有固定的上線,核心會分配盡可能多的記憶體,一般此舉只受限於倆個因素。可用的物理記憶體總量和其他目的對記憶體的需求

如果沒有緩衝區,我們可以想象以下讀寫1000個位元組,那麼核心就得訪問1000此磁碟,眾所周知,核心訪問磁碟的速度是非常慢的,那麼緩衝區的大小會對操作時間有多大影響呢?

接下來這個**摘自linux系統程式設計手冊中,它是要通過設定不同大小的快取區,來比較複製100m檔案所用的時間

buffer_size

總用時(s)

1107.43

254.16

431.72

815.59

167.5

323.76

642.19

1282.16

2562.06

5122.06

1024

2.05

4096

2.05

65536

2.06

由上圖可知緩衝區的大小對檔案複製事件影響很大。當緩衝區大小為4096時,幾乎達到了最優,超過這個值,效果並不顯著

當操作磁碟時,緩衝大塊資料以減少系統呼叫c函式庫的i/o正是這麼做的,因此使用c標準庫i/o,使用者完全不必自己處理緩衝區

#include

int setvbuf(file *stream,char *buf,int mode,ssize_t size);

呼叫setvbuf函式可以控制stdio庫的緩衝模式

.引數stream說明要修改哪個檔案流的緩衝模式

.引數buf不為null時,stream的緩衝區大小為size,緩衝區由堆萊分配

.buf為null,緩衝區有stdio預設分配

.引數mode指定了緩衝型別

mode值

具體表現

_ionbf

不對i/o進行緩衝

_iolbf

採用行緩衝i/o

_iofbf

採用全緩衝i/o

#include

void setbuf(file *stream,char *buf);

.buf為bull時表示無緩衝區,否則採用buf大小的緩衝區

#include

int fflush(file *stream);

若引數stream為null則將重新整理所有的stdio緩衝區

有時候我們需要強制重新整理核心區到輸出檔案,例如資料庫的日誌程序,要確保在繼續操作前將輸出真正寫入磁碟

#include

int fsync(int fd);

該函式,只有當對磁碟裝置的傳遞完成才返回,否則將處於阻塞

#include

void sync(void);

sync()呼叫會使包含檔案跟新資訊的所有核心快取區重新整理到磁碟上

呼叫open後,若有o_sync標誌,則每次write()呼叫都會自動將檔案資料和元資料重新整理到磁碟上

o_sync標誌對效能的影響極大,下標摘自linux系統程式設計手冊

buf_size

無o_sync(s)

有o_sync(s)

11030

98.8

1665.0

0.40

2564.07

0.03

4096

0.34

0.03

檔案i/o緩衝主要是先通過stdio庫將使用者資料傳到stdio緩衝區,該緩衝區位於使用者態記憶體區,當緩衝區填滿時,stdio會呼叫write()系統呼叫,將資料傳到核心告訴緩衝區,在一定的時間之後,核心發起磁碟操作,將資料傳到磁碟。

第二章 檔案I 0 函式read write

函式說明 write 會把引數buf所指的記憶體寫入count個位元組到引數放到所指的檔案內。write成功返回,只是buf中的資料被複製到了kernel中的tcp傳送緩衝區。includessize t write int fd,const void buf,size t count 返回值 如果...

關於c語言中的I 0函式

1.printf與scanf printf 函式是格式化輸出函式,一般用於向標準輸出裝置按規定格式輸出資訊。scanf 函式式格式化的輸入函式。用於向標準輸入裝置按規定格式輸入資訊。printf d a scanf d a 2.getchar與putchar 這兩個函式是專門面向字元i o而設計的一...

Delphi 的ORM框架(即I 0框架)

簡介io是用delphi實現的orm框架 url 有以上描述的大部分優點,同時還有以下特點 演示io自帶的demo primercross 1 支援多種資料庫 2 支援自動建立資料庫和更新資料庫結構 3 提供整合到ide裡面的資料模型設計器 4 支援包括blob memo等多種資料型別 5 支援1對...