EDA365电子论坛网

标题: 本篇文章告诉你select、poll、epoll之间有什么区别 [打印本页]

作者: mytomorrow    时间: 2019-9-17 18:13
标题: 本篇文章告诉你select、poll、epoll之间有什么区别
本篇文章是对select、poll、epoll之间的区别进行了详细的分析介绍。需要的朋友参考下" p6 [: b% w$ T

5 N& n3 k( |1 A- A) X& Q& o0 W% t2 g
( H  k( E- \7 e1 B6 D
  {, k; s# d( _" @+ X  F- w  N- g
linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。! Z+ i$ N" Z; \9 t  W# p

4 w5 _2 ]& K8 ?* I& d

5 ~3 z6 Z) m) J6 @8 J) ?) I2 x代码如下:8 R( o5 a4 ~, q: u
0 `. L; C  r5 T( i

- G% n# b, @. r& I+ r, D
: Q! o" s* H# H% U" H0 n9 Mselect、poll、epoll_wait参数及实现对比
0 b8 Z* X! Q! z: P9 f
* ?. G' x0 _' w% B
1.select的第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSIZE(1024),位数组的每一位代表其对应的描述符是否需要被检查。
7 C& b9 [. P* x. {
+ k" \7 v( m. t1 }/ aselect的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既是输入参数也是输出参数,可能会被内核修改用于标示哪些描述符上发生了关注的事件。所以每次调用select前都需要重新初始化fdset。
7 D+ @' w; x. s0 w3 S( X; O- d2 z% M; q- k9 S
timeout参数为超时时间,该结构会被内核修改,其值为超时剩余的时间。
, M3 K! p( ]' w/ m+ o 3 j8 F3 q3 i1 [) X( t0 R# A
select对应于内核中的sys_select调用,sys_select首先将第二三四个参数指向的fd_set拷贝到内核,然后对每个被SET的描述符调用进行poll,并记录在临时结果中(fdset),如果有事件发生,select会将临时结果写到用户空间并返回;当轮询一遍后没有任何事件发生时,如果指定了超时时间,则select会睡眠到超时,睡眠结束后再进行一次轮询,并将临时结果写到用户空间,然后返回。8 _) h8 H% l3 M" ]5 Q( k9 x

6 [# I3 T% d" fselect返回后,需要逐一检查关注的描述符是否被SET(事件是否发生)。  U( X, R7 U. j
6 g0 h% T7 o* H, E% i4 O' u6 k2 o
2.poll与select不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。
) I6 L# m* i0 j* G' g! J) k
+ t5 l5 P: c+ y0 C6 p5 ppoll的实现机制与select类似,其对应内核中的sys_poll,只不过poll向内核传递pollfd数组,然后对pollfd中的每个描述符进行poll,相比处理fdset来说,poll效率更高。
- ^0 r; v0 ?- `  y  e6 A6 r' |
* J  z/ o9 G7 h6 cpoll返回后,需要对pollfd中的每个元素检查其revents值,来得指事件是否发生。
  n3 p6 o" z- d9 f! Y9 m, b: ?4 H1 b" |/ m' j% g
3.epoll通过epoll_create创建一个用于epoll轮询的描述符,通过epoll_ctl添加/修改/删除事件,通过epoll_wait检查事件,epoll_wait的第二个参数用于存放结果。
4 u$ x1 ?+ i8 [- d. z
! @/ C) d9 Y- o7 ^

0 B' J. ^6 m) h! Z1 \- m! U  w$ X! e4 ?! Y
8 {9 Z, J% s; v0 K6 I' i

作者: artic    时间: 2019-9-17 20:53
看看select、poll、epoll之间有什么区别。
作者: hanzhencai    时间: 2019-10-10 10:13
学习一下# ~6 J& a- J9 X  k2 S8 U& ]) S
! h3 L' s# L7 Y$ z" q





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2