阻塞和非阻塞指
的是在接收和傳送時是否等待動作完成才返回;
舉例:阻塞
block
是指,你撥通某人
的**,但是此人不在,於是你拿著**等他回來,其間不能再用**。
非阻塞
nonblock
是指,你撥通某人
的**,但是此人不在,於是你結束通話**,待會兒再打。至於到時候他回來沒有,只有打了**才知道。即所謂的
「輪詢
/ poll」
阻塞和非阻塞只是應用在請求
的讀取和傳送。
或簡單點說:
阻塞就是幹不完不准回來;
非阻塞就是你先
幹,我先看看有其他事沒有,完了告訴我一聲
比如你呼叫send函式傳送一定的byte,在系統內部send做的工作其實只是把資料傳輸(copy)到tcp/ip協議棧的輸出緩衝區,它執行成功並不代表資料已經成功的傳送出去了,如果tcp/ip協議棧沒有足夠的可用緩衝區來儲存你copy過來的資料的話...這時候就體現出阻塞
和非阻塞的不同之處了:對於阻塞模式的
socket
send函式將不返回直到系統緩衝區有足夠的空間把你要傳送的資料copy過去以後才返回,而對於非阻塞的
socket
來說send會立即返回wsaewoulddblock告訴呼叫者說:"傳送操作被阻塞了!!!你想辦法處理吧..."
對於recv函式,同樣道理,該函式的內部工作機制其實是在等待tcp/ip協議棧的接收緩衝區通知它說:嗨,你的資料來了.對於阻塞模式的
socket
來說如果tcp/ip協議棧的接收緩衝區沒有通知乙個結果給它它就一直不返回:耗費著系統資源....對於非阻塞模式的
socket
該函式會馬上返回,然後告訴你:wsaewoulddblock---"現在沒有資料,回頭在來看看"
阻塞阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞呼叫
和同步呼叫等同起來,實際上他是不同的。對於同 步調用來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。例如,我們在csocket中呼叫receive函式,如果緩衝區中沒有數 據,這個函式就會一直等待,直到有資料才返回。而此時,當前執行緒還會繼續處理各種各樣的訊息。如果主視窗
和呼叫函式在同乙個執行緒中,除非你在特殊的介面操 作函式中呼叫,其實主介面還是應該可以重新整理。
socket
接收資料的另外乙個函式recv則是乙個阻塞呼叫的例子。當
socket
工作在阻塞模式的時候, 如果沒有資料的情況下呼叫該函式,則當前執行緒就會被掛起,直到有資料為止。
非阻塞非阻塞
和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。
物件的阻塞模式
和阻塞函式呼叫
物件是否處於阻塞模式
和函式是不是阻塞呼叫有很強的相關性,但是並不是一一對應的。阻塞物件上可以有非阻塞的呼叫方式,我們可以通過一定的api去輪詢狀 態,在適當的時候呼叫阻塞函式,就可以避免阻塞。而對於非阻塞物件,呼叫特殊的函式也可以進入阻塞呼叫。函式select就是這樣的乙個例子。
阻塞非阻塞
阻塞和非阻塞 阻塞 可用在assign語句和always語句中,表示只要源訊號發生變化,目標訊號就立刻完成賦值操作,在always塊中,結果與語句順序有關,在always塊中是順序關係 非阻塞 只能用在always語句中,表示該語句結束時完成賦值操作,結果與語句順序無關,並行關係 可以這樣理解 阻塞...
阻塞 非阻塞 select epoll
著作權歸作者所有。首先我們來定義流的概念,乙個流可以是檔案,socket,pipe等等可以進行i o操作的核心物件。不管是檔案,還是套接字,還是管道,我們都可以把他們看作流。之後我們來討論i o的操作,通過read,我們可以從流中讀入資料 通過write,我們可以往流寫入資料。現在假定乙個情形,我們...
阻塞和非阻塞
在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...