當前位置:名人名言大全網 - 短信平臺 - 同步,異步,阻塞和非阻塞的區別

同步,異步,阻塞和非阻塞的區別

首先來解釋同步和異步的概念,這兩個概念與消息的通知機制有關.

舉個例子,比如我去銀行辦理業務,可能選擇排隊等候,也可能取壹個小紙條上面有我的號碼,等到排到我這壹號時由櫃臺的人通知我輪到我去辦理業務了.

前者(排隊等候)就是同步等待消息,而後者(等待別人通知)就是異步等待消息.在異步消息處理中,等待消息者(在這個例子中就是等待辦理業務的人)往往註冊壹個回調機制,在所等待的事件被觸發時由觸發機制(在這裏是櫃臺的人)通過某種機制(在這裏是寫在小紙條上的號碼)找到等待該事件的人.

而在實際的程序中,同步消息處理就好比簡單的read/write操作,它們需要等待這兩個操作成功才能返回;而異步處理機制就是類似於select/poll之類的多路復用IO操作,當所關註的消息被觸發時,由消息觸發機制通知觸發對消息的處理.

其次再來解釋壹下阻塞和非阻塞,這兩個概念與程序等待消息(無所謂同步或者異步)時的狀態有關.

繼續上面的那個例子,不論是排隊還是使用號碼等待通知,如果在這個等待的過程中,等待者除了等待消息之外不能做其它的事情,那麽該機制就是阻塞的,表現在程序中,也就是該程序壹直阻塞在該函數調用處不能繼續往下執行.相反,有的人喜歡在銀行辦理這些業務的時候壹邊打打電話發發短信壹邊等待,這樣的狀態就是非阻塞的,因為他(等待者)沒有阻塞在這個消息通知上,而是壹邊做自己的事情壹邊等待.但是需要註意了,第壹種同步非阻塞形式實際上是效率低下的,想象壹下妳壹邊打著電話壹邊還需要擡頭看到底隊伍排到妳了沒有,如果把打電話和觀察排隊的位置看成是程序的兩個操作的話,這個程序需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的;而後者,異步非阻塞形式卻沒有這樣的問題,因為打電話是妳(等待者)的事情,而通知妳則是櫃臺(消息觸發機制)的事情,程序沒有在兩種不同的操作中來回切換.

很多人會把同步和阻塞混淆,我想是因為很多時候同步操作會以阻塞的形式表現出來,比如很多人會寫阻塞的read/write操作,但是別忘了可以對fd設置O_NONBLOCK標誌位,這樣就可以將同步操作變成非阻塞的了;同樣的,很多人也會把異步和非阻塞混淆,因為異步操作壹般都不會在真正的IO操作處被阻塞,比如如果用select函數,當select返回可讀時再去read壹般都不會被阻塞,就好比當妳的號碼排到時壹般都是在妳之前已經沒有人了,所以妳再去櫃臺辦理業務就不會被阻塞.