epoll模型属于计算机操作系统哪部分?
epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
epoll实现原理?
Epoll是Linux IO的多路复用的机制,是select/poll的增强版本,在Linux内核fs/eventpoll.c中可以查看epoll的具体的实现。
学习任何组件,首先得知道它有什么数据结构或者数据类型,epoll主要有两个结构体:eventpoll和epitem。epitem是每一个IO对应的事件,比如EPOLL_CTL_ADD操作时,就需要创建一个epitem;eventpoll是每一个epoll所对应的,比如epoll_create就是创建一个eventpoll。
libevent详解?
libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。
libevent支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务。
linux I/O多路复用模型,为什么epoll性能高于select和poll?
select和poll都是轮询指定的文件描述符数组,返回哪些可读、可写、异常。epoll是查询epoll句柄,获取可读、可写、异常的文件描述符。
select对数组元素的检查,需要没个描述符去判断。epoll只需要返回当前有状态(或状态切换)的注册到了该epoll句柄的描述符。
很多答案会说明用户态和系统态切换是核心性能的关键,个人习惯认为是软件层次和接口设计的必然结果:复用数组的构建是用户代码,epoll句柄内部实现是系统执行。
应该是存在大量不活跃的连接时候,epoll会比select高效,因为select会进行全量遍历。在连接数不多或者全部活跃的场景下,select可能比epoll高效。