socket編程中的阻塞與非阻塞

    通常的,對一個文件描述符指定的文件或設備, 有兩種工作方式: 阻塞非阻塞。所謂阻塞方式的意思是指, 當試圖對該文件描述符進行讀寫時, 如果當時沒有東西可讀,或者暫時不可寫, 程序就進入等待狀態, 直到有東西可讀或者可寫爲止。而對於非阻塞狀態, 如果沒有東西可讀, 或者不可寫, 讀寫函數馬上返回, 而不會等待

    在Tcp通信的例子中,很多時候就是採用的阻塞式的工作方式:當接收tcp數據時,如果遠端沒有數據可以讀,則會一直阻塞到讀到需要的數據爲止。這種方式的傳輸和傳統的被動方法的調用類似,非常直觀,並且簡單有效,但是同樣也存在一個效率問題,如果你是開發一個面對着數千個連接的服務器程序,對每一個客戶端都採用阻塞的方式通信,如果存在某個非常耗時的讀寫操作時,其它的客戶端通信將無法響應,效率非常低下。

    一種常用做法是:每建立一個Socket連接時,同時創建一個新線程對該Socket進行單獨通信(採用阻塞的方式通信)。這種方式具有很高的響應速度,並且控制起來也很簡單,在連接數較少的時候非常有效,但是如果對每一個連接都產生一個線程的無疑是對系統資源的一種浪費,如果連接數較多將會出現資源不足的情況。

    另一種較高效的做法是(非阻塞):服務器端保存一個Socket連接列表,然後對這個列表進行輪詢,如果發現某個Socket端口上有數據可讀時(讀就緒),則調用該socket連接的相應讀操作;如果發現某個Socket端口上有數據可寫時(寫就緒),則調用該socket連接的相應寫操作;如果某個端口的Socket連接已經中斷,則調用相應的析構方法關閉該端口。這樣能充分利用服務器資源,效率得到了很大提高。要使用非阻塞方式,只要在程序中調用socket.Blocking=false;即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章