网络编程13——epoll事件模型:ET和LT模、掌握实现epoll的ET模式(非阻塞模式

epoll是linux下多路复用IO select/poll 的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。因为它会复用文件描述符集合来传递结果为不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一个原因就是获取事件的时候,它无需遍历整个被侦听的描述符集,只需要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了

目前epoll是linux大规模并发网络程序中的首选模型

epoll除了提供 select/poll 那种IO事件的电平触发(Level Truggered)外,还提供了边沿触发(Edge Triggered),这就使得用户控件程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率


Level Truggered(LT):水平触发只要有数据都会被触发 —— 是默认触发模式(就是缓冲区只要还有数据就会触发
Edge Triggered(ET):边沿触发只有数据到来才触发,不管缓存区中是否还有数据
struct epoll_event event
event.events = EPOLLIN | EPOLLET

epoll的ET模式:高效,但只支持非阻塞模式

...
struct epoll_event;
event.events = EPOLL | EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_ADD, sfd, &event);//上树
//fctl函数设置非阻塞
int flg = fcntl(cfd,F_GETFL);
flg |= O_NONBLOCK;
fcntl(cfd, F_SETFL, flg);
...

epoll优缺点:
优点:高效,性能高效,编码高效;可以突破1024文件描述符,与poll方法一样
缺点:不能跨平台,只支持linux,所以需要对epoll封装


epoll的非阻塞ET模式实现(用fcntl函数

在这里插入图片描述
在这里插入图片描述

原创文章 119 获赞 27 访问量 5973

猜你喜欢

转载自blog.csdn.net/qq_37299596/article/details/106012711