当前位置:首页 > 前端设计 > 正文

epoll和select的区别,epoll优点

epoll和select的区别,epoll优点

各位老铁们好,相信很多人对epoll和select的区别都不是特别的了解,因此呢,今天就来为大家分享下关于epoll和select的区别以及epoll优点的问题知识,还...

各位老铁们好,相信很多人对epoll和select的区别都不是特别的了解,因此呢,今天就来为大家分享下关于epoll和select的区别以及epoll优点的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

poll和epoll的区别

epoll是对select和poll的改进,就应该能避免上述的三个缺点。那epoll都是怎么解决的呢?在此之前,我们先看一下epoll和select和poll的调用接口上的不同,select和poll都只提供了一个函数——select或者poll函数。而epoll提供了三个函数,epoll_create,epoll_ctl和epoll_wait,epoll_create是创建一个epoll句柄;epoll_ctl是注册要监听的事件类型;epoll_wait则是等待事件的产生。

对于第一个缺点,epoll的解决方案在epoll_ctl函数中。每次注册新的事件到epoll句柄中时(在epoll_ctl中指定EPOLL_CTL_ADD),会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。epoll保证了每个fd在整个过程中只会拷贝一次。

对于第二个缺点,epoll的解决方案不像select或poll一样每次都把current轮流加入fd对应的设备等待队列中,而只在epoll_ctl时把current挂一遍(这一遍必不可少)并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd(利用schedule_timeout()实现睡一会,判断一会的效果,和select实现中的第7步是类似的)。

对于第三个缺点,epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat/proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。

epoll模型属于计算机操作系统哪部分

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

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

select是什么操作系统

在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则是POSIX所规定,一般操作系统均有实现

epoll和reactor区别

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

而Reactor是第四代响应式库,是一个响应式编程范式的实现,用于在JVM平台上基于响应式流规范构建非阻塞异步应用。它是一个完全非阻塞响应式编程的基石。

linux I/O多路复用模型,为什么epoll性能高于select和poll

select和poll都是轮询指定的文件描述符数组,返回哪些可读、可写、异常。epoll是查询epoll句柄,获取可读、可写、异常的文件描述符。

select对数组元素的检查,需要没个描述符去判断。epoll只需要返回当前有状态(或状态切换)的注册到了该epoll句柄的描述符。

很多答案会说明用户态和系统态切换是核心性能的关键,个人习惯认为是软件层次和接口设计的必然结果:复用数组的构建是用户代码,epoll句柄内部实现是系统执行。

epoll的特点

支持一个进程打开的socket描述符(fd)不受限制(仅受限于操作系统的最大文件句柄数)

select最大的缺陷单个进程锁打开的fd是由一定限制的,由FD_SETSIZE设置(默认1024),想要修改需要重新编译内核。Java由于没有共享内存,需要通过socket或其他方式进行数据同步,有额外性能开销。epoll没有这个限制,可支持的fd位操作系统最大文件句柄数,1G内存大约10万个句柄。

I/O效率不会随着fd数目增加而线性下降

select每次都会现行扫描全部集合,在网络延时或链路空闲时,效率会比较低。epoll首先会向每个fd上注册事件,当fd状态就绪时,会调用callback,不需要遍历所有的fd。只有在所有的socket都处于活跃状态,epoll才会没有优势,甚至效率低于select

OK,本文到此结束,希望对大家有所帮助。

最新文章