同步與非同步 阻塞與非阻塞

weixin_34041003發表於2015-12-02
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.總結
     同步與非同步是一組相對概念,針對的是自己等待還是別人通知
     阻塞和非阻塞是一組相對概念,針對的是等待過程中,等待者的操作。

相關文章