对linux 多路复用Epoll模型的水平出发模式和边缘触发模式的理解
来源:互联网 发布:王者荣耀天魔缭乱优化 编辑:程序博客网 时间:2024/04/30 04:08
水平触发通知又叫“低速模式”,是linux epoll模型的默认方式。对于此方式《Linux/Unix系统编程手册(下册)》中的解释是:如果文件描述符上可以非阻塞地执行I/O系统调用,此时认为它已经就绪。
对此,我的理解是:某个I/O实践就绪,例如,文件缓冲区收到了5个字节的数据,此时此文件描述符可读,触发epoll可读事件。但是如果就绪的文件描述符是非阻塞的(也就是说中途可以被打断),当读取三个字节的时候被别的事件打断了,下次仍然触发此描述符的可读事件,会接着读上次没读完的两个字节。
边沿触发通知又叫”高速模式“(ET),书上的解释是:如果文件描述符自上次状态检查以来有了新的I/O活动(比如新的输入),此时需要触发通知。
我的理解是:拿可读事件来说,如果文件缓冲区收到了5个字节的数据,触发通知,开始读取缓冲区数据,如果此文件描述符仍然是非阻塞的,被别的信号打断后,未来得及读取的数据将丢失,只有下次再有新的数据加入缓冲区后,再次触发通知,读取新的数据。因此使用"ET模式"时需要尽可能多的读取或者写入数据。
设置EPOLL 为ET 模式的方法:
struct epoll_event ev;ev.data.fd = fd;ev.events = EPOLLIN | EPOLLET;epoll_ctl(epoll_fd,EPOLL_ZTL_ADD,fd, &ev);
设置文件为非阻塞模式的方法:
主要使用如下两个函数
获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0);设置文件的flags: fcntl(fd,F_SETFL,flags);
设置方法 flags = fcntl(fd,F_GETFL,0); flags |= O_NONBLOCK; fcntl(fd,F_SETFL,flags); 或者一步到位的方式: fcntl(socket,F_SETFL,fcntl(socket,F_GETFL)|O_NONBLOCK);
0 0
- 对linux 多路复用Epoll模型的水平出发模式和边缘触发模式的理解
- epoll的水平触发和边缘触发
- epoll的水平触发和边缘触发
- EPOLL边缘触发和水平触发的区别
- epoll 水平触发和边缘触发的区别
- epoll 水平触发和边缘触发的区别
- epoll 水平触发和边缘触发的区别
- epoll 水平触发和边缘触发的区别
- epoll的边缘触发(ET)和水平触发(LT)
- 聊聊epoll的水平触发和边缘触发
- [Linux]实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO
- 水平出发和边缘出发的区别
- epoll 水平触发和边缘触发
- Epoll水平触发(Level Triggered)工作模式和边缘触发(Edge Triggered)工作模式区别
- I/O多路复用之水平触发和边沿触发模式
- 水平触发和边缘触发的区别
- 水平触发和边缘触发的区别
- 水平触发和边缘触发的区别
- 网络舆情分析技术 读书笔记1
- QT中QFileDialog的使用
- 第八周 字符串加密
- 文章标题
- 【第11周 项目1 - 二叉树算法验证(1)层次遍历算法的验证】
- 对linux 多路复用Epoll模型的水平出发模式和边缘触发模式的理解
- PHP模板引擎的原理与实践
- 第十三周 图(二) 项目1 最小生成树的普里姆算法
- KMP字符串模式匹配详解
- 解决Eclipse闪退
- Java反射机制getClass()函数
- Xcode7---项目模拟器运行不了,一个月时间了,终于解决问题啦
- linux源码搭建lamp环境 + 源码包
- 十三周 项目2-Kruskal算法的验证