【Netty專欄】三、IO多路複用

一、背景

 在I/O編程過程中,當需要同時處理多個客戶端接入請求時,可以利用多線程或者I/O複用技術進行處理。

二、什麼是IO多路複用?

通過把多個I/O的阻塞複用到一個select的阻塞上,從而使得系統在單線程的情況下可以同時處理多個客戶端請求。

三、應用場景

  • 服務器需要同時處理多個處於監聽狀態或者多個連接狀態的套接字。(即多個客戶端)
  • 服務器需要同時處理多種網絡協議的套接字。(即多個網絡協議)

四、 優勢

與傳統多線程、多進程模型相比,IO多路複用的最大優勢是系統開銷小,系統不需要創建新的額外的進程或線程,也不需要維護這些線程和進程的運行,降低了系統的維護工作量,節省了系統資源。

五、支持I/O多路複用的系統

        目前支持I/O多路複用的系統調用有select、pselect、poll、epoll,在Linux網絡編程過程中,很長一段時間都使用select做輪詢和網絡事件通知,然而select的一些缺陷導致它的應用有很大的限制,最終Linux選擇了epoll作爲select的替代方案。epoll和select原理相似,但其相對於select做了重大改進。

1、支持一個進程打開的socket描述符(fd)不受限制(僅受限於操作系統的最大文件句柄數)。

select最大缺陷就是單個進程所打開的FD是有一定限制的,它由FD_SETSIZE設置,默認是1024。這對於那些需要支持上萬個TCP連接的大型服務器來說顯然太少了。我們可以選擇修改這個宏然後重新編譯內核或者選擇多進程的方案,但是其必然會帶來網絡效率的下降和多進程間的切換造成額外的系統開銷,同時增加了程序複雜的,這顯然不是一種完美的解決方案。相反,epoll並沒有這種限制,它所支持的FD上限是操作系統的最大文件句柄數,這個數字遠遠大於1024。例如:在1GB內存的機器上大約是10萬個句柄左右,具體值可以通過cat /proc/sys/fs/file-max 查看,通常情況下這個值和系統的內存關係較大。

2、I/O效率不會隨着FD數目的增加而線性下降。

傳統的select/poll一個致命弱點就是當你擁有一個很大的socket集合,由於網絡延時或者鏈路空閒,任一時刻只有少量的socket是活躍的,但是select/poll每次調用都會線性掃描全部的集合,導致效率呈現線性下降。epoll不存在這個問題,它只會對活躍的socket進行操作,這是因爲epoll是根據每個FD上面的callback函數實現的,那麼,只有活躍的socket纔會主動去調用callback函數。

3、使用mmap加速內核與用戶空間的消息傳遞。

無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就顯得非常重要。epoll通過內核和用戶空間mmap(內存映射)同一塊內存實現。

4、epoll的API更加簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章