關于epoll,select,poll的理解

select: 輪詢+fd_set

1.采用fd_set存儲fd(fd_set通過數組位圖實現)

2.每次調用select,都需要把fd集合從用戶態拷貝到內核態,fd越多開銷越大

3.每次調用select,都需要在內核遍歷傳遞進來的fd,開銷大(輪詢)

4.select支持的fd數量太少,1024(32個32位的整數,也就是2的10次方),受fd_setsize參數限制,改變這個參數的話需要重新編譯內核

具體想要突破fd_setsize參數限制的話有以下2個方法:

1)修改sys/types.h頭文件中的fd_setsize值并且重新編譯內核,當然這并不是一個好的方法,fd_setsize的值變大意味著我們輪詢一次的時間需要加長

2)通過多核CPU,采用分而治之+負載均衡的思想將連接注冊在多個select上,并發select不僅能突破fd_setsize限制而且能提高性能,有點map -reduce的思想,這里還有一個問題,就是當一個輪詢器poller上的最大輪詢數量超過了1024還能不能注冊的問題,我們同樣可以采用分而治之的多線程輪詢策略來解決,比如連接數2000,線程1輪詢0到1023,線程2輪詢1024-2000

?

5.調用select,返回的是含有整個句柄的數組,需要遍歷整個數組才知道哪些句柄發生了事件(輪詢)

6.select的觸發是LT模式,效率不高

?

poll:輪詢+鏈表

1.采用鏈表存儲fd,沒有了fd數量限制,但是上述其他缺點依然存在

?

epoll:紅黑樹+雙鏈表+回調機制

1.紅黑樹掛載事件,事件發生時通過回調機制將事件添加到雙鏈表中

2.檢查是否有事件發生時,不需要輪詢,只需要檢查雙鏈表即可

3.保證每個fd只會被拷貝一次(事件被加入到epoll中時,fd就會被拷貝進入內核,而不是在epoll_wait時拷貝),使用了mmap加速內核與用戶空間的消息傳遞,無論是select還是poll都需要內核把fd消息通知給用戶空間,如何1避免不必要的內存拷貝就很重要,在這點上,epoll通過內核與用戶空間mmap同一塊內存實現!

4.fd數量上限為最大可以打開的文件數目,這個我們可以通過調整內核的參數來改變,通過ulimit -n來調整或者setrlimit函數設置,當然這個需要root權限,但是一個系統能打開的文件最大數目也是有限制的,取決于內存大小,可以通過cat/proc/sys/fs/file-max查看

該雙鏈表我們一般叫做就緒事件鏈表

?

當然,以上的優缺點僅僅是在高并發且任一時間只有少數socket活躍的特定場景下的,如果并發量高,socket都比較活躍的情況下,select就不見得會比epoll慢(就像我們常常是快排比插入排序快,但是在特定的情況下并不成立)

什么情況下使用select,poll的性能好于使用epoll?

高并發,少活躍socket的情況下,select的輪詢在于每次輪詢都會輪詢到不活躍的套接字,從而浪費了時間導致效率慢

但是當高并發,多活躍socket的情況下,select的輪詢每次都能很快的輪詢到活躍的套接字,這種情況下也是可以考慮使用select的!

?

最后,總結一下

并發低 ? socket活躍 ? select/poll

并發低 ? socket不活躍 select/poll

這兩種情況使用epoll[紅黑樹+鏈表+回調機制]有點殺雞用牛刀的感覺

?

并發高 ? socket活躍 ? ? ? select/poll的性能不一定比epoll差

并發高 ? socket不活躍 ? ? epoll

?

?

?

//先碼著,后面準備自己實現一下這三種機制

?

?

轉載于:https://www.cnblogs.com/yinbiao/p/10945624.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kali linux超級用戶_如何優雅的在Linux上使用Powershell]

點擊上方“藍字”關注我們吧!譯文聲明本文是翻譯文章,文章原作者 TJ Null文章來源:https://www.offensive-security.com原文地址:https://www.offensive-security.com/offsec/kali-linux-powershell-pentesting/譯文僅供參考&…

Laravel5.5 MySQL配置、讀寫分離及操作

2019獨角獸企業重金招聘Python工程師標準>>> Laravel 讓連接不同數據庫以及對數據庫進行增刪改查操作: 參考:http://laravelacademy.org/post/854.html 配置讀寫分離 應用的數據庫配置位于 config/database.php(但是數據庫用戶及密碼等敏感信…

Kinect開發筆記之八C#實現Kinect聲音的追蹤

聲明:本文中特征多針對Kinect for windows 1.0,新版的Kinect Sensor可能有部分數值或方法有一定變化,請知曉。Kinect的聲音來自下方的4個麥克風組成的麥克風陣列。傳感器內含數字信號處理器,可以用來強化接受聲音的清晰度同時處理…

Nginx常見配置:負載均衡、限流、緩存、黑名單和灰度發布

一、Nginx安裝(基于CentOS 6.5) 1.yum命令安裝 yum install nginx –y(若不能安裝,執行命令yum install epel-release) 2. 啟動、停止和重啟 service nginx startservice nginx stopservice nginx restart瀏覽器中 輸入服務器的 ip 地址&…

國服服務器_《Minecraft我的世界》第三方服務器的基本儲備

今天我想單獨來聊一聊Minecraft我的世界第三方服務器的發展。世外荒原玩家作品我來到頭條的第一篇文章就發表了一篇我對Minecraft現狀的看法,現在國服的狀態對老玩家不是很友好。(這不說明國服的運營戰略路線是有問題的)因此誕生了一大堆第三方服務器。世外荒原玩家…

Unity中Time.deltaTime的含義及其應用

相信Unity的開發者或者初學者都對Time.deltaTime并不陌生,我們經常會在代碼中用到或者看到它,今天去官方的API文檔查了一下,感覺它非常有用,所以翻譯一下以引導初學者。 原文網址: file:///Applications/Unity/Unity…

unity3d曲線text文本

測試.pngusing System; using System.Collections.Generic;namespace UnityEngine.UI.Extensions {/// <summary>/// Curved text.讓文本按照曲線進行顯示 【注意對Image的變形 也是可以的】/// 說明&#xff1a; 對Text的操作就和 shadow 和 outline 組件類似。/// <…

HTML 和CSS

1 HTML 介紹1.1 web 服務本質import socket sk socket.socket() sk.bind(("127.0.0.1", 8080))sk.listen(5) while True: conn, addr sk.accept() data conn.recv(8096) conn.send(b"HTTP/1.1 200 OK\r\n\r\n") conn.send(b"<h1>Hello world…

Unity中Quaternion的含義及其使用

官網API文檔&#xff1a; file:///Applications/Unity/Unity.app/Contents/Documentation/html/en/ScriptReference/Quaternion.html Quaternion的意思是四元數&#xff0c;用于代表旋轉。 它們是緊致的&#xff0c;不會產生萬向節死鎖并且能夠很容易被插值。Unity內使用Quat…

Python PIPEs

2019獨角獸企業重金招聘Python工程師標準>>> https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm 轉載于:https://my.oschina.net/zungyiu/blog/1860857

延時消息_Handler的消息延時是怎么實現的

消息延時做了什么特殊處理&#xff1f;是發送延時&#xff0c;還是消息處理延時&#xff1f;延時的精度如何&#xff1f;通常我們使用Handler的消息延時都是調用sendMessageDelayed函數實現的&#xff0c;其中delayMillis是需要延時的毫秒。通過跟蹤sendMessageDelayed函數可以…

5月JC學習總結

斷劍重鑄之日&#xff0c;王者歸來之時。為了更美好的明天而戰。 五月 悄悄地過了 人兒 不覺中散了 攜著一腔熱血&#xff1b;來到蛟川 來到機房 微涼的輕風&#xff0c;無聲地去了 熾熱的驕陽&#xff0c;即將要落了 站在4樓&#xff0c;向窗外眺望&#xff0c;映出的不是夕陽…

4 關卡流 進階_全息武器全解析,記住4個點全區第一就是你!

實不相瞞&#xff0c;每次看著全息武器糖糖都感覺自己像鋼鐵俠高端大氣上檔次&#xff0c;低調奢華有內涵那么問題來了&#xff01;這個全息武器究竟該怎么玩才能成為真正的鋼鐵俠&#xff1f;我的使命之全息武器【作者&#xff1a;D38激戰阿曼——潛龍小生】全息武器在屬性增加…

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

運行時報錯&#xff1a; terminate called after throwing an instance of std::out_of_rangewhat(): basic_string::substr&#xff1a;__pos Aborted (core dumped) 內存讀取越界。 解釋1&#xff1a;for example:const std::string sTest( "test" );sTest.substr…

記一次理想浪漫的畢旅

因為臨近畢業離別的氛圍和閑散的生活&#xff0c;雖然手頭積攢了不少可寫的素材和教程&#xff0c;但還是兩個月沒有在CSDN更新博客。論文答辯之后&#xff0c;我只是每天在宿舍玩玩電腦、打打撲克&#xff0c;唯一讓我難受的是&#xff0c;隔幾天便送走一位同窗好友。有時甚至…

【滲透過程】嘉緣網站 --測試

聲明&#xff1a;本片文章測試網站為測試靶場 信息收集階段&#xff1a; 首先使用了一些常見的掃描工具&#xff1a;nmap 御劍 使用nmap掃描端口 發現網站開放了 135 139 445 3306 等端口 這里可以看到網站開放了一些危害較高端口&#xff1a;135 225等 使用御劍掃描到一些敏感…

C編程經驗總結

Turbo c Return (z);return z; 圖形界面的有scanf(“%d ~%d\n”,&~,&~);注意&#xff1a;中間不能有亂的東西 Printf(“~~~ %d~~%d\n”,~,~);這兒可以有亂的東西&#xff0c;一切的提示圖形界面多是由它完成 函數&#xff0c;變量一定是有類型 除了函數&#xff08;&am…

文檔過期打不開怎么辦_標準的產品需求文檔在這里!(詳細說明版)(2)

接著上篇繼續寫&#xff0c;上篇請點擊標準的產品需求文檔在這里&#xff01;(詳細說明版)(1)入口已經寫完&#xff0c;讀此文檔的無論是研發人員還是測試都已經知曉此需求需要做的從哪里進入&#xff0c;接下來就是主菜了&#xff0c;進入以后該干嘛。進入以后當然就是新的頁面…

day32

udp(用戶數據包協議) 高并發(同時有大量客戶端訪問服務器,服務器處理不過來)?OSI模型中,屬于傳輸層得協議,僅用于不要求可靠性,以及不要求分組順序且數據量較小的簡單傳輸,力求快?通訊流程類似對講機 只管發送不管對方是否接收到,甚至不關心對方存在?UDP可以處理多個客戶端,…

Macbook全系列詳細分析及購機指南

時至今日&#xff0c;極佳的用戶體驗、強大的功能、獨特的設計感、廣闊的市場和無可比擬的品牌魅力已經讓蘋果公司各種電子產品的迅速普及&#xff0c;其中Macbook逐漸被越來越多的人所青睞&#xff0c;尤其是從事一些特定行業的工作者&#xff08;比如IT、電信、互聯網以及藝術…