阻塞、非阻塞
阻塞和非阻塞指的是在接收和發(fā)送時是否等待動作完成才返回;
舉例:
阻塞block是指,你撥通某人的電話,但是此人不在,于是你拿著電話等他回來,其間不能再用電話。
非阻塞?nonblock?是指,你撥通某人的電話,但是此人不在,于是你掛斷電話,待會兒再打。至于到時候他回來沒有,只有打了電話才知道。即所謂的“輪詢?/?poll”
阻塞和非阻塞只是應(yīng)用在請求的讀取和發(fā)送。?
或簡單點(diǎn)說:
阻塞就是干不完不準(zhǔn)回來;???
非阻塞就是你先干,我先看看有其他事沒有,完了告訴我一聲
比如你調(diào)用send函數(shù)發(fā)送一定的Byte,在系統(tǒng)內(nèi)部send做的工作其實(shí)只是把數(shù)據(jù)傳輸(Copy)到TCP/IP協(xié)議棧的輸出緩沖區(qū),它執(zhí)行成功并不代表數(shù)據(jù)已經(jīng)成功的發(fā)送出去了,如果TCP/IP協(xié)議棧沒有足夠的可用緩沖區(qū)來保存你Copy過來的數(shù)據(jù)的話...這時候就體現(xiàn)出阻塞和非阻塞的不同之處了:對于阻塞模式的socket?send函數(shù)將不返回直到系統(tǒng)緩沖區(qū)有足夠的空間把你要發(fā)送的數(shù)據(jù)Copy過去以后才返回,而對于非阻塞的socket來說send會立即返回WSAEWOULDDBLOCK告訴調(diào)用者說:"發(fā)送操作被阻塞了!!!你想辦法處理吧..."
對于recv函數(shù),同樣道理,該函數(shù)的內(nèi)部工作機(jī)制其實(shí)是在等待TCP/IP協(xié)議棧的接收緩沖區(qū)通知它說:嗨,你的數(shù)據(jù)來了.對于阻塞模式的socket來說如果TCP/IP協(xié)議棧的接收緩沖區(qū)沒有通知一個結(jié)果給它它就一直不返回:耗費(fèi)著系統(tǒng)資源....對于非阻塞模式的socket該函數(shù)會馬上返回,然后告訴你:WSAEWOULDDBLOCK---"現(xiàn)在沒有數(shù)據(jù),回頭在來看看"
阻塞
?????阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起。函數(shù)只有在得到結(jié)果之后才會返回。有人也許會把阻塞調(diào)用和同步調(diào)用等同起來,實(shí)際上他是不同的。對于同 步調(diào)用來說,很多時候當(dāng)前線程還是激活的,只是從邏輯上當(dāng)前函數(shù)沒有返回而已。例如,我們在CSocket中調(diào)用Receive函數(shù),如果緩沖區(qū)中沒有數(shù) 據(jù),這個函數(shù)就會一直等待,直到有數(shù)據(jù)才返回。而此時,當(dāng)前線程還會繼續(xù)處理各種各樣的消息。如果主窗口和調(diào)用函數(shù)在同一個線程中,除非你在特殊的界面操 作函數(shù)中調(diào)用,其實(shí)主界面還是應(yīng)該可以刷新。socket接收數(shù)據(jù)的另外一個函數(shù)recv則是一個阻塞調(diào)用的例子。當(dāng)socket工作在阻塞模式的時候, 如果沒有數(shù)據(jù)的情況下調(diào)用該函數(shù),則當(dāng)前線程就會被掛起,直到有數(shù)據(jù)為止。
非阻塞
??????非阻塞和阻塞的概念相對應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當(dāng)前線程,而會立刻返回。對象的阻塞模式和阻塞函數(shù)調(diào)用
對象是否處于阻塞模式和函數(shù)是不是阻塞調(diào)用有很強(qiáng)的相關(guān)性,但是并不是一一對應(yīng)的。阻塞對象上可以有非阻塞的調(diào)用方式,我們可以通過一定的API去輪詢狀 態(tài),在適當(dāng)?shù)臅r候調(diào)用阻塞函數(shù),就可以避免阻塞。而對于非阻塞對象,調(diào)用特殊的函數(shù)也可以進(jìn)入阻塞調(diào)用。函數(shù)select就是這樣的一個例子。
總結(jié)
- 上一篇: delphi Winsock非阻塞模式详
- 下一篇: 同步、异步