寫在最前面: 之前的學習記錄呢,是記錄在私人空間,複製粘貼或者寫寫心得,三下五除二,以爲省事不少。時常也想,寫寫博客會讓態度嚴謹不少,但總以爲沒那麼多時間。不過仍是從今天開始嘗試一下吧,期待個人分享能不能帶給我更多的動力。緩存
進入主題:標準I/O中的緩存。函數
由於在看APUE,看到標準I/O的一些熟悉而陌生的一些概念。熟悉是由於常常有看到,而陌生,則是由於沒有系統的把它們串起來過。學習
首先,系統I/O是非緩存I/O,標準I/O是帶緩存的I/O。標準I/O創建在系統I/O之上。操作系統
流:指針
我是對比着跟fd來理解的。由於流相似文件描述符fd,都惟一對應着一個打開的文件。然而函數經過引用fd進行文件I/O,咱們怎樣引用流來進行文件I/O呢?應該是經過fp(FILE結構的指針)。標準I/O庫打開一個文件,則獲得一個fp,咱們應該能夠把這個fp的概念和流的概念等同起來。嗯,應該是的。由於FILE結構中包含了實際I/O的fd,還有流緩衝區的指針、長度、當前字符數等不少信息。但爲何沒有見到有誰有講明白的呢?難道只有我一我的在這個問題上糾結過麼?內存
流緩衝區:博客
之前個人理解中只有緩衝區,而沒有過流緩衝區的概念。因此之前我都認爲系統I/O真的就是直接讀寫文件了。直到今天才看到了真相,原來系統I/O其實也仍是有緩存的!並非直接讀寫文件的!系統I/O的緩存叫作頁高速緩衝存儲器(內存),這是內核層面的buffer,咱們看不到而已, 在第一次read或者write時,操做系統會用高速緩存技術將相關文件放入page buffer, 後續的讀寫則從page buffer訪問文件,無需讀寫磁盤。it
read或者write都有一個參數叫作BUFFERSIZE,指的是一次讀或寫的字節數,這就是緩衝區的大小。這個緩衝區的大小,可以影響到I/O的效率,是否是越大越好呢?書中的例子說明了當緩衝區的大到必定值以後,它對CPU時間就幾乎沒有影響了。而這個臨界值貌似和磁盤塊長度(st_blksize)有關係。那麼咱們的I/O要設置多大的st_blksize呢?怎樣決定這個緩衝區的大小呢?是固定大小呢仍是動態調整呢?這些問題咱們就交給標準I/O來爲咱們考慮吧,標準I/O的存在,就是爲了解決這個問題的。咱們說的帶緩衝的I/O 所指的緩衝區是否是這個BUFFERSIZE大小的緩衝區呢?效率
這個問題迷惑過我一段時間,可是後來以爲標準I/O的緩衝區應該指的不是這個緩衝區。標準I/O的緩衝區有幾種類別,全緩衝、行緩衝和無緩衝,其緩衝還有個flush的方法(也就是寫文件),全緩衝在緩衝區填滿以後自動flush,行緩衝在遇到換行符的時候flush,而無緩衝,其緩衝區的大小爲1,也就是無緩衝做用了。標準I/O緩衝區的大小,貌似在FILE結構裏能夠設置其大小。引用