IO-同步、異步、阻塞、非阻塞

 

1.同步與異步數據庫

所謂同步就是一個任務的完成須要依賴另一個任務時,只有等待被依賴的任務完成後,依賴的任務纔有可能完成(固然咱們能夠根據事務回滾、數據恢復等使之成爲一種可靠的任務序列:要成功都成功,要失敗都失敗,兩個任務的狀態保持一致);異步不須要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工做,依賴的任務不須要等待其完成,便可當即執行,只要本身完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務沒法肯定,因此它是不可靠的任務序列。咱們能夠用打電話和發短信來比喻同步與異步操做。網絡

2.阻塞與非阻塞app

阻塞與非阻塞主要是從CPU的消耗上來講的,阻塞就是CPU停下來等待一個慢的操做完成之後,CPU才接着完成其它的事。非阻塞就是在這個慢的操做執行時CPU去幹其餘別的事,等這個慢的操做完成時,CPU再接着完成後續的操做。雖然表面上看非阻塞的方式可明顯提升CPU的利用率,可是也帶來了另一種後果,就是系統的線程切換增長。增長的CPU使用時間能不能補償系統切換成本須要好好評估。異步

3.兩種方式的組合分佈式

組合的方式有四種:分別是同步阻塞、同步非阻塞、異步阻塞、異步非阻塞。函數

-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------性能

組合方式        |                                                               性能分析spa

-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.net

   同步阻塞        |    最經常使用的一種用法,使用也是最簡單的,可是I/O性能通常不好,CPU大部分處於空閒狀態線程

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                         |     提高I/O性能的經常使用手段,就是講I/O的阻塞改爲非阻塞方式,尤爲在網絡I/O是長鏈接同時傳輸數據也不是不少的狀況下,提高性能很是有效

     同步非阻塞  |     這種方式一般能提高I/O性能,可是會增長CPU消耗,要考慮增長的I/O性能能不能補償CPU的消耗,也就是系統的瓶頸實在I/O仍是在CPU上。---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     異步阻塞      |     這種方式在分佈式數據庫中常常用到,例如,在一個分佈式數據庫中寫一條記錄,一般會有一份同步阻塞的記錄,而還有兩至三份備份記錄

                         |     寫到其它機器上,這些備份記錄一般都採用異步阻塞的方式寫I/O。

                         |     異步阻塞對網絡I/O可以提高效率,尤爲像上面這種同時寫多份相同數據的狀況。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     異步非阻塞  |     這種組合方式用起來比較複雜,只有在一些很是複雜的分佈式,集羣之間的消息同步機制通常採用這種I/O組合方式。

                         |     它適合同時要傳多份相同的數據到集羣中不一樣的機器,同時數據的傳輸量雖然不大可是卻很是頻繁,這種網絡I/O用這個方式性能達到最高。

---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

舉例:

同步阻塞IO

你去一個銀行櫃檯存錢。首先,你會將存錢的單子填好,而後交給櫃員。這裏,你就比如是application,單子就是調用的 system call,櫃員就是kernel。提交好單子後,你就坐在櫃檯前等,至關於開始進行等待。櫃員辦好之後會給你一個回執,表示辦好了,這就是 response。而後你就能夠拿着回執幹其它的事了。注意,這個時候,若是你辦完以後立刻去查帳,存的錢已經打到你的帳戶上了。後面你會發現, 這點很重要。
同步非阻塞IO

此次不是去銀行存錢,而是去銀行匯款。一樣的,你也須要填寫匯款單而後交給櫃員,櫃員進行一 些簡單的手續處理就可以給你回執。可是,你拿到回執並不意味着錢已經打到了對方的帳上。事實上,通常匯款的週期大概是24個小時,若是你要以存錢的模式來 匯款的話,意味着你須要在銀行等24個小時,這顯然是不現實的。因此,同步非阻塞IO在實際生活中也是有它的意義的。
異步阻塞IO

好比說一個銀行櫃檯,如今有10我的想存錢。按照如今銀行的作法,一個個排隊。第一我的先填存款單,而後提交, 而後櫃員處理,而後給回執,成功後再輪到下一我的。你們應該都在銀行排過對,這樣的流程是很痛苦的。若是按照異步阻塞的機制,10我的都填好存款單,而後 都提交給櫃檯,提交完以後全部的10我的就在銀行大廳等待。這時候會專門有我的,他會了解存款單處理的狀況,一旦有存款單處理完畢,他會將回執交給相應的 正在大廳等待的人,這個拿到回執的人就能夠去幹其餘的事情了。而前面提到的這個專人,就對應於select函數。
異步非阻塞IO

好比銀行存錢。如今某銀行新開通了一項存錢業務。用戶之須要將存款單交給櫃檯,而後無需等待就能夠離開了。櫃檯辦好之後會給用戶發送一條短信,告知交易成功。這樣用戶不須要在櫃檯前進行長時間的等待,同時,也可以獲得確切的消息知道交易完成。

 

參考:http://blog.csdn.net/historyasamirror/article/details/4270633  及 JavaWeb技術內幕一書

相關文章
相關標籤/搜索