帶快取IO和不帶快取IO

2021-07-25 06:12:26 字數 2046 閱讀 5504

ssize_t write (int fd,const void * buf,size_t count);

寫操作時,設每次寫入長度count=10個位元組,那麼你幾要呼叫10次這個函式才能把這個緩衝區寫滿,此時資料還是在緩衝區,並沒有寫入到磁碟,緩衝區滿時才進行實際上的io操作,把資料寫入到磁碟上,所以上面說的「不帶快取不是就沒有快取直寫進磁碟」就是這個意思。

那麼,既然不帶快取的操作實際在核心是有快取器的,那帶快取的io操作又是怎麼回事呢?

帶快取io也叫標準io,符合ansi c 的標準io處理,不依賴系統核心,所以移植性強,我們使用標準io操作很多時候是為了減少對read()和write()的系統呼叫次數,帶快取io其實就是在使用者層再建立乙個快取區,這個快取區的分配和優化長度等細節都是標準io庫代你處理好了,不用去操心,還是用上面那個例子說明這個操作過程:

上面說要寫資料到檔案上,核心快取(注意這個不是使用者層快取區)區長度是100位元組,我們呼叫不帶快取的io函式write()就要呼叫10次,這樣系統效率低,現在我們在使用者層建立另乙個快取區(使用者層快取區或者叫流快取),假設流快取的長度是50位元組,我們用標準c庫函式的fwrite()將資料寫入到這個流快取區裡面,流快取區滿50位元組後在進入核心快取區,此時再呼叫系統函式write()將資料寫入到檔案(實質是磁碟)上,看到這裡,你用該明白一點,標準io操作fwrite()最後還是要掉用無快取io操作write,這裡進行了兩次呼叫fwrite()寫100位元組也就是進行兩次系統呼叫write()。

如果看到這裡還沒有一點眉目的話,那就比較麻煩了,希望下面兩條總結能夠幫上忙:

無快取io運算元據流向路徑:資料——核心快取區——磁碟

標準io運算元據流向路徑:資料——流快取區——核心快取區——磁碟

這裡為了說明標準i/o的工作原理,借用了glibc中標準i/o實現的細節,所以**多是不可移植的.

1. buffered i/o, 即標準i/o

首先,要明確,unbuffered i/o只是相對於buffered i/o,即標準i/o來說的.

而不是說unbuffered i/o讀寫磁碟時不用緩衝.實際上,核心是存在高速緩衝區來進行

真正的磁碟讀寫的,不過這裡要討論的buffer跟核心中的緩衝區無關.

buffered i/o的目的是什麼呢?

很簡單,buffered i/o的目的就是為了提高效率.

請明確乙個關係,那就是,

buffered i/o庫函式(fread, fwrite等,使用者空間) <----call--->  unbuffered i/o系統呼叫(read,write等,核心空間)<-------> 讀寫磁碟

buffered i/o庫函式都是呼叫相關的unbuffered i/o系統呼叫來實現的,他們並不直接讀寫磁碟.

那麼,效率的提高從何而來呢?

注意到,buffered i/o中都是庫函式,而unbuffered i/o中為系統呼叫,使用庫函式的效率是高於使用系統呼叫的.

buffered i/o就是通過盡可能的少使用系統呼叫來提高效率的.

它的基本方法是,在使用者程序空間維護一塊緩衝區,第一次讀(庫函式)的時候用read(系統呼叫)多從核心讀出一些資料,

下次在要讀(庫函式)資料的時候,先從該緩衝區讀,而不用進行再次read(系統呼叫)了.

同樣,寫的時候,先將資料寫入(庫函式)乙個緩衝區,多次以後,在集中進行一次write(系統呼叫),寫入核心空間.

buffered i/o中的fgets, puts, fread, fwrite等和unbufferedi/o中的read,write等就是呼叫和被呼叫的關係

一、recv端

在監聽套接字上準備accept,在accept結束以後不做什麼操作,直接sleep很久,也就是在recv端並不做接受資料的操作,在sleep結束之後再recv資料。

二、send端

_wmem,最後乙個引數為傳送緩衝區的最大大小。接受緩衝區最大的配置檔案在tcp_rmen中。

將套接字設定為阻塞,一次傳送的buffer大於最大傳送緩衝區所能容納的資料量,一次send結束,在傳送返回後接著答應傳送的資料長度

也就是說對於套接字來說,套接字的接收快取和傳送快取都是在核心空間的。

不帶快取的I O和標準 帶快取的 I O

ssize t write int fd,const void buf,size t count 寫操作時,設每次寫入長度count 10個位元組,那麼你幾要呼叫10次這個函式才能把這個緩衝區寫滿,此時資料還是在緩衝區,並沒有寫入到磁碟,緩衝區滿時才進行實際上的io操作,把資料寫入到磁碟上,所以上面...

標準IO和不帶快取的IO

分類 unix程式設計 2014 09 17 00 47 42人閱讀收藏 舉報io快取c 最近在看 unix環境高階程式設計 這是自己的一些心得體會。不帶快取的io是什麼,比如read 函式和write 函式,這兩個函式的函式原型如下 需要注意的是這兩個函式都有乙個引數就是buf,這個引數用來指向讀...

快取IO和直接IO

快取io 資料從磁碟先通過dma copy到核心空間,再從核心空間通過cpu copy到使用者空間 直接io 資料從磁碟通過dma copy到使用者空間 快取io又被稱為標準io,大多數檔案系統的預設io操作都是快取io 在linux的快取io機制中嗎,資料先從磁碟複製到核心空間的緩衝區,然後從核心...