IO多路複用、非阻塞式IO

1、阻塞IO的問題

上一篇講了阻塞式IO,在阻塞IO中,若是有大量的併發請求,勢必要針對請求開啓多線程,針對每個請求開啓一個線程,這樣每個線程的處理時間就會包含以前的T1+T2這兩個等待數據的時間,白白浪費了服務器的線程資源。linux

服務器核心要作的事情是等數據到了我再作事情。服務器的線程處理時間裏面只須要包含數據到了後續部分。這樣最大限度的利用了珍貴的服務器線程資源,而且因爲線程的處理時間中沒有包含等待數據的時間,可使得線程快速釋放。服務器

現實生活中的例子,餐廳,阻塞IO相似於每來一個客人我立刻分配一個廚師,讓廚師等着客人點餐,而後再去作飯,廚師的工做就是作飯,可是在這個例子中,他卻把時間白白浪費到了等待客人點單上多線程

若是有新的客人來,這個時候還得再分一個廚師給他,若是高峯時候,客人太多,一個客人分配一個廚師,廚師就會不夠用,可是不少廚師卻不是在忙着作飯,而是在盯着客人等待菜單。廚師的利用率很是低。併發

2、I/O多路複用

IO多路複用的核心即是解決服務器線程包含數據等待的時間的問題。socket

引入一個觀察者線程,專門去監聽系統IO,若是發現有數據ready了,便分配一個線程去處理。性能

改良餐廳的模式,老闆招聘一個服務員,讓服務員看着客人,若是有客人點餐結束,他馬上把點好的單子通知廚師,讓廚師進行作飯。好比在兩個客人前後到達,第一個客人點餐很快,菜也很簡單,廚師小張很快就作完了第一個客人的飯。這個時候第二個客人的餐也點完了,廚師小張能夠繼續爲第二個客人作飯,很明顯,效率極大提高。
線程

2.1 示意圖

2.2 多路在哪裏

多路是指多個IO輸入,在本例中,是指多個客人。blog

2.3 複用了什麼

複用的就是那個觀察者線程,本例中就是那個服務員。進程

3、多路複用實現

在linux中多路複用是經過epoll(相似於服務員)來實現的。epoll會監控已經鏈接的Socket(相似於客人),當socket對應的IO變爲可讀後(客人點完了菜),通知應用進程(相似於廚師)進行讀取,應用進程把數據從內核複製到用戶空間的過程,就相似於廚師。資源

epoll爲何可以快速的監控到IO就緒,組員專門來介紹,本文暫時不作說明。select,和poll是以前的實現,epoll是最新的實現,性能最好。

相關文章
相關標籤/搜索