|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本篇文章是对select、poll、epoll之间的区别进行了详细的分析介绍。需要的朋友参考下
# S1 J, W6 a! X' i W: f+ k* x" J4 i* M
; p# O1 s7 s9 M* }6 v
9 Z) z" ?2 @6 t# J& @7 f% U( t7 [9 G2 A2 V% l7 w( ]
linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。
/ y2 k3 X5 k& Q0 E- Z' |
/ o4 T) z3 j) \- V, o6 R+ e' \3 l& |, W" y: b+ I9 H
代码如下:$ R X2 g9 y2 L% r$ \) Y
( R" K* }# o9 \4 C& `% U- 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);' d( \, h3 ?- n# R6 L5 ~
& \; @8 s: `9 d; d
' i- w' K* C9 [7 w) c* F
select、poll、epoll_wait参数及实现对比
- f9 a1 |0 ?5 U( M. v) f' g1 C
4 D9 |# k" B N+ l- u( B1.select的第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSIZE(1024),位数组的每一位代表其对应的描述符是否需要被检查。
3 L* p4 d- w3 I6 s- O8 X3 ?* R% l/ p6 p G& R' c6 O9 m
select的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既是输入参数也是输出参数,可能会被内核修改用于标示哪些描述符上发生了关注的事件。所以每次调用select前都需要重新初始化fdset。. K* Q7 i4 I" W7 E/ X: D0 C6 e3 ]- \
( @- V1 \$ T, w! {8 C0 S
timeout参数为超时时间,该结构会被内核修改,其值为超时剩余的时间。
! t" \& Q/ G" {. G% H
2 V9 F8 }6 L* g0 Q+ B/ qselect对应于内核中的sys_select调用,sys_select首先将第二三四个参数指向的fd_set拷贝到内核,然后对每个被SET的描述符调用进行poll,并记录在临时结果中(fdset),如果有事件发生,select会将临时结果写到用户空间并返回;当轮询一遍后没有任何事件发生时,如果指定了超时时间,则select会睡眠到超时,睡眠结束后再进行一次轮询,并将临时结果写到用户空间,然后返回。0 P! A; c0 _: v2 y' \! |/ H3 Z, L
9 D% v# ^3 G: {( w1 q' B
select返回后,需要逐一检查关注的描述符是否被SET(事件是否发生)。% ?: k b% q) P& p
4 T7 R7 z& R* e5 g
2.poll与select不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。
- y7 a7 c7 E. o4 o$ S/ v
9 h/ k" M- z; a0 H, W0 Spoll的实现机制与select类似,其对应内核中的sys_poll,只不过poll向内核传递pollfd数组,然后对pollfd中的每个描述符进行poll,相比处理fdset来说,poll效率更高。
; {+ l+ j3 _* Z+ m) H2 A4 \
& @) d6 g, i# p, ppoll返回后,需要对pollfd中的每个元素检查其revents值,来得指事件是否发生。
; G7 D2 ?: W& f6 G' M: T, P
$ I& R: R1 G, `, Q7 |9 f* s3.epoll通过epoll_create创建一个用于epoll轮询的描述符,通过epoll_ctl添加/修改/删除事件,通过epoll_wait检查事件,epoll_wait的第二个参数用于存放结果。& u" I3 W. e8 A
9 Y# C% w) M/ R; h) y3 g8 c0 t. l1 k' P& C8 y* q
8 C* @3 N& f! W- a- j0 b8 J" P+ ^1 `" j$ A+ g, y) |
|
|