全缓冲、行缓冲和无缓冲
這里的緩沖是指的是用戶空間的I/O緩沖區(qū),不是內(nèi)核緩沖。
無緩沖:用戶層不提供緩沖,數(shù)據(jù)流直接到內(nèi)核緩沖,再到磁盤等外設上。標準錯誤輸出(2)通常是無緩存的,因為它必須盡快輸出,且是輸出到具有交互式的設備上,如屏幕,不是磁盤。
行緩沖:在I/O緩沖區(qū)中遇到換行符或者緩沖區(qū)寫滿時,就自動把數(shù)據(jù)送到內(nèi)核緩沖區(qū)標準輸入(0)和標準輸出(1)對應終端設備時通常是行緩沖的。另外,在程序結(jié)束時;main函數(shù)中return時(代表程序執(zhí)行結(jié)束);main函數(shù)調(diào)用exit函數(shù)時(結(jié)束當前進程);C庫函數(shù)fflush時或關(guān)閉文件時,也會將I/O緩沖的數(shù)據(jù)刷到內(nèi)核中,然后送到外設上。
全緩沖:如果緩沖區(qū)寫滿了就寫回內(nèi)核。常規(guī)文件的寫入寫出(磁盤)通常是全緩沖的。另外,在程序結(jié)束時;main函數(shù)中return時(代表程序執(zhí)行結(jié)束);main函數(shù)調(diào)用exit函數(shù)時(結(jié)束當前進程);C庫函數(shù)fflush時或關(guān)閉文件時,也會將I/O緩沖的數(shù)據(jù)刷到內(nèi)核中,然后送到外設上。后兩種都是:數(shù)據(jù)-------I/O緩沖---------內(nèi)核緩沖-------外設。
上述都是I/O緩沖區(qū),其作用是減少read和write的次數(shù),即減少了系統(tǒng)調(diào)用,從而減少了系統(tǒng)開銷,提高了I/O速度。
內(nèi)核緩沖區(qū)。?從理論上講,內(nèi)核可以在任何時候?qū)懘疟P,但并不是所有的write操作都會導致內(nèi)核的寫動作。內(nèi)核會把要寫的數(shù)據(jù)暫時存在緩沖區(qū)中,積累到一定數(shù)量后再一次寫入。有時會導致意外情況,比如斷電,內(nèi)核還來不及把內(nèi)核緩沖區(qū)中的數(shù)據(jù)寫道磁盤上,這些更新的數(shù)據(jù)就會丟失。
read把數(shù)據(jù)從內(nèi)核緩沖區(qū)復制到I/O緩沖區(qū),write把數(shù)據(jù)從I/O緩沖區(qū)復制到內(nèi)核緩沖區(qū),它們不等價于數(shù)據(jù)在內(nèi)核緩沖區(qū)和磁盤之間的交換。注意:對于用戶進程來說,把數(shù)據(jù)送到內(nèi)核緩沖和送到外設上是等價的(一樣的效果),即對用戶進程是透明的。
標準輸出(1)和錯誤輸出(2)的區(qū)別。首先,前者是行緩沖,后者是無緩沖,可以立即將錯誤信息輸出到屏幕上,而不會留在I/O緩沖中;兩者都默認輸出到屏幕上。
總結(jié)
以上是生活随笔為你收集整理的全缓冲、行缓冲和无缓冲的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: open函数和close函数的使用
- 下一篇: read和write函数的使用