目錄
- 一、阻塞IO的問題
- 二、I/O多路復用
- 2.1 示意圖
- 2.2 多路在哪里
- 2.3 復用了什么
- 三、多路復用實作
一、阻塞IO的問題
上一篇講了阻塞式IO,在阻塞IO中,如果有大量的并發請求,勢必要針對請求開啟多執行緒,針對每一個請求開啟一個執行緒,這樣每一個執行緒的處理時間就會包含之前的T1+T2這兩個等待資料的時間,白白浪費了服務器的執行緒資源,
服務器核心要做的事情是等資料到了我再做事情,服務器的執行緒處理時間里面只需要包含資料到了后續部分,這樣最大限度的利用了珍貴的服務器執行緒資源,并且由于執行緒的處理時間中沒有包含等待資料的時間,可以使得執行緒快速釋放,
現實生活中的例子,餐廳,阻塞IO類似于每來一個客人我馬上分配一個廚師,讓廚師等著客人點餐,然后再去做飯,廚師的作業就是做飯,但是在這個例子中,他卻把時間白白浪費到了等待客人點單上,
如果有新的客人來,這個時候還得再分一個廚師給他,如果高峰時候,客人太多,一個客人分配一個廚師,廚師就會不夠用,但是很多廚師卻不是在忙著做飯,而是在盯著客人等待選單,廚師的利用率非常低,

二、I/O多路復用
IO多路復用的核心便是解決服務器執行緒包含資料等待的時間的問題,
引入一個觀察者執行緒,專門去監聽系統IO,如果發現有資料ready了,便分配一個執行緒去處理,
改良餐廳的模式,老板招聘一個服務員,讓服務員看著客人,如果有客人點餐結束,他立刻把點好的單子通知廚師,讓廚師進行做飯,比如在兩個客人先后到達,第一個客人點餐很快,菜也很簡單,廚師小張很快就做完了第一個客人的飯,這個時候第二個客人的餐也點完了,廚師小張可以繼續為第二個客人做飯,很明顯,效率極大提升,
2.1 示意圖

2.2 多路在哪里
多路是指多個IO輸入,在本例中,是指多個客人,
2.3 復用了什么
復用的就是那個觀察者執行緒,本例中就是那個服務員,
三、多路復用實作

在linux中多路復用是通過epoll(類似于服務員)來實作的,epoll會監控已經連接的Socket(類似于客人),當socket對應的IO變為可讀后(客人點完了菜),通知應用行程(類似于廚師)進行讀取,應用行程把資料從內核復制到用戶空間的程序,就類似于廚師,
epoll為什么能夠快速的監控到IO就緒,組員專門來介紹,本文暫時不做說明,select,和poll是之前的實作,epoll是最新的實作,性能最好,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/228445.html
標籤:其他
上一篇:通過TCP互動以及Socket API來看阻塞式IO
下一篇:檢查網路是否正常的幾種命令

