epoll,select,poll

1、epoll的具体步骤
epoll_create(),返回一个句柄,之后的使用都依靠这个句柄来标识
epoll_ctl(),包括epoll_ctl_add,epoll_ctl_mod,epoll_ctl_del,分别进行添加、修 改、删除操作。
epoll_wait()通过这个调用收集在epoll监控中已经发生的事件
2、epoll为什么高效
epoll使用红黑树保存事件,红黑树的深度为N=2lg(n+1),执行搜索插入操作复杂度为O(lgN)
每一个epoll事件都会建立一个epitem结构体,这个结构体中存放了红黑树节点、双向链表rdlist、事件句柄信息、eventpoll指针、期待发生的事件,其中eventpoll是另一个结构体,这个结构体中存放epoll_ctl_create添加的事件和红黑树根节点
每一个epoll事件都会和设备驱动建立回调的关系,称为ep_poll_callback
综上,epoll结合红黑树和双链表rdlist以及回调机制导致了epoll的高效。
3、select
函数原型int select(int maxfdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout);
参数说明:maxfdp1指定了一个待测定的描述个数符,通常为1024(也是上限,所以select在高并发中性能会很低)
readfs,writefds,exceptfds指定了让内核测试读、写、异常条件的描述符
timeout指定了等待描述符的时间,有以下三种情况:
1)指定为空,永远等下去
2)指定为0,不等,检查了即返回,称为轮询(polling)
3)等待一段时间(timeout为一个结构体,存放了秒和微秒)
select相对于epoll的缺点:
1:如参数说明中
2:内核/用户空间拷贝问题,select需要复制大量的句柄数据结构,产生大量数据开销
3:select返回的是句柄数组,需要对这个数据进行遍历才能知道发生了什么事件
4:select的触发方式是水平触发,如果事件没有完成对已就绪的描述符进行IO操作,之后select还会将这些描述符通知进程
4、poll
函数原型:int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
fdarrary是一个结构体指针,这个结构体中存放了文件描述符fd、等待(感兴趣)发生的事件events、已发生的事件revents
nfds指定了结构体数组中元素的个数,为nfds_t类型(unsigned int)
timeout:永远等待:INFTIM(通常被定义为一个负值),立即返回:0,等待一段事件:>0
参考文章:https://www.cnblogs.com/Anker/p/3265058.html
https://www.cnblogs.com/Anker/p/3261006.html
https://blog.csdn.net/shenya1314/article/details/73691088

猜你喜欢

转载自blog.csdn.net/weixin_42680642/article/details/82561275
今日推荐