1. 程式人生 > 實用技巧 >IO多路複用

IO多路複用

概要

使用非阻塞IO 的應用程式通常使用IO多路複用函式 查詢裝置是否可以立即訪問。IO多路複用 對應的驅動需要實現檔案操作的POLL()函式。
IO多路函式呼叫的時候,每個驅動的poll()介面會呼叫到,執行IO多路函式的程序被掛到每個驅動的等待佇列上,可以被任何一個驅動喚醒。

poll函式實現模板

poll(struct file *file, poll_table *wait)
{
 poll_wait(file,自己定義的等待佇列Q,wait); // 向poll_table新增等待佇列

 if(資料可讀)
  return POLLIN|POLLRDNORM;

 if(資料可寫)
  return POLLOUT|POLLWRNORM;

 return 0; // 返回0,呼叫程序被設定為休眠狀態,同時掛到自定義的等待佇列Q上,當有資料讀寫時,
       // 呼叫wake_up_interruptible(Q)喚醒呼叫程序,呼叫程序重新呼叫poll()方法,返回POLLIN或POLLOUT。
}

使用者空間程式設計介面

select()
poll()
epoll()  // 不會隨fd數目增長而降低效能,select和poll則會.

epll機制的使用者空間程式設計介面:
epoll_create()
epoll_ctl()
epoll_wait()

epoll監聽事件:
EPOLLET: 設定fd為edge triggered模式。預設是level triggered模式。LT就是核心通知應用fd就緒後,如果應用不執行IO操作,核心會多次傳送通知。 而ET模式就是核心通知應用fd就緒後,假設應用已經處理不會再發送通知。
EPOLLONESHOT: 指一次性監聽。即監聽完fd事件後,如果需要繼續監聽那麼需要再次把fd加入到epoll佇列裡。