目錄
linux中poll和select有什麼區別
首頁 運維 linux運維 linux中poll和select有什麼差別

linux中poll和select有什麼差別

Jul 11, 2022 pm 05:00 PM
linux

linux中poll和select的區別是:select單一進程所能打開的最大連接數由「FD_SETSIZE」宏定義,其大小是32個整數的大小,而poll因為採用鍊錶存儲,所以沒有最大連線數的限制。

linux中poll和select有什麼差別

本教學操作環境:linux7.3系統、Dell G3電腦。

linux中poll和select有什麼區別

每個程序使用的select有最大連接數限制,只能有FD_SETSIZE個,而poll沒有這樣的限制(採用鍊錶儲存);

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

select:

select本質上是透過設定或檢查存放fd標誌位的資料結構來進行下一步處理。這樣帶來的缺點是:

1、 單一進程可監視的fd數量被限制,也就是能監聽埠的大小有限。

      一般來說這個數目和系統記憶體關係很大,具體數目可以cat /proc/sys/fs/file-max察看。 32位元機預設是1024個。 64位元機預設是2048.

2、 對socket進行掃描時是線性掃描,也就是採用輪詢的方法,效率較低:

       當套接字比較多的時候,每次select()都要透過遍歷FD_SETSIZE個Socket來完成調度,不管哪個Socket是活躍的,都遍歷一遍。這會浪費很多CPU時間。如果能為套接字註冊某個回呼函數,當他們活躍時,自動完成相關操作,那就避免了輪詢,這正是epoll與kqueue所做的。

3、需要維護一個用來存放大量fd的資料結構,這樣會使得使用者空間和核心空間在傳遞該結構時複製開銷大

##poll:

poll本質上和select沒有區別,它將使用者傳入的陣列拷貝到核心空間,然後查詢每個fd對應的裝置狀態,如果裝置就緒則在裝置等待佇列中加入一項並繼續遍歷,如果遍歷完所有fd後沒有發現就緒設備,則掛起當前進程,直到設備就緒或主動超時,被喚醒後它又要再次遍歷fd。這個過程經歷了多次無謂的遍歷。

它沒有最大連接數的限制,原因是它是基於鍊錶來存儲的,但是同樣有一個缺點:

1、大量的fd的數組被整體複製於用戶態和核心位址空間之間,而不管這樣的複製是不是有意義。                   

2、poll還有一個特點是「水平觸發」,如果報告了fd後,沒有被處理,那麼下次poll時會再次報告該fd。

epoll:

epoll有EPOLLLT和EPOLLET兩種觸發模式,LT是預設的模式,ET是「高速」模式。 LT模式下,只要這個fd還有資料可讀,每次epoll_wait都會回傳它的事件,提醒使用者程式去操作,而在ET(邊緣觸發)模式中,它只會提示一次,直到下次再有資料流入之前都不會再提示了,無論fd中是否還有資料可讀。所以在ET模式下,read一個fd的時候一定要把它的buffer讀光,也就是說一直讀到read的回傳值小於請求值,或是 遇到EAGAIN錯誤。還有一個特點是,epoll使用「事件」的就緒通知方式,透過epoll_ctl註冊fd,一旦該fd就緒,核心就會採用類似callback的回呼機制來啟動該fd,epoll_wait便可以收到通知。

epoll為什麼要有EPOLLET觸發模式?

如果採用EPOLLLT模式的話,系統中一旦有大量你不需要讀寫的就緒檔案描述符,它們每次調用epoll_wait都會返回,這樣會大大降低處理程序檢索自己關心的就緒文件描述符的效率.。而採用EPOLLET這種邊緣觸發模式的話,當被監控的檔案描述子上有可讀寫事件發生時,epoll_wait()會通知處理程序去讀寫。如果這次沒有把資料全部讀寫完(如讀寫緩衝區太小),那麼下次調用epoll_wait()時,它不會通知你,也就是它只會通知你一次,直到該文件描述符上出現第二次可讀寫事件才會通知你! ! !這種模式比水平觸發效率高,系統不會充斥大量你不關心的就緒檔案描述符

epoll的優點:

1、沒有最大並發連接的限制,能開啟的FD的上限遠大於1024(1G的記憶體上能監聽約10萬個埠);

2、效率提升,不是輪詢的方式,不會隨著FD數目的增加效率下降。只有活躍可用的FD才會呼叫callback函數;

即Epoll最大的優點就在於它只管你「活躍」的連接,而跟連接總數無關,因此在實際的網路環境中,Epoll的效率就會遠高於select和poll。

3、記憶體拷貝,利用mmap()檔案映射記憶體加速與核心空間的訊息傳遞;即epoll使用mmap減少複製開銷。

select、poll、epoll 差異總結:

1、支援一個行程所能開啟的最大連結數

select

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

poll

poll本質上和select沒有區別,但是它沒有最大連接數的限制,原因是它是基於鍊錶來儲存的

epoll

雖然連接數有上限,但是很大,1G內存的機器上可以打開10萬左右的連接,2G內存的機器可以打開20萬左右的連接

2、FD劇增後帶來的IO效率問題

select

因為每次呼叫時都會對連線進行線性遍歷,所以隨著FD的增加會造成遍歷速度慢的「線性下降性能問題」。

poll

同上

epoll

因為epoll核心中實作是根據每個fd上的callback函數來實現的,只有活躍的socket才會主動呼叫callback,所以在活躍socket較少的情況下,使用epoll沒有前面兩者的線性下降的效能問題,但是所有socket都很活躍的情況下,可能會有效能問題。

3、 訊息傳遞方式

select

#核心需要將訊息傳遞到使用者空間,都需要核心拷貝動作

poll

同上

epoll

epoll透過核心和使用者空間共享一塊記憶體來實現的。

總結:

綜上,在選擇select,poll,epoll時要根據具體的使用場合以及這三種方式的自身特點。

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

2、select低效率是因為每次它都需要輪詢。但低效也是相對的,視情況而定,也可透過良好的設計改善

推薦學習:Linux影片教學

#

以上是linux中poll和select有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何解決Linux終端中查看Python版本時遇到的權限問題? 如何解決Linux終端中查看Python版本時遇到的權限問題? Apr 01, 2025 pm 05:09 PM

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? 在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? Apr 01, 2025 pm 03:06 PM

在Docker環境中使用PECL安裝擴展時報錯的原因及解決方法在使用Docker環境時,我們常常會遇到一些令人頭疼的問�...

如何在LAMP架構下高效整合Node.js或Python服務? 如何在LAMP架構下高效整合Node.js或Python服務? Apr 01, 2025 pm 02:48 PM

在LAMP架構下整合Node.js或Python服務許多網站開發者都面臨這樣的問題:已有的LAMP(Linux Apache MySQL PHP)架構網站需要...

在Linux終端中使用python --version命令時如何解決權限問題? 在Linux終端中使用python --version命令時如何解決權限問題? Apr 02, 2025 am 06:36 AM

Linux終端中使用python...

如何在macOS上將apscheduler定時任務配置為服務? 如何在macOS上將apscheduler定時任務配置為服務? Apr 01, 2025 pm 06:09 PM

在macOS上將apscheduler定時任務配置為服務在macOS平台上,如果你想將apscheduler定時任務配置為一個服務,類似於ngin...

Linux系統自帶Python解釋器能刪除嗎? Linux系統自帶Python解釋器能刪除嗎? Apr 02, 2025 am 07:00 AM

關於Linux系統自帶Python解釋器的刪除問題許多Linux發行版在安裝時會預裝Python解釋器,它並非通過軟件包管理器�...

c語言多線程的四種實現方式 c語言多線程的四種實現方式 Apr 03, 2025 pm 03:00 PM

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

web.xml怎麼打開 web.xml怎麼打開 Apr 03, 2025 am 06:51 AM

要打開 web.xml 文件,可以使用以下方法:使用文本編輯器(如記事本或 TextEdit)使用集成開發環境(如 Eclipse 或 NetBeans)使用命令行編輯命令(Windows:notepad web.xml;Mac/Linux:open -a TextEdit web.xml)

See all articles