目錄
三、多路復用實現
伺服器核心要做的事情是等資料到了我再做事情。伺服器的執行緒處理時間裡面只需要包含資料到了後續部分。這樣最大限度的利用了珍貴的伺服器執行緒資源,並且由於執行緒的處理時間中沒有包含等待資料的時間,可以使得執行緒快速釋放。
現實生活中的例子,餐廳,阻塞io類似於每來乙個客人我馬上分配乙個廚師,讓廚師等著客人點餐,然後再去做飯,廚師的工作就是做飯,但是在這個例子中,他卻把時間白白浪費到了等待客人點單上。如果有新的客人來,這個時候還得再分乙個廚師給他,如果高峰時候,客人太多,乙個客人分配乙個廚師,廚師就會不夠用,但是很多廚師卻不是在忙著做飯,而是在盯著客人等待選單。廚師的利用率非常低。
io多路復用的核心便是解決伺服器執行緒包含資料等待的時間的問題。
引入乙個觀察者執行緒,專門去監聽系統io,如果發現有資料ready了,便分配乙個執行緒去處理。
改良餐廳的模式,老闆招聘乙個服務員,讓服務員看著客人,如果有客人點餐結束,他立刻把點好的單子通知廚師,讓廚師進行做飯。比如在兩個客人先後到達,第乙個客人點餐很快,菜也很簡單,廚師小張很快就做完了第乙個客人的飯。這個時候第二個客人的餐也點完了,廚師小張可以繼續為第二個客人做飯,很明顯,效率極大提公升。多路是指多個io輸入,在本例中,是指多個客人。
復用的就是那個觀察者執行緒,本例中就是那個服務員。
在linux中多路復用是通過epoll(類似於服務員)來實現的。epoll會監控已經連線的socket(類似於客人),當socket對應的io變為可讀後(客人點完了菜),通知應用程序(類似於廚師)進行讀取,應用程序把資料從核心複製到使用者空間的過程,就類似於廚師。
epoll為什麼能夠快速的監控到io就緒,組員專門來介紹,本文暫時不做說明。select,和poll是之前的實現,epoll是最新的實現,效能最好。非阻塞套接字與IO多路復用
我們了解了socket之後已經知道,普通套接字實現的服務端的缺陷 一次只能服務乙個客戶端!並且,為了使乙個客戶端能夠不斷收發訊息,我們還要使用while迴圈來輪詢,這極大地降低了我們的效率 accept阻塞!在沒有新的套接字來之前,不能處理已經建立連線的套接字的請求 recv 阻塞!在沒有接受到客戶...
非同步 非阻塞和IO多路復用總結
nginx是併發處理框架的代表者,很多後台業務都會放在nginx容器中執行,以實現高吞吐,而nginx能夠支援高併發也是由於使用了非同步非阻塞處理模型,本文將用通俗的話講解非同步 同步 阻塞 非阻塞的區別,以及io多路復用。一 同步和非同步 同步與非同步的重點是在訊息通知的方式上,也就是呼叫後結果通...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...