IO多路複用
阿新 • • 發佈:2020-12-04
概要
使用非阻塞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佇列裡。