1. 程式人生 > 其它 >I/O複用

I/O複用

概述

1. I/O複用本質上是一種通知機制,用於通知某些事件的發生,常用的I/O複用機制有select、poll、epoll三種

2. I/O複用可以同時監聽多個檔案描述符,但是I/O複用本身是阻塞的

三種I/O複用的比較

1. 三種I/O複用都是通過某種結構體變數告訴核心需要監聽哪些檔案描述符上的哪些事件

(1)select使用fd_set,fd_set沒有將檔案描述符合需要監聽的事件進行繫結,因此需要select需要提供3個該型別的引數來分別用來監聽可讀、可寫以及異常事件,此外,核心直接對fd_set進行修改,因此下次使用select系統呼叫前需要進行重置fd_set

(2)poll使用pollfd結構體變數來告知核心,該結構體可以註冊一個檔案描述符上的多個事件,需要監聽事件通過位或的方式註冊在pollfd結構體中的events變數中,當核心監聽到就緒事件後,會修改pollfd中的revents變數中,不會修改原有的註冊事件,因此下次呼叫poll系統呼叫時無需像select那樣進行重置

(3)epoll使用了一種完全不同的方式來管理檔案描述符及其上註冊的事件,它在核心事件中維護一個事件表,通過epoll_ctl來實現核心事件表的新增、刪除和修改

(4)select、poll以及epoll_wait都會返回就緒的檔案描述符的總數,但是epoll_wait會使用一個epoll_evnents陣列來返回就緒的事件,因此只需要通過O(1)的複雜度就可以找到就緒的檔案描述符,而select和poll需要通過O(n)的時間複雜度遍歷整個檔案描述符找到就緒的事件

2. poll和epoll_wait最多能監聽的檔案描述符的數目能夠達到系統允許開啟的最大檔案描述符資料,而select能夠監聽的最大檔案描述符的數目通常有限制

3. select和poll只支援低效的電平觸發模式(LT模式),而epoll可以工作在高效地邊沿觸發模式(ET模式)

4. 在核心實現上,select和poll都是採用輪詢的方式,每次都要掃描整個註冊檔案描述符集合,因此檢測就緒事件的演算法的時間複雜度O(n),epoll_wait採用回撥的方式,核心檢測到就緒的檔案描述符時,將觸發回撥函式,該回調函式將該檔案描述符上的就緒事件插入就緒事件佇列中,核心在最後合適的時機將該就緒佇列拷貝到使用者空間,因此epoll不需要輪詢整個檔案描述符集合來檢測就緒事件,時間複雜度O(1)