1、前言
之前我有写过 利用多路转接的select的TCP_server,但当时我们提到了很多关于select的缺点:
1、select可监听的文件描述符有上限制;
2、因为select参数是输入输出型的,所以每次重新设置select时,都需遍历式设置,对性能有一定的影响
3、用户增多时,多次重复遍历和频繁内核与进程数据拷贝(多次的返回)
4、需要自己维护一个数组/链表,对文件描述符的管理,实现也比较复杂
5、每次多需要重新设置select—将fd设置从用户拷贝到内核
基于这么多的缺和实现的复杂,所以我们基本不会使用select来实现,而今天的主题epoll对这些问题都进行解决
2、epoll
epoll man手册上说linux2.6后性能最好的!!!
为什么性能好呢?
我们来看张图:
再来学习epoll的函数:
epoll有三个函数:
1、int epoll_create(int size); //创建epoll(创建红黑树)
- 参数size :对内核的提醒(建议)空间大小,man手册解释size可以被忽略
- 返回值: 返回一个epoll句柄,用于对红黑树的操作,在使用完epoll之后,因使用close()关闭;
2、int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) //设置红黑树
- 参数:epfd , 红黑树的句柄
- 参数:op,操作方式,有以下三种:
EPOLL_CTL_ADD :添加事件(在红黑树上添加节点)
EPOLL_CTL_MOD:更改事件(改变红黑树指定节点事件发生条件)
EPOLL_CTL_DEL:删除事件(删除节点)- 返回值: 成功返回 0、失败返回-1;
3、int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);//等待事件就绪函数
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;