在網絡編程中,我們經常會遇到阻塞、非阻塞、同步、異步這兩組概念,許多人很容易混淆,現在就給大伙兒說說我對着兩組概念的理解。
先說說阻塞與非阻塞,這主要和程序等待消息時的狀態有關
1、阻塞
程序會阻塞在某一個函數,而不往下執行,就如掛在那里一樣,所有的其他業務也都不執行,為一直等到消息到來才往下執行。
2、非阻塞
程序不會阻塞在某一個函數,不等待消息到來,立即返回,往下執行。
舉個例子,TCP協議中的send,系統會為其分配一塊發送緩存區,假設現在總的緩存 區的大小為1000.,而緩存區里已經有了500個數據,這時調用send,發送1000個字節數據,這時如果在阻塞模式下,send的會先最多的數據放入緩存,直到緩存區滿,然后程序就會阻塞在那里,一直等到將所有數據全部發出去為止,而如果在非阻塞模式下,send的會先將最多的數據放入緩存之后,就馬上返回,剩余數據下回接着發送,不會卡在send函數中。
同步和異步這兩個概念,其實是與消息通知機制有關的。
1、同步
發送消息,等待消息處理完后,才往下執行。就如MFC里的SendMessage(),
2、異步
發送消息,不等待消息處理完,就往下執行,讓后通過特定的接口或者事件,消息通知你事情完成了。如MFC里的PostMessage()
粗略的講了一下以上的兩個概念,估計大家會問,那么阻塞與同步,非阻塞與異步有啥區別,用例說明。
比如我們現在去銀行,你可以選擇兩種方式,取票等待和排隊等待,如果你排隊等待,你就得等前面所有人都辦理完了,才能辦理業務,此時如果在等待的過程中,你啥事都不能干,這時你就處於阻塞狀態了,如果你還能一邊打電話,一邊喝飲料,看書,不過你還得時不時的抬頭看看,前面的人還有多少,啥時候輪到你,免的錯過辦理,這時你就是處於同步狀態。
也就是說,阻塞就是程序掛在那里,其他一切事情都不能做,直到當前事件返回為止,而同步得再原地等待消息,而與此同時,不影響其他業務的執行,體現在程序里就是其他線程的業務處理。
如果你取票等待,那么你只要坐在椅子上,這時你可以做你想做的事情,比如聽聽歌,看看書,打打電話,而到你時,窗口會自動叫號通知你,這時你就處於非阻塞狀態。
如果此時你還覺得不過癮,想出去溜達溜達,那么你可以和大廳的工作人員說一下,我去哪里,待會到我了,到某某地方通知我一下,然后你就可以出去做你想做的事情,直到工作人員來叫你為止。這時你就是處於異步狀態。兩者結合起來就是所謂的異步非阻塞模式,這種由於效率很高,在網絡編程里經常被用到。