1、阻塞與非阻塞服務器
一般的,對一個文件描述符指定的文件或設備, 有兩種工做方式:阻塞與非阻塞。所謂阻塞方式的意思是指, 當試圖對該文件描述符進行都寫時,若是當時沒有東西可讀,或者暫時不可寫, 程序就會進入等待狀態,直到有東西可讀或可寫爲止,而對於非阻塞狀態, 若是沒有東西可讀, 或者不可寫, 讀寫函數立刻返回, 而不會等待異步
2、阻塞與非阻塞方式的作法:socket
一種經常使用作法是:每創建一個Socket連接時, 同時創建一個新線程對該Socket進行單獨通訊(採用阻塞的方式通訊)。這種方式具備很高的響應速度,而且控制起來也很簡單, 在連接數較少的時候很是有效, 可是若是對每個連接都產生一個線程,無疑是對系統資源的一種浪費, 若是連接數較多將會出現資源不足的狀況函數
一種較高效的作法是:服務保持一個Socket連接列表, 而後對這個列表進行輪詢, 若是發現某個Socket端口上有數據可讀時(讀就緒),則調用該socekt連接的相應讀操做;若是發現某個socekt端口上有數據可寫時(寫就緒),則調用該socket連接的相應寫操做;若是某個端口的Socket連接已將中斷, 則調用相應阿析構方法關閉該端口。這樣能充分利用服務器資源, 效率獲得了很大提升線程
3、非阻塞式的核心優點事件
傳統的阻塞式IO, 每一個連接必需要開一個線程來處理, 而且沒處理完線程不能退出 非阻塞式IO, 居於反應器模式,用於時間多路分離和分派的體系結構模式, 因此能夠利用線程池來處理。事件來了就處理, 處理完了就把線程歸還。而傳統阻塞方式不能使用線程池來處理,假設當前有10000個連接, 非阻塞方式可能用1000個線程的線程池就搞定了,而傳統阻塞方式就須要開10000個來處理。若是連接較多將會出現資源不足的狀況。非阻塞式核心有時就在這裏資源
4、非阻塞式的核心優點分析效率
爲何會這樣,下面就對他們作進一步細緻具體的分析: 首先,咱們來分析傳統阻塞式IO的瓶頸在哪裏。在連接很少的狀況下, 傳統IO編寫容易方便使用。可是隨着連接數的增多, 傳統IO就不行了。由於前面說過, 傳統IO處理每一個連接都要消耗一個線程, 而程序的效率當線程數很少時隨着線程數的增長而增長, 可是到必定數量以後, 是隨着線程數的增長而減小。這裏咱們的出結論,傳統阻塞式IO的瓶頸在於不能處理過多的連接 而後, 非阻塞式IO的出現目的就是爲了解決這個瓶頸。而非阻塞式IO是怎麼實現的呢?非阻塞式IO處理連接的線程數和連接數是沒有聯繫的,也就是說處理10000個連接非阻塞IO不須要10000個線程, 你能夠用1000個也能夠用2000個線程來處理。由於非阻塞式IO處理連擊是異步的。當某個連接發送請求到服務器,服務器把這個連接請求看成一個請求"事件",並把這個"事件"分配給相應的函數處理。咱們能夠把這個處理函數放到線程中去執行,執行完就把線程歸還。這樣一個線程就能夠異步的處理多個事件。而阻塞式IO的線程的大部分時間都浪費在等待請求上了線程池
5、總結請求
阻塞式IO 1 優勢: 編寫容易方便使用 2 缺點: 處理每一個連接都要消耗一個線程,當線程達到某個數目時,程序的效率會下降; 當連接較多將會出現資源不足的狀況
非阻塞式IO 1 優勢: 解決了傳統阻塞式IO的瓶頸在於不能處理過多的連接