百科狗-知识改变命运!
--

线程池 poll 和 epoll select 各有什么优缺点

泡在奶味里1年前 (2023-12-23)阅读数 8#综合百科
文章标签文件事件

一、相同点:

1)三者都需要在fd上注册用户关心的事件;

2)三者都要一个timeout参数指定超时时间;

二、不同点:

select:

a)select指定三个文件描述符集,分别是可读、可写和异常事件,所以不能更加细致地区分所有可能发生的事件;

b)select如果检测到就绪事件,会在原来的文件描述符上改动,以告知应用程序,文件描述符上发生了什么时间,所以再次调用select时,必须先重置文件描述符;

c)select采用对所有注册的文件描述符集轮询的方式,会返回整个用户注册的事件集合,所以应用程序索引就绪文件的时间复杂度为O(n);

d)select允许监听的最大文件描述符个数通常有限制,一般是1024,如果大于1024,select的性能会急剧下降;

e)只能工作在LT模式。

poll:

a)poll把文件描述符和事件绑定,事件不但可以单独指定,而且可以是多个事件的按位或,这样更加细化了事件的注册,而且poll单独采用一个元素用来保存就绪返回时的结果,这样在下次调用poll时,就不用重置之前注册的事件;

b)poll采用对所有注册的文件描述符集轮询的方式,会返回整个用户注册的事件集合,所以应用程序索引就绪文件的时间复杂度为O(n)。

c)poll用nfds参数指定最多监听多少个文件描述符和事件,这个数能达到系统允许打开的最大文件描述符数目,即65535。

d)只能工作在LT模式。

?epoll:

a)epoll把用户注册的文件描述符和事件放到内核当中的事件表中,提供了一个独立的系统调用epoll_ctl来管理用户的事件,而且epoll采用回调的方式,一旦有注册的文件描述符就绪,讲触发回调函数,该回调函数将就绪的文件描述符和事件拷贝到用户空间events所管理的内存,这样应用程序索引就绪文件的时间复杂度达到O(1)。

b)epoll_wait使用maxevents来制定最多监听多少个文件描述符和事件,这个数能达到系统允许打开的最大文件描述符数目,即65535;

c)不仅能工作在LT模式,而且还支持ET高效模式(即EPOLLONESHOT事件,读者可以自己查一下这个事件类型,对于epoll的线程安全有很好的帮助)。

select和poll的区别

前两个没多大区别,第三个更多指民意测验,强调公正新

A sheet of paper or a card used to cast or register a vote, especially a secret one.

投票用纸:选举中用于投票或登记的一张纸或卡片,尤指无记名投票的

The act, process, or method of voting, especially in secret.

投票:投票的行为、过程或方式,尤指只有少数人知道的

A list of candidates running for office; a ticket.

候选人选票:竞选职位的后选人名单;选票

The total of all votes cast in an election.

投票总数:一次竞选中的投票总数

The right to vote; franchise.

投票权;选举权

A small ball once used to register a secret vote.

曾用于无记名投票的小球

v.intr.(不及物动词)

bal.lot.ed,bal.lot.ing,bal.lots

To cast a ballot; vote.

投票;选举

To draw lots.

拉选票

vote

n.(名词)

A formal expression of preference for a candidate for office or for a proposed resolution of an issue.

选举:对于某个职务候选人或某件问题的解决方法的赞同的正式表达

A means by which such a preference is made known, such as a raised hand or a marked ballot.

投票,表决:这种赞同被表达出来的方式,如举手或有记号的选票

The number of votes cast in an election or to resolve an issue:

投票总数:在一次选举或决定一个问题时所投的票数:

a heavy vote in favor of the bill.

赞成议案的压倒多数

A group of voters alike in some way:

选民,选区:在某些方面的相同的一组投票者:

the Black vote; the rural vote.

黑人选票;农村选票

The act or process of voting:

投票:投票的行为或过程:

took a vote on the issue.

在这个问题上采取投票

The result of an election or a referendum.

投票结果:一次选举或公民投票的结果

The right to participate as a voter; suffrage.

选举权:作为选举者参加的权力;投票权

v.(动词)

vot.ed,vot.ing,votes

v.intr.(不及物动词)

To express one's preference for a candidate or for a proposed resolution of an issue; cast a vote:

投票:表示某人对一个候选人或一个问题的解决办法的选择;投票:

voted yes on the motion; voting against the measure.

对这项运动上投赞同票;投票反对提案

To express a choice or an opinion.

表决:表达一个选择或观点

v.tr.(及物动词)

To express one's preference for by vote:

投票决定:用投票来表达某人的选择:

voted the straight Republican ticket.

投了正直的共和党人一票

To decide the disposition of by vote, as by electing or defeating:

表决:用投票来决定处理办法,如投票选举或击败:

vote in a new mayor; voted out their representative; vote down the amendment.

选出一位新市长;投票选出他们的代表;投票来否决修正案

To bring into existence or make available by vote:

投票通过:以投票方式使存在或使可行:

vote new funds for a program.

为计划投票争取新的资金

To be guided by in voting:

用投票来决定:

vote one's conscience.

以良心来投票

To declare or pronounce by general consent:

公议,一致认为:以一致同意来宣布:

voted the play a success.

公认这部戏是成功的

Informal To state as a preference or an opinion:

非正式用语 建议:陈述以表示选择或意见:

I vote we eat out tonight.

我提议我们今晚出去吃饭

poll

n.

选举之投票, 民意测验

v.

投票, 获得选票, 选举中获得

poll

poll

AHD:[p?l]

D.J.[p*&l]

K.K.[pol]

n.(名词)

The casting and registering of votes in an election.

投票:在选举中投票或登记选票

The number of votes cast or recorded.

投票数:投票或被记录选票的数量

Often polls The place where votes are cast and registered. Used withthe.

常作 polls 投票站:投选票和登记选票的地方。和the 连用

A survey of the public or of a sample of public opinion to acquire information.

民意调查:为获取信息而对公众的调查或对公众意见的一次抽样

The head, especially the top of the head where hair grows.

线程池 poll 和 epoll select 各有什么优缺点

头部:头部,特指头顶上长头发的部位

The blunt or broad end of a tool such as a hammer or an ax.

工具较钝或较宽的一端,如锤子或斧头

v.(动词)

polled,poll.ing,polls

v.tr.(及物动词)

To receive (a given number of votes).

得到(一定数目的)选票

To receive or record the votes of:

得到或记录…的投票数:

polling a jury.

投票选出陪审团

To cast (a vote or ballot).

投(票或选票)

To question in a survey; canvass.

在调查中询问;民意测验

To cut off or trim (hair, horns, or wool, for example); clip.

修剪:剪掉或理(如头发、角或毛);修剪

To trim or cut off the hair, wool, branches, or horns of:

剪掉:理掉或剪掉…的头发、毛、枝节或角:

polled the sheep; polled the trees.

剪羊毛;修剪树木

v.intr.(不及物动词)

To vote at the polls in an election.

在选举中投票

下面是select的函数接口:

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。

select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但 是这样也会造成效率的降低。

poll:

int poll (struct pollfd *fds, unsigned int nfds, int timeout);

不同与select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。

struct pollfd {

int fd; /* file descriptor */

short events; /* requested events to watch */

short revents; /* returned events witnessed */

};

pollfd结构包含了要监视的event和发生的event,不再使用select“参数-值”传递的方式。同时,pollfd并没有最大数量限制(但是数量过大后性能也是会下降)。 和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。

从上面看,select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。

epoll:

epoll的接口如下:

int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

typedef union epoll_data {

void *ptr;

int fd;

__uint32_t u32;

__uint64_t u64;

} epoll_data_t;

struct epoll_event {

__uint32_t events; /* Epoll events */

epoll_data_t data; /* User data variable */

};

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

复制代码

主要是epoll_create,epoll_ctl和epoll_wait三个函数。epoll_create函数创建epoll文件描述符,参数size并不是限制了epoll所能监听的描述符最大个数,只是对内核初始分配内部数据结构的一个建议。返回是epoll描述符。-1表示创建失败。epoll_ctl 控制对指定描述符fd执行op操作,event是与fd关联的监听事件。op操作有三种:添加EPOLL_CTL_ADD,删除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD。分别添加、删除和修改对fd的监听事件。epoll_wait 等待epfd上的io事件,最多返回maxevents个事件。

在 select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一 个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait() 时便得到通知。

epoll的优点主要是一下几个方面:

1. 监视的描述符数量不受限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左 右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。select的最大缺点就是进程打开的fd是有数量限制的。这对 于连接数量比较大的服务器来说根本不能满足。虽然也可以选择多进程的解决方案( Apache就是这样实现的),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也 不是一种完美的方案。

2. IO的效率不会随着监视fd的数量的增长而下降。epoll不同于select和poll轮询的方式,而是通过每个fd定义的回调函数来实现的。只有就绪的fd才会执行回调函数。

3.支持电平触发和边沿触发(只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发)两种方式,理论上边缘触发的性能要更高一些,但是代码实现相当复杂。

4.mmap加速内核与用户空间的信息传递。epoll是通过内核于用户空间mmap同一块内存,避免了无畏的内存拷贝。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)