epoll
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
epoll除了提供select/poll那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
cat查看一个进程打开socket描述符上限
cat /proc/sys/fs/file-max
如有需要,可以通过修改配置文件的方式修改上限值
sudo vi /etc/security/limits.conf
在文件尾部写入以下配置,soft软限制,hard硬限制。如下:
soft nofile 65536
hard nofile 100000
epoll API函数
1.创建一个epoll句柄,参数size用来告诉内核监听的文件描述符的个数,跟内存大小有关。
#include <sys/epoll.h>
int epoll_create(int size) size:监听数目
2.控制某个epoll监控的文件描述符上的事件:注册 修改 删除
int epoll_ctl(int epfd,int fd,struct epoll_event *event)
epfd: 为epoll_create的句柄
op: 表示动作 用三个宏来表示:
EPOLL_CTL_ADD(注册新的fd到epfd),
EPOLL_CTL_MOD(修改已经注册的fd的监听事件)
EPOLL_CTL_DEL(从epfd删除一个fd);
event:告诉内核需要监听的事件
struct epoll_event{
__uint32_t events;/*Epoll events*/
epoll_data_t data;//
}
该函数的作用就是将要监听的节点挂到树上