select、poll、epoll都是IO多路複用的機制,其中epoll是Linux特有的。本質上都是同步IO,有設備就緒或超時才能執行後面的動做linux
select與poll:ios
本質上沒有區別,時間複雜度都是O(n);實現上都須要不斷輪詢從用戶空間拷貝過來的文件句柄fd的數組,看是否有設備準備就緒,這樣監測fd越多,開銷越大。數組
但poll機制監測的文件句柄數沒有限制,不一樣於select(通常監測數量1024,能夠經過cat /proc/sys/fs/file_max查看),poll是基於鏈表存儲的。網絡
epoll:多線程
時間複雜度爲O(1),不一樣於select與epoll,epoll使用mmap文件映射,開闢一塊共享空間,用於內核空間與用戶空間的消息傳遞,效率上要高。異步
epoll有兩種觸發方式:EPOLLLT(默認)與EPOLLET(邊緣觸發)。線程
epoll最大的優勢在於它只管理「活躍」的鏈接,而跟鏈接總數無關,所以在實際的網絡環境中,epoll的效率遠高於select和poll。事件
異步IO與多線程:get
linux中關於異步IO的實現有兩種:同步
一、基於glibc的多線程實現,並非正真的異步IO,好比aio_read、aio_write等會經過系統調用到file_operatios中的aio_read和aio_write;
二、linux內核中的異步IO
int io_setup(unsigned nr_events, aio_context_t *ctxp);
功能:用來初始化異步IO的上下文。
其中參數ctxp用來描述異步IO上下文, 參數nr_events表示小可處理的異步IO事件的個數。
int io_submit(io_context_t ctx, long nr, struct iocb *iocbs[]);
功能:提交初始化好的異步讀寫事件。
其中ctx是上文的描述句柄, nr表示提交的異步事件個數。Iocbs是異步事件的結構體。
int io_getevents(io_context_t ctx, long nr, struct io_event *events[], struct timespec *timeout);
功能:得到已經完成的異步IO事件。
其中參數ctx是上下文的句柄,nr 表示指望得到異步IO事件個數,events用來存放已經完成的異步事件的數據,timeout爲超時事件。
int io_destroy(aio_context_t ctx);
功能:用於銷燬異步IO事件句柄。