原理講解有緩沖I/O與無緩沖I/O的區(qū)別
當(dāng)你看完這篇文章若是不能理解什么是帶緩沖的I/O與無緩沖的I/O的區(qū)別,隨意噴!!!
當(dāng)你學(xué)習(xí)Unix高級編程時會遇到不帶緩沖的I/O函數(shù),比如open、read、write、lseek、close等等,那這與帶緩沖的I/O有什么區(qū)別????
我們得先說說什么是高速緩沖存儲器,先別急慢慢看,看不懂算我輸?。?!這個東東對整個計算機性能的提升有很大的幫助,具體就涉及到兩個器件的運行速度了,也就是cpu與內(nèi)存的運行速度,想想也知道兩個不同器件的運行速度肯定不一樣,最基本的硬件架構(gòu)都不一樣。那這就有一個問題產(chǎn)生了,cpu的速度大于內(nèi)存的,那要是cpu不挺的往內(nèi)存的某一個地址寫數(shù)據(jù),由于內(nèi)存的速度跟不上,那數(shù)據(jù)就會被覆蓋了,所以解決方案就是在cpu與內(nèi)存之間加一個高速緩沖存儲器,高速緩沖存儲器的速度介于cpu與內(nèi)存之間,那就好辦事了,cpu先把數(shù)據(jù)放在這個存儲器上,然后內(nèi)存向存儲器取數(shù)據(jù),然后發(fā)送到其他地方,在這段時間里,內(nèi)存向存儲器取的數(shù)據(jù)不會因為cpu速度過快直接被覆蓋,而是放在了高速緩沖存儲器上,帶內(nèi)存再次取數(shù)據(jù)時間就夠了!??!
同樣的道理用在磁盤上,比如你寫了一個進程,這個進程不挺的向磁盤寫數(shù)據(jù),若是進程發(fā)送的數(shù)據(jù)過快,磁盤在寫的過程中就極有可能會被新的數(shù)據(jù)所覆蓋,所以就出現(xiàn)了所謂的磁盤高速緩存來做緩沖,它其實是內(nèi)存的一部分,也就是我們所說的內(nèi)存條的一部分,當(dāng)做緩沖,這就是它的實際的物理意義:就是內(nèi)存的一部分。那這有什么好處???想想也知道好處大得很,說說原理,有個概念叫局部性原理。局部性原理包含很多的局部性,比如時間的局部性,就是說進程A在t0時刻訪問磁盤的某一地址,在t0+t1時刻又來訪問,就叫時間的局部性。若是訪問的次數(shù)特別多,訪問的時間的間隔特別短,那么進程A就要不挺的訪問磁盤,就好比出家門玩的時候,你忘記帶某一東西,你回去拿,忽然發(fā)現(xiàn)又忘記帶了,這個時候你肯定想要是有人幫我拿了,在送的路上就好了不必在回家,同樣的道理在進程A與磁盤之間,若是頻繁訪問某一地址,通過磁盤高速緩存來把數(shù)據(jù)存起來后方便以后在訪問,更何況現(xiàn)在是變成了進程A直接與磁盤高速緩存(或者說內(nèi)存)之間的訪問了,這不更快了嗎?。。?/span>所以一般出現(xiàn)一個某一個特定扇區(qū)的I/O請求時,這個請求會先查看所要訪問的數(shù)據(jù)在不在緩存里面,在就訪問,不在就把這個扇區(qū)的數(shù)據(jù)先拷貝到緩存里面,然后在訪問緩存里面的數(shù)據(jù)。
是不是感覺又理解了一點操作系統(tǒng)的小知識,我們繼續(xù)說!?。∧巧厦孢@些與I/0有無緩沖有什么聯(lián)系???
對于帶緩沖的I/O通過一個叫緩沖區(qū)高速緩存最為緩存,其實它就是磁盤高速緩存。若是用戶進程要訪問某一個設(shè)備,注意不一定是磁盤,任何一個設(shè)備,由于每個I/O設(shè)備都與一個特殊文件相關(guān)聯(lián),而文件由文件系統(tǒng)所管理,所以對文件的I/O操作,就相當(dāng)于對設(shè)備的操作了;而文件放在磁盤上,而且磁盤高速緩存(內(nèi)存的一部分)又是被用來作為磁盤的緩存,所以某一設(shè)備(文件)的緩存可以是磁盤高速緩存(內(nèi)存的一部分)其中的一部分!?。∪缦聢D所示:
這里可以是任意的設(shè)備
這個緩沖區(qū)就是磁盤高速緩存(內(nèi)存的一部分)其中的一部分的緩存。某一進程通過文件系統(tǒng)接口向設(shè)備對應(yīng)的文件寫數(shù)據(jù),文件系統(tǒng)把數(shù)據(jù)先存在緩存器中,然后發(fā)送到設(shè)備驅(qū)動程序控制設(shè)備。設(shè)備由所對應(yīng)的控制器(可以簡單的理解為寄存器)所管理,學(xué)過單片機的都知道,簡單往寄存器寫數(shù)據(jù)就能控制設(shè)備了,比如串口,只要會了串口,藍(lán)牙不在話下?。。∪羰前芽刂破骼锩娴募拇嫫饔成涞絻?nèi)存(也就是所謂I/O映射),再加上磁盤高速緩存是內(nèi)存的一部分,那不就是數(shù)據(jù)在內(nèi)存之間變化了,速度就更快了?。?!
而對于無緩沖的I/O就沒有其中的緩沖了,也就是進程通過DMA直接與I/O設(shè)備交換數(shù)據(jù)了,但是執(zhí)行無緩沖的I/0被鎖定在內(nèi)存,不能被換出,那么這部分內(nèi)存不能用了,信息交流的就少了不少,導(dǎo)致整個系統(tǒng)的性能有所下降,但是這是進程執(zhí)行I/O最快的方法了?。?!