天天看點

同步與異步 阻塞與非阻塞

1.1所采用生活中的事件:

          我要去銀行辦理存錢業務,因為人多,需要排隊等待。

          1)排隊分為在隊伍中等待和取号等待兩種。在隊伍中等待,那麼我就需要不斷的看看前面的人辦理完了沒。如果選擇取号等待,那麼我就比較安逸了,我就不必去管前面的人是否已經辦理,我隻需要等待别人通知我就行了。也就是這兩種方式,一種是自己去做,一種是别人來做。二者孰優孰劣,一目了然。

          2)當然,在排隊過程中,我們有時候會打電話發短信看書等來消磨時間。那麼如果是在隊伍中等待,我進行打電話發短信看書的動作,那麼我既要看前面的人是否辦理完畢,又要進行打電話發短信和看書的動作,實在是費力啊。而如果我是選擇取号等待呢,那麼我就坐在沙發上,打電話發短信看書,一心一用,爽哉。

1.2對應技術的問題:

          我所選擇的排隊方式就對應同步與異步。在隊伍中等待就是同步,取号等待就是異步。

          我在等待過程中,能夠進行打電話發短信看書的動作,就是非阻塞。如果在等待過程中,不能夠進行打電話發短信看書的動作,那就是阻塞。

1.3小結:

     同步和異步僅僅是關于所關注的消息如何通知的機制,而不是處理消息的機制.也就是說,同步的情況下,是由處理消息者自己去等待消息是否被觸發,而異步的情況下是由觸發機制來通知處理消息者

2.同步、異步、阻塞、非阻塞的了解

2.1同步阻塞I/O

     官方解釋:使用者空間的應用程式執行一個系統調用時,會導緻應用程式阻塞。隻有等系統調用結束(資料傳輸完成或發生錯誤),使用者控件的應用程式才會繼續執行。

     我的了解:就是我去銀行存錢時,我不得不在隊伍中排隊等待,而且在等待過程中我啥都不能幹,隻能等着。多麼苦悶啊。

2.2同步非阻塞I/O

     官方解釋:

     我的了解:我去銀行存錢時,我不得不在隊伍中排隊等待,但我在等待過程中我還會打電話看書。我既要看前面的人是否結束業務的辦理,又要打電話看書,太累了。程式猿苦逼,排隊辦業務還得一心兩用。

 2.3異步阻塞I/O

     官方解釋:另外一個阻塞解決方案是帶有阻塞通知的非阻塞 I/O。在這種模型中,配置的是非阻塞 I/O,然後使用阻塞 select 系統調用來确定一個 I/O 描述符何時有操作。使 select 調用非常有趣的是它可以用來為多個描述符提供通知,而不僅僅為一個描述符提供通知。對于每個提示符來說,我們可以請求這個描述符可以寫資料、有讀資料可用以及是否發生錯誤的通知。(了解有難度)

     我的了解:我去銀行存錢時,我取号等待,我就等着别人來通知我辦理業務,但是在等待過程中,我什麼都不能做,隻能等待。想想你在等待過程中,啥都不能做,是多麼難受。

2.4 異步非阻塞I/O(AIO)

     官方解釋:異步非阻塞 I/O 模型是一種處理與 I/O 重疊進行的模型。讀請求會立即傳回,說明 read 請求已經成功發起了。在背景完成讀操作時,應用程式然後會執行其他處理操作。當 read 的響應到達時,就會産生一個信号或執行一個基于線程的回調函數來完成這次 I/O 處理過程。

     我的了解:我去銀行存錢時,取号等待,在等待時我可以看看書打打電話,等着别人通知我就可以啦。

3.總結

     同步與異步是一組相對概念,針對的是自己等待還是别人通知

     阻塞和非阻塞是一組相對概念,針對的是等待過程中,等待者的操作。

轉自:

http://blog.csdn.net/yankai0219/article/details/8018232

繼續閱讀