|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本篇文章是对select、poll、epoll之间的区别进行了详细的分析介绍。需要的朋友参考下
0 W+ @) ^% d- h7 l" h- ^, D: p N% C
, R$ m0 S5 Y3 }, v' a
% l+ q0 u6 ~0 \9 E. O& M$ P/ }) D
* r0 V$ z+ I9 K6 S! @' G0 L! mlinux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。
" E; j" C1 [8 p# T- _ w
0 X5 p, {$ v) W! @1 z0 H* g
$ ^. @# J2 G- g. k代码如下:
6 {7 p% f, c7 {
5 |/ q) Q" B+ i* i# J2 ?- int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
- int poll(struct pollfd *fds, nfds_t nfds, int timeout);
- int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
$ T5 b; K2 t# \7 [5 E" l8 r1 P
s' N0 e; T: [* a4 k7 K6 p9 P) z' |8 f' `0 Q" j
select、poll、epoll_wait参数及实现对比
$ t1 P9 l/ G/ Z. ^+ _9 V1 D9 f+ M/ V6 L; D% g% M
1.select的第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSIZE(1024),位数组的每一位代表其对应的描述符是否需要被检查。
. C; P# F: `0 j# {2 u
# [7 ?& q7 V. S7 @ I* \select的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既是输入参数也是输出参数,可能会被内核修改用于标示哪些描述符上发生了关注的事件。所以每次调用select前都需要重新初始化fdset。
9 t1 b( U, M5 B! \4 F4 T# {4 r {0 l$ O. u/ I9 j4 t
timeout参数为超时时间,该结构会被内核修改,其值为超时剩余的时间。
& z3 _3 _2 \& w0 i/ F
" Q. ]! U1 i1 Y* @( a$ Kselect对应于内核中的sys_select调用,sys_select首先将第二三四个参数指向的fd_set拷贝到内核,然后对每个被SET的描述符调用进行poll,并记录在临时结果中(fdset),如果有事件发生,select会将临时结果写到用户空间并返回;当轮询一遍后没有任何事件发生时,如果指定了超时时间,则select会睡眠到超时,睡眠结束后再进行一次轮询,并将临时结果写到用户空间,然后返回。
+ V. R3 g% x# K5 Y2 ~+ B: N3 R( W9 ]( d3 U6 W4 d
select返回后,需要逐一检查关注的描述符是否被SET(事件是否发生)。
1 Z2 B$ B5 ?2 X- x0 ~
9 O2 A3 T2 ^6 ?1 z# m4 X$ y2.poll与select不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。
* n0 [/ R* U% f& V* b5 A/ D% q* O3 }7 o
poll的实现机制与select类似,其对应内核中的sys_poll,只不过poll向内核传递pollfd数组,然后对pollfd中的每个描述符进行poll,相比处理fdset来说,poll效率更高。" Y" O3 D6 h9 Y) t3 Z3 A
8 Y: E4 K L' ^ X& D" n
poll返回后,需要对pollfd中的每个元素检查其revents值,来得指事件是否发生。3 B" P7 I- v& G4 i7 x& M; Q8 x
& o O" Z# r- s/ x- j; E
3.epoll通过epoll_create创建一个用于epoll轮询的描述符,通过epoll_ctl添加/修改/删除事件,通过epoll_wait检查事件,epoll_wait的第二个参数用于存放结果。% f( \1 Z4 W" U5 j! i4 }
5 J9 y1 n" i+ l, }* C+ H1 [+ y; P
* p7 H/ n$ h8 W! H$ {; D. ?+ W7 w2 @# b. o# Y! m! d
$ P: b2 P+ N0 x) w
|
|