select方式:使用fd_set結構體告訴核心同時監控那些檔案控制代碼,使用逐個排查方式去檢查是否有檔案控制代碼就緒或者超時。該方式有以下缺點:檔案控制代碼數量是有上線的,逐個檢查吞吐量低,每次呼叫都要重複初始化fd_set。
poll方式:該方式主要解決了select方式的2個缺點,檔案控制代碼上限問題(連結串列方式儲存)以及重複初始化問題(不同欄位標註關注事件和發生事件),但是逐個去檢查檔案控制代碼是否就緒的問題仍然沒有解決。
epoll方式:該方式可以說是C10K問題的killer,他不去輪詢監聽所有檔案控制代碼是否已經就緒。epoll只對發生變化的檔案控制代碼感興趣。其工作機制是,使用"事件"的就緒通知方式,透過epoll_ctl註冊檔案描述符fd,一旦該fd就緒,核心就會採用類似callback的回撥機制來啟用該fd, epoll_wait便可以收到通知, 並通知應用程式。而且epoll使用一個檔案描述符管理多個描述符,將使用者程序的檔案描述符的事件存放到核心的一個事件表中, 這樣資料只需要從核心快取空間複製一次到使用者程序地址空間。而且epoll是透過核心與使用者空間共享記憶體方式來實現事件就緒訊息傳遞的,其效率非常高。但是epoll是依賴系統的(Linux)。
非同步I/O以及Windows,該方式在windows上支援很好,這裡就不具體介紹啦。
select方式:使用fd_set結構體告訴核心同時監控那些檔案控制代碼,使用逐個排查方式去檢查是否有檔案控制代碼就緒或者超時。該方式有以下缺點:檔案控制代碼數量是有上線的,逐個檢查吞吐量低,每次呼叫都要重複初始化fd_set。
poll方式:該方式主要解決了select方式的2個缺點,檔案控制代碼上限問題(連結串列方式儲存)以及重複初始化問題(不同欄位標註關注事件和發生事件),但是逐個去檢查檔案控制代碼是否就緒的問題仍然沒有解決。
epoll方式:該方式可以說是C10K問題的killer,他不去輪詢監聽所有檔案控制代碼是否已經就緒。epoll只對發生變化的檔案控制代碼感興趣。其工作機制是,使用"事件"的就緒通知方式,透過epoll_ctl註冊檔案描述符fd,一旦該fd就緒,核心就會採用類似callback的回撥機制來啟用該fd, epoll_wait便可以收到通知, 並通知應用程式。而且epoll使用一個檔案描述符管理多個描述符,將使用者程序的檔案描述符的事件存放到核心的一個事件表中, 這樣資料只需要從核心快取空間複製一次到使用者程序地址空間。而且epoll是透過核心與使用者空間共享記憶體方式來實現事件就緒訊息傳遞的,其效率非常高。但是epoll是依賴系統的(Linux)。
非同步I/O以及Windows,該方式在windows上支援很好,這裡就不具體介紹啦。