阻塞和非阻塞的深刻理解 轉

2022-08-14 21:18:14 字數 844 閱讀 4572

阻塞和非阻塞的深刻理解 原來是借助於i/o多路復用,即借助於系統核心去監聽檔案描述符狀態,因為應用程式監聽還要呼叫核心去監聽,這樣省去一步。**)

阻塞和非阻塞

阻塞函式在完成其指定的任務以前不允許程式呼叫另乙個函式。例如,程式執行乙個讀資料的函式呼叫時,在此函式完成讀操作以前將不會執行下一程式語句。當伺服器執行到accept語句時,而沒有客戶連線服務請求到來,伺服器就會停止在accept語句上等待連線服務請求的到來。這種情況稱為阻塞(blocking)。而非阻塞操作則可以立即完成。比如,如果你希望伺服器僅僅注意檢查是否有客戶在等待連線,有就接受連線,否則就繼續做其他事情,則可以通過將socket設定為非阻塞方式來實現。非阻塞socket在沒有客戶在等待時就使accept呼叫立即返回。

#include

#include

…… sockfd = socket(af_inet,sock_stream,0);

fcntl(sockfd,f_setfl,o_nonblock);

…… 通過設定socket為非阻塞方式,可以實現"輪詢"若干socket。當企圖從乙個沒有資料等待處理的非阻塞socket讀入資料時,函式將立即返回,返回值為-1,並置errno值為ewouldblock。但是這種"輪詢"會使cpu處於忙等待方式,從而降低效能,浪費系統資源。而呼叫select()會有效地解決這個問題,它允許你把程序本身掛起來,而同時使系統核心監聽所要求的一組檔案描述符的任何活動,只要確認在任何被監控的檔案描述符上出現活動,select()呼叫將返回指示該檔案描述符已準備好的資訊,從而實現了為程序選出隨機的變化,而不必由程序本身對輸入進行測試而浪費cpu開銷。

select用於實現i/o多路復用,防止函式沒有得到資源而阻塞,長期占用cpu.

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...

阻塞 非阻塞socket的理解

b 阻塞socket是這樣的 b recv socket1,buf,length 去網絡卡緩衝區讀取socket1的資料,讀到的資料儲存到buf 如果網絡卡緩衝區有1個位元組,就返回1個,有兩個就返回兩個,當然不能超過length 如果網絡卡緩衝區沒有資料,那麼就一直等待,直到有資料可讀 是的,很傻...

同步 非同步 阻塞和非阻塞的理解

這一段來自 處理大併發之一 對非同步非阻塞的理解 阻塞 執行緒在執行中如果遇到 i o 操作 如磁碟讀寫或網路通訊,通常要耗費較長的時間,這時作業系統會剝奪這個執行緒的 cpu 控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為 阻塞。當 i o 操作完畢時,作業系統將這個...