I/O--多路复用的三种机制Select,Poll和Epoll对比

select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。

多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

我们先分析一下select函数

int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout);

【参数说明】

int maxfdp1 指定待测试的文件描述字个数,它的值是待测试的最大描述字加1。

fd_set *readset , fd_set *writeset , fd_set *exceptset

fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄。中间的三个参数指定我们要让内核测试读、写和异常条件的文件描述符集合。如果对某一个的条件不感兴趣,就可以把它设为空指针。

const struct timeval *timeout timeout告知内核等待所指定文件描述符集合中的任何一个就绪可花多少时间。其timeval结构用于指定这段时间的秒数和微秒数。

【返回值】

int 若有就绪描述符返回其数目,若超时则为0,若出错则为-1

select()的机制中提供一种fd_set的数据结构,实际上是一个long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读。

从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。也就是说,poll只解决了上面的问题3,并没有解决问题1,2的性能开销问题。

下面是pll的函数原型:

poll改变了文件描述符集合的描述方式,使用了pollfd结构而不是select的fd_set结构,使得poll支持的文件描述符集合限制远大于select的1024

【参数说明】

struct pollfd *fds fds是一个struct pollfd类型的数组,用于存放需要检测其状态的socket描述符,并且调用poll函数之后fds数组不会被清空;一个pollfd结构体表示一个被监视的文件描述符,通过传递fds指示 poll() 监视多个文件描述符。其中,结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域,结构体的revents域是文件描述符的操作结果事件掩码,内核在调用返回时设置这个域

nfds_t nfds 记录数组fds中描述符的总数量

【返回值】

int 函数返回fds集合中就绪的读、写,或出错的描述符数量,返回0表示超时,返回-1表示出错;

epoll在Linux2.6内核正式提出,是基于事件驱动的I/O方式,相对于select来说,epoll没有描述符个数限制,使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。

Linux中提供的epoll相关函数如下:

1. epoll_create 函数创建一个epoll句柄,参数size表明内核要监听的描述符数量。调用成功时返回一个epoll句柄描述符,失败时返回-1。

2. epoll_ctl 函数注册要监听的事件类型。四个参数解释如下:

epoll_event 结构体定义如下:

3. epoll_wait 函数等待事件的就绪,成功时返回就绪的事件数目,调用失败时返回 -1,等待超时返回 0。

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

LT和ET原本应该是用于脉冲信号的,可能用它来解释更加形象。Level和Edge指的就是触发点,Level为只要处于水平,那么就一直触发,而Edge则为上升沿和下降沿的时候触发。比如:0->1 就是Edge,1->1 就是Level。

ET模式很大程度上减少了epoll事件的触发次数,因此效率比LT模式下高。

一张图总结一下select,poll,epoll的区别:

epoll是Linux目前大规模网络并发程序开发的首选模型。在绝大多数情况下性能远超select和poll。目前流行的高性能web服务器Nginx正式依赖于epoll提供的高效网络套接字轮询服务。但是,在并发连接不高的情况下,多线程+阻塞I/O方式可能性能更好。

既然select,poll,epoll都是I/O多路复用的具体的实现,之所以现在同时存在,其实他们也是不同 历史 时期的产物



  • I鐨勫彂闊虫槸鎬庢牱鐨?
    绛旓細I锛岃闊筹細[ai]  J锛岃闊筹細[d3ei]  K锛岃闊筹細[kei]  L锛岃闊筹細[el]   M锛岃闊筹細[em]  N锛岃闊筹細[en]   O锛岃闊筹細[əu]  P锛岃闊筹細[pi:]  鍏冮煶...
  • i:鎬庝箞璇昏嫳璇
    绛旓細i 鑻 [aɪ] 缇 [aɪ]n.鑻辨枃瀛楁瘝涓殑绗節涓瓧姣;铏氭暟鐨勫崟浣嶃俛bbr.鐢垫祦瀵嗗害;鐒擄紱鐑嚱;鑻卞銆
  • [i]鎬庝箞璇?
    绛旓細[i]鐨勫彂闊虫柟娉曪細1锛夊槾寰井寮犲紑锛屽槾鍞囨斁鏉撅紝涓婇娇鍜屼笅榻夸箣闂寸害涓涓皬鎸囧皷璺濈銆2锛夎垖灏栨姷涓嬮娇锛岃垖纭叚鎶捣锛岃垖浣嶇◢浣庯紝绋嶅悗锛岃垖澶磋倢鑲夋澗寮涖3锛夊槾鍞囧悜涓ゆ梺浼稿紑锛屽0甯﹂渿鍔ㄥ彂鍑哄0闊 /ɪ/鏄崟鍏冮煶鍓嶅厓闊筹紝杩欎釜闊虫爣鍦ㄨ嫳寮忛煶鏍囦腑鐨勭鍙锋槸/ɪ/锛岀編寮忚嫳鏍囩鍙穂ɪ]銆傚父瑙佸崟璇嶆湁sit /sɪ...
  • I缈昏瘧鎴愪腑鏂囨槸浠涔堟剰鎬?
    绛旓細I 璇婚煶锛氳嫳 [aɪ] 缇 [aɪ]璇硶锛氱敤浜庡彞瀛愪腑(娉ㄦ剰澶у啓)锛岃〃绀烘垜鐨勬剰鎬濓紝I am灏辨槸鎴 鎵浠ヨ繖涓湴浣嶆槸寰堥珮鐨勭骇鍒備緥鍙ワ細I already told you not to come over.鎴戝凡缁忓憡璇変綘鍒繃鏉ヤ簡銆
  • [i]鍦ㄩ煶鏍囦腑鏄粈涔堟剰鎬?
    绛旓細[ i ]鏄厓闊冲瓧姣嶏紝鍗曡瘝涓厓闊冲瓧姣嶉氬父鏈変袱绉嶅彂闊筹細1銆併愬瓧姣嶆湰韬煶 /ai/銆( 涓鑸槸鍦ㄥ紑闊宠妭涓 )濡傦細1锛塳ite锛氳嫳 [kaɪt] 缇 [kaɪt]( 椋庣瓭 )2锛塨ike锛氳嫳 [baɪk] 缇 [baɪk]锛堣嚜琛岃溅锛2銆併愮煭闊崇殑 /i/ 銆(涓鑸槸闂煶鑺備腑)锛屽锛1锛塰it锛氳嫳 [hɪ...
  • i澶у啓鎬庝箞鍐
    绛旓細i瀛楁瘝鐨勫ぇ鍐欙細I锛屽叿浣撳涓嬪浘鎵绀猴細瀛楁瘝涔﹀啓瑙勬牸 锛氾紙1锛夊崰涓婁腑涓ゆ牸鐨勬湁锛26涓ぇ鍐欏瓧姣嶏紱b,d,h,i,k,l,t绛7涓皬鍐欏瓧姣嶃傦紙2锛夊崰涓棿涓鏍肩殑鏈夛細a,c,e,m,n,o,r,s,u,v,w,x,z绛13涓皬鍐欏瓧姣嶃傦紙3锛夊崰涓笅涓ゆ牸鐨勬湁锛歡,q,y绛3涓啓瀛楁瘝銆傦紙4锛夊崰涓婁腑涓嬩笁鏍肩殑鏈夛細f,j,p绛3涓...
  • 璇烽棶i鏄粈涔
    绛旓細i 鏄竴涓皬鍐欑殑鍏冮煶瀛楁瘝, 瀹冪殑澶у啓瀛楁瘝鏄 "I ",浣嶄簬瀛楁瘝琛ㄩ噷鐨勭涔濅釜瀛楁瘝銆傚畠鐨勫ぇ鍐 I , 鏄竴 涓崟璇嶏紝浜虹О浠h瘝鍗曟暟绗竴浜虹О " 鎴 " 銆傚:I am a student. 鎴戞槸涓鐢熴侷 like speaking English. 鎴戝枩娆㈣鑻辫銆
  • i鐨勬剰鎬濇槸浠涔堝憖?
    绛旓細i鐨勬剰鎬濇槸鎴戯紙浜虹О浠h瘝锛岃〃绀虹涓浜虹О鍗曟暟涓绘牸褰㈠紡锛夈傝缁嗚В閲婏細涓銆佽嫳璇瓧姣嶄腑鐨勭涔濅釜瀛楁瘝锛堝皬鍐欎负i锛変簩銆佽〃绀鸿绋嬫湭淇畬鐨勭鍙凤紱鏈慨瀹岃绋嬭 涓夈=angleofincidence鍏ュ皠瑙 鍥涖佹瀬绔嚜绉佺殑浜猴紝鍒╁繁涓讳箟鑰 浜斻佽璇濊佹槸"鎴戞庝箞鎬庝箞"鐨勪汉 鍏併愬摬銆戣嚜鎴戞剰璇 涓冦佷釜浜 鍏佺殗甯 浜虹О浠h瘝鍒嗙被锛...
  • I鏄粈涔堟剰鎬
    绛旓細鎴 涓绔欏紡鍑哄浗鐣欏鏀荤暐 http://www.offercoming.com
  • i鎬庝箞璇?
    绛旓細鈪拌锛籥ɪ锛姐i鏄眽璇嫾闊崇殑涓涓厓闊抽煶绱狅紝鍙堢О闊垫瘝锛屽悓鏃跺彲浠ヨ嚜鎴愪竴涓煶鑺傘傛牴鎹煹姣嶅懡鍚嶅師鍒欙紝i鐨勪笓涓氬悕绉版槸鈥滆垖闈㈠墠楂樹笉鍦嗗攪鍏冮煶鈥濓紝鍚嶇О浠h〃鐫鍙戦煶鏃剁殑鏍囧噯鑸屼綅鍜屽攪褰傛敞鎰 i闊充笌y闊炽乽闊充笌w闊崇浉浼硷紝鍙槸i鍜寀鏄煹姣嶏紝闊垫瘝鍙戦煶鏃惰緝鍝嶄寒锛泍鍜寃鏄0姣嶏紝澹版瘝鍙戦煶杈冭交蹇紝ye锛堝彾锛夛紝璇讳綔...
  • 扩展阅读:邵阳e47a笔记本配置 ... 联想昭阳e47a说明书 ... 昭阳e47a i3 ... 45 46i47 ... hb54y ... io多路复用和事件循环 ... 昭阳e47a配置 ... sigma与良率对照表 ... 联想昭阳47a参数 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网