【IO】【java的io讀寫,緩衝區是如何提高讀寫效率的】

據我瞭解,運用FileInputStream讀寫一段數據是一個字節一個字節的讀取,如果有10個字節大小的文件,就要調用10次系統調用,每次將讀取的數據賦值給變量,然後程序使用變量。緩衝區可以看作是一個放在內存中的數組,但是從硬盤中讀取數據仍然要使用系統調用,系統調用的讀取仍然是每次一個,只是每調用一次之後,將所得到的數據放入緩衝區中的,然後程序一次性使用10個數據。

我是這樣理解的,但是不管用與不用緩衝區,使用的系統調用是一樣多的。(不知我的理解正確與否,請指出)如果我理解的是正確的,那麼爲什麼使用緩衝區讀寫的效率要高呢??謝謝!

 

答案:

理解是對的。

調用I\O操作的時候,實際上還是一個一個的讀或者寫,關鍵就在,CPU只有一個,不論是幾個核心。CPU在系統調用時,會不會還要參與主要操作?參與多次就會花更多的時間。

 

系統調用時,若不用緩衝,CPU會酌情考慮使用 中斷。此時CPU是主動地,每個週期中都要花去一部分去詢問I\O設備是否讀完數據,當IO開始讀取數據或者數據讀完之後,都會發送中斷指令,這段時間CPU不能做任何其他的事情(至少負責執行這段模塊的核不能)。所以,調用一次讀了一個字,通報一次,CPU騰出時間處理一次。

 

而設置緩衝,CPU通常會使用 DMA 方式去執行 I\O 操作。CPU 將這個工作交給DMA控制器來做,這也是利用緩衝區速度快的原因,當時用緩衝區時候,java底層會調用操作系統某個函數,然後會發送DMA的執行指令,自己騰出時間做其他的事,當DMA完成工作時,DMA會主動告訴CPU“操作完成”。這時,CPU接管後續工作。在此,CPU 是被動的。DMA是專門 做 I\O 與 內存 數據交換的,不僅自身效率高,也節約了CPU時間,CPU在DMA開始和結束時做了一些設置罷了。

所以,調用一次,不必通報CPU,等緩衝區滿了,DMA 會對C PU 說 “嘿,夥計!快過來看看,把他們都搬走吧”。

 

綜上,設置緩衝,就建立了數據塊,使得DMA執行更方便,CPU也有空閒,而不是呆呆地候着I\O數據讀來。從微觀角度來說,設置緩衝效率要高很多。儘管,不能從這個程序上看出來。 幾萬字的讀寫\就能看到差距

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章