IO多路複用技術(multiplexing)是什麼?

  • 作者:由 懂點IT 發表于 農業
  • 2020-06-12

IO多路複用技術(multiplexing)是什麼?懂點IT2020-06-17 22:40:13

什麼是IO多路複用?

舉個例子:

假設我們需要編寫一個echo伺服器程式,功能是:

響應使用者從標準輸入端鍵入的命令。

接收網路客戶端發起的連線請求。

這其實是2個不同IO事件,該如何等待請求和處理命令呢?

若伺服器在accept中一直等待網路客戶端連線,就不能處理輸入命令,反過來在read中等待使用者鍵入命令,那就不能接受客戶端請求,你會說我們可以使用多程序或多執行緒,但我們希望不要引起多餘的上下文切換,使用單執行緒來處理可以嗎?IO多路複用就是這種解決方法,基本思路是使用select函式,該函式會一直掛起來監聽的輸入IO集合(檔案描述符),只有在一個或多個IO事件發生後(狀態變為可讀),將控制權給應用程式。伺服器使用IO多路複用,藉助select函式監測IO事件的發生,當監聽的檔案描述符變為可讀時(IO事件發生),伺服器就為相應的狀態機執行轉移,IO多路複用基本思就是複用單一或少量執行緒處理多種IO事件,並不是為了更快的處理IO,而是可以同時處理多個IO事件,IO事件可以是標準輸入輸出、socket等。

IO多路複用技術(multiplexing)是什麼?

生活舉例:

好比你去銀行櫃檯,三個視窗只有一個服務員,你去辦理業務相當於IO事件,辦理業務需要填表,這時相當於你的事件還未準備好,服務員可以接收其他視窗的客戶,這種場景相當於服務員一個人(單一程序)監聽了三個視窗的事件(IO事件),每次輪詢詢問每個視窗客戶是否填好了表格,沒好就去下一個視窗詢問,填好了就把這個表格交給後臺人員處理,當然你可以每個視窗安排一個服務人員,併發進行,但計算機不同的是,早期的cpu大多是單核cpu,cpu是分配時間片區做到併發的,相當於一個人一天的工作時間是固定比如8小時,2小時喝茶,2小時打王者等等,只不過這個人的手速很快,幹起活來在你看來好像是瞬間同時完成的,這人就是cpu他就這麼快!多核多cpu那是後來才有的事就另說了。

IO多路複用技術(multiplexing)是什麼?

實現系統IO多路複用的方式有哪些?

這裡不會介紹每個函式的具體用法,只讓讀者總體上對多路複用有一個概念模型,深入瞭解可以參考《深入理解計算機系統》等相關書籍

select函式:

系統中的IO被抽象為檔案描述符,簡單說select函式輪詢這些傳給他的檔案描述符,發現有事件就緒(資料從核心空間到使用者空間卡複製完成),就將資料讀取出來返回給應用程式。

poll函式:

和selec函式比較沒有本質區別,但沒有最大檔案描述數量的限制,檔案描述符使用連結串列來儲存,上限取決於系統最大檔案控制代碼開啟數,select上限是1024個檔案描述符

epoll模式:

select、poll採用輪詢的方式挨個檢測每個檔案描述符是否就緒,如果描述符太多,每次都要迴圈查詢效率太低,能不能使用回撥的方式,當檔案描述符就緒時自動回撥通知,不用每次迴圈,從而讓複雜度從O(n)降低到O(1) , 這也是epoll和前2個最大的區別,可以理解為

event poll,他是一組函式而不是單個函式來實現多路複用的。

應用場景是什麼?

IO多路複用最大應用場景就是用以設計高併發的事件驅動程式,redis是基於記憶體的資料庫,內部使用IO多路複用處理客戶端高併發請求(連線、命令、回覆)

IO多路複用技術(multiplexing)是什麼?

和redis一樣為了邏輯簡潔、高併發、避免鎖的競爭和上下文切換, mysql 執行緒池、nodejs也是基於IO多路複用理念來設計的事件驅動程式。

IO多路複用的優缺點?

優點:

IO多路複用可以用來設計併發事件驅動程式,相比設計基於多程序、多執行緒的併發伺服器程式來說是比較困難的,利用單執行緒處理多種IO事件使有限的資源利用最大化,避免多執行緒的上下文切換、鎖的競爭。

缺點:

但這樣也帶來了編碼複雜,更大缺點是不能充分體現代多核處理器的優勢,更好做法是IO多路複用結合多執行緒的綜合設計理念來設計你的應用程式。

IO多路複用技術(multiplexing)是什麼?愛吃豆餅的小胖子哦2020-06-13 10:05:08

IO多路複用( I/O multiplexing )指的透過單個執行緒管理多個Sock。

簡單的說,透過一個核心程式,管理多個連線,使用者可以間接監聽很多個連線,而不用建立大量的執行緒/程序,當連線的sock有資料的時候,自然會把哪個sock告訴你,你再進行讀寫操作。

關於I/O多路複用(又被稱為“事件驅動”),首先要理解的是,作業系統為你提供了一個功能,當你的某個socket可讀或者可寫的時候,它可以給你一個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效資料而不做純返回-1和EAGAIN的無用功。寫操作類似。作業系統的這個功能透過select/poll/epoll/kqueue之類的系統呼叫函式來使用,這些函式都可以同時監視多個描述符的讀寫就緒狀況,這樣,多個描述符的I/O操作都能在一個執行緒內併發交替地順序完成,這就叫I/O多路複用,這裡的“複用”指的是複用同一個執行緒。

IO多路複用技術(multiplexing)是什麼?

Top