成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文搞懂Select、Poll和Epoll區別

數據庫
select本質上是通過設置或檢查存放fd標志位的數據結構進行下一步處理。

1 select 

select本質上是通過設置或檢查存放fd標志位的數據結構進行下一步處理。

這帶來缺點:

  • 單個進程可監視的fd數量被限制,即能監聽端口的數量有限

單個進程所能打開的最大連接數有FD_SETSIZE宏定義,其大小是32個整數的大小(在32位的機器上,大小就是3232,同理64位機器上FD_SETSIZE為3264),當然我們可以對進行修改,然后            重新編譯內核,但是性能可能會受到影響,這需要進一步的測試

一般該數和系統內存關系很大,具體數目可以cat /proc/sys/fs/file-max察看。32位機默認1024個,64位默認2048。

 


  • 對socket是線性掃描,即輪詢,效率較低:

僅知道有I/O事件發生,卻不知是哪幾個流,只會無差異輪詢所有流,找出能讀數據或寫數據的流進行操作。同時處理的流越多,無差別輪詢時間越長 - O(n)。

當socket較多時,每次select都要通過遍歷FD_SETSIZE個socket,不管是否活躍,這會浪費很多CPU時間。如果能給 socket 注冊某個回調函數,當他們活躍時,自動完成相關操作,即可避免輪詢,這就是epoll與kqueue。

調用過程

缺點

內核需要將消息傳遞到用戶空間,都需要內核拷貝動作。需要維護一個用來存放大量fd的數據結構,使得用戶空間和內核空間在傳遞該結構時復制開銷大。

  • 每次調用select,都需要把fd集合從用戶態拷貝到內核態,這個開銷在fd很多時會很大
  • 同時每次調用select都需要在內核遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大
  • select支持的文件描述符數量太小了,默認是1024 

2 poll

poll的實現和select非常相似,只是描述fd集合的方式不同,poll使用pollfd結構而不是select的fd_set結構,其他的都差不多,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理,但是poll沒有最大文件描述符數量的限制。poll和select同樣存在一個缺點就是,包含大量文件描述符的數組被整體復制于用戶態和內核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨著文件描述符數量的增加而線性增大。

  • 它將用戶傳入的數組拷貝到內核空間
  • 然后查詢每個fd對應的設備狀態:
  • 如果設備就緒,在設備等待隊列中加入一項繼續遍歷
  • 若遍歷完所有fd后,都沒發現就緒的設備

掛起當前進程,直到設備就緒或主動超時,被喚醒后它又再次遍歷fd。這個過程經歷多次無意義的遍歷。

沒有最大連接數限制,因其基于鏈表存儲

缺點

  • 大量fd數組被整體復制于用戶態和內核地址空間間,而不管是否有意義
  • 如果報告了fd后,沒有被處理,那么下次poll時會再次報告該fd 

3 epoll 

可理解為event poll,epoll會把哪個流發生哪種I/O事件通知我們。所以epoll是事件驅動(每個事件關聯fd)的,此時我們對這些流的操作都是有意義的。復雜度也降低到了O(1)。

3.1 觸發模式

EPOLLLT和EPOLLET兩種:

  • LT,默認的模式(水平觸發)

          只要該fd還有數據可讀,每次 epoll_wait 都會返回它的事件,提醒用戶程序去操作,

  • ET是“高速”模式(邊緣觸發)

只會提示一次,直到下次再有數據流入之前都不會再提示,無論fd中是否還有數據可讀。所以在ET模式下,read一個fd的時候一定要把它的buffer讀完,即讀到read返回值小于請求值或遇到EAGAIN錯誤

epoll使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內核就會采用類似回調機制激活該fd,epoll_wait便可收到通知。

3.2 優點

  • 沒有最大并發連接的限制,能打開的FD的上限遠大于1024(1G的內存上能監聽約10萬個端口)
  • 效率提升,不是輪詢,不會隨著FD數目的增加效率下降。只有活躍可用的FD才會調用callback函數
  • 即Epoll最大的優點就在于它只關心“活躍”的連接,而跟連接總數無關,因此在實際的網絡環境中,Epoll的效率就會遠遠高于select和poll
  • 內存拷貝,利用mmap()文件映射內存加速與內核空間的消息傳遞;即epoll使用mmap減少復制開銷。
  • epoll通過內核和用戶空間共享一塊內存來實現的

表面上看epoll的性能最好,但是在連接數少并且連接都十分活躍的情況下,select和poll的性能可能比epoll好,畢竟epoll的通知機制需要很多函數回調。

epoll跟select都能提供多路I/O復用的解決方案。在現在的Linux內核里有都能夠支持,其中epoll是Linux所特有,而select則應該是POSIX所規定,一般操作系統均有實現。

4 總結

select,poll,epoll都是IO多路復用機制,即可以監視多個描述符,一旦某個描述符就緒(讀或寫就緒),能夠通知程序進行相應讀寫操作。

但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負責進行讀寫,異步I/O的實現會負責把數據從內核拷貝到用戶空間。

參考

  • Linux下select/poll/epoll機制的比較
  • select、poll、epoll之間的區別總結[整理]

 

責任編輯:姜華 來源: JavaEdge
相關推薦

2022-02-22 08:55:29

SelectPoll/ Epoll

2023-10-16 08:16:31

Bean接口類型

2022-02-08 10:41:20

Service MeAPI GatewaLinux

2022-03-24 08:51:48

Redis互聯網NoSQL

2024-04-12 12:19:08

語言模型AI

2021-05-31 06:50:47

SelectPoll系統

2025-01-07 00:07:17

2020-12-21 07:54:46

CountDownLa用法源碼

2019-11-06 17:30:57

cookiesessionWeb

2021-12-30 10:30:12

RunC命令Linux

2021-03-22 10:05:59

netstat命令Linux

2023-09-08 08:20:46

ThreadLoca多線程工具

2023-09-15 12:00:01

API應用程序接口

2023-09-22 12:21:33

Python深拷貝淺拷貝

2024-09-27 08:10:57

2023-02-10 10:56:56

KubernetesLimitsRequests

2024-12-30 00:00:05

2023-09-16 19:38:17

Python私有屬性私有方法

2023-09-02 21:27:09

2021-02-28 20:53:37

Cookie存儲瀏覽器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区福利视频 | 精品少妇v888av| 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 国产免费拔擦拔擦8x高清 | 日韩在线播放一区 | 91一区二区三区 | 久在线视频播放免费视频 | 国产精品一区二区免费 | 7777在线视频免费播放 | 亚洲免费久久久 | 亚洲少妇综合网 | 毛片一区二区三区 | 亚洲一区国产精品 | 男女爱爱福利视频 | 中文字幕日韩欧美一区二区三区 | 盗摄精品av一区二区三区 | 午夜99| 日韩资源 | 一区二区精品 | 精品一区二区三区在线视频 | 精品国产乱码久久久久久影片 | 国产精品一区二区av | 精品一级毛片 | 中文在线视频 | 亚洲一区在线日韩在线深爱 | 鲁大师一区影视 | 亚洲欧美一区二区三区国产精品 | 亚洲一区二区精品 | 午夜寂寞福利视频 | 国产高清免费 | 国产精品久久久亚洲 | 精品国产色 | 爱爱综合网 | 久久国产区 | 羞羞的视频在线观看 | 免费视频中文字幕 | 久久免费视频网 | 亚洲第一av | 国产精品一区在线观看你懂的 | 麻豆天堂| 日本在线播放 |