緩衝區的個人理解

2021-07-09 11:48:28 字數 3003 閱讀 6479

緩衝區的個人理解

這裡所說的緩衝區指的是為標準輸入與標準輸出設定的緩衝區,為什麼要設定乙個標準輸入緩衝區主要是從效率上來考慮的,如果不設緩衝區會降低cpu

的效率,因為它總是會等待使用者輸入完之後才會去執行某些指令!同樣設定乙個標準輸出緩衝區是為了解決列印的問題!總之這樣做的目的就是為了效率!

接下來講解一下怎麼設定標準輸入與標準輸出緩衝區。

如果我們不認為的設定的話,系統會自動的為標準輸入與標準輸入設定乙個緩衝區,這個緩衝區的大小通常是4kb

的大小,這和計算機中的分頁機制有關,因為程序在計算機中分配記憶體使用的就是分頁與分段的機制,並且每個頁的大小是

4kb,因此通常情況下緩衝區的大小會設定為

4kb的大小!並且這個緩衝區的型別是乙個全緩衝的緩衝區!所謂全緩衝指的是:當緩衝區裡的資料寫滿的時候(或者可以說達到頂端)緩衝區中的資料才會「寫」到標準輸入磁碟檔案中,這裡說的寫不是將緩衝區中的資料移動到磁碟檔案中,而是拷貝到磁碟檔案中,也就說此時磁碟檔案中保留了乙份緩衝區內容的備份!除了全緩衝外還有不緩衝和行緩衝,不緩衝不太常見與常用,在這裡我就不做講解了!下面講解一下什麼是行緩衝。行緩衝指的是當在鍵盤上敲下

回車鍵的時候資料會儲存在緩衝區中,這是毫無疑問的,同時也將緩衝區的資料拷貝乙份到磁碟檔案中!那麼磁碟檔案中備份的內容有什麼用呢??本人能力有限目前還沒有發現有什麼用!

當熱我們還可以自己設定緩衝區,緩衝區的大小可以由我們自己決定,緩衝區的型別也由我們自己決定!在這裡有兩個函式,乙個是setbuf(   file *stream  ,  char *buffer  ) 

另乙個是

setvbuf( file *stream  ,   char *buffer  ,  int mode  ,   unsigned int  size  ) ;

其中緩衝區的型別可以是:_iofbf 

:全緩衝   

_iolbf 

:行緩衝  

_ionbf 

: 不緩衝

下面講解一下緩衝區是怎麼工作的!

當我們從鍵盤輸入資料的時候資料並不是直接被我們得到(這個問題我在上面已經講解過了,不在重複),而是將這些輸入的資料放在了緩衝區中,然後我們從緩衝區中得到我們想要的資料 !如果我們通過函式(setbuf , setvbuf

)將緩衝區設定

10個位元組的大小,而我們從鍵盤輸入了

20個位元組大小的資料,這樣我們輸入的前

10個資料會放在緩衝區中,因為我們設定的緩衝區的大小只能夠裝下

10個位元組大小的資料,裝不下

20個位元組大小的資料。那麼剩下的那

10個位元組大小的資料怎麼辦呢??暫時放在了輸入流中!如果不能夠理解這個,那我舉乙個比較形象的例子:

上面的箭頭表示的區域就相當是乙個輸入流,紅色的地方相當於乙個開關,這個開關可以控制往深綠色區域(標註的是緩衝區)裡放進去的資料,輸入20

個位元組的資料只往緩衝區中放進去了

10個位元組,剩下的

10個位元組的資料就被停留在了輸入流裡!等待下去往緩衝區中放入!接下來系統是如何來控制這個緩衝區呢? 在c

語言方式下

是乙個結構體陣列

型別是file

結構體

struct _iobuf ;

結構體中的成員簡單的介紹下

_ptr     //指向當前緩衝區內容的指標

_cnt     //如果是輸入緩衝區

那他就是顯示現在緩衝區裡還有多少個有效資料

_base    //緩衝區基位址

_flag    //標誌位

具體好像就是什麼可寫啊 可讀啊之類的

_file    //這個是裝置控制代碼(也可以說是檔案控制代碼)

_bufsiz  //緩衝區總大小

一般都是

0x1000    

也就是4k   

也就是乙個分頁

在上面我們向緩衝區中放入了10

個位元組大小的資料,

file

結構體中的

_cnt變為了10 

,說明此時緩衝區中有

10個位元組大小的資料可以讀,同時我們假設緩衝區的基位址也就是

_base是0x00428e60 ,它是不變的 ,

而此時_ptr的值也為0x00428e60 ,

表示從0x00428e60這個位置開始讀取資料,當我們從緩衝區中讀取5

個資料的時候,

_cnt變為了5 

,表示緩衝區還有

5個資料可以讀,

_ptr則變為了0x0042e865表示下次應該從這個位置開始讀取緩衝區中的資料 ,如果接下來我們再讀取5

個資料的時候,

_cnt則變為了0 

,表示緩衝區中已經沒有任何資料了,

_ptr變為了0x0042869表示下次應該從這個位置開始從緩衝區中讀取資料,但是此時緩衝區中已經沒有任何資料了,所以要將輸入流中的剩下的那10

個資料放進來,這樣緩衝區中又有了

10個資料,此時

_cnt變為了10 

,注意了剛才我們講到

_ptr的值是0

x00428e69 ,而當緩衝區中重新放進來資料的時候這個_ptr的值變為了0x00428e60 ,這是因為當緩衝區中沒有任何資料的時候要將_ptr這個值進行一下重新整理,使其指向緩衝區的基位址也就是0x0042e860這個值!因為下次要從這個位置開始讀取資料!

在這裡有點需要說明:當我們從鍵盤輸入字串的時候需要敲一下回車鍵才能夠將這個字串送入到緩衝區中,那麼敲入的這個回車鍵(\r)會被轉換為乙個換行符\n,這個換行符\n也會被儲存在緩衝區中並且被當成乙個字元來計算!比如我們在鍵盤上敲下了123456

這個字串,然後敲一下回車鍵

(\r)

將這個字串送入了緩衝區中,那麼此時緩衝區中的位元組個數是7 

,而不是6。

緩衝區的重新整理就是將指標_ptr

變為緩衝區的基位址 ,同時

_cnt

的值變為

0 ,因為緩衝區重新整理後裡面是沒有資料的!

緩衝區理解

在講緩衝區之前,我們要先介紹下記憶體的作用。記憶體是計算機中重要的部件之一,它是與cpu進行溝通的橋梁。計算機中所有程式的執行都是在記憶體中進行的,其作用是用於暫時存放cpu中的運算資料,以及與硬碟等外部儲存器交換的資料。也就是說 只要計算機在執行中,cpu就會把需要運算的資料調到記憶體中進行運算,...

緩衝區的理解

這裡所說的緩衝區指的是為標準輸入與標準輸出設定的緩衝區,為什麼要設定乙個標準輸入緩衝區主要是從效率上來考慮的,如果不設緩衝區會降低cpu的效率,因為它總是會在使用者輸入之後馬上會去執行某些指令,導致多次io開銷!同樣設定乙個標準輸出緩衝區是為了解決列印的問題!總之這樣做的目的就是為了效率!比如如果沒...

C 緩衝區的理解

下面介紹緩衝區的知識。一 什麼是緩衝區 緩衝區又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。緩衝區根據其對應的是輸入裝置還是輸出裝置,分為輸入緩衝區和輸出緩衝區。二 為什麼要引入緩衝區 我們為什麼...