epoll原理图解

epoll原理图解流 I O 操作阻塞流可以进行 I O 操作的内核对象文件 管道 套接字 流的入口 文件描述符 fd 所有对流的读写操作 我们都可以称之为 IO 操作 那么当一个流中再没有数据 read 的时候 或者说在流中已经写满了数据 再 write 我们的 IO 操作就会出现一种现象 就是阻塞现象阻塞非堵塞阻塞等待 空出大脑可以安心睡觉 不占用 CPU 宝贵的时间片 非阻塞 忙轮询

流 I\O操作 阻塞

那么当一个流中再没有数据,read的时候,或者说 在流中已经写满了数据,再write,我们的IO操作就 会出现一种现象,就是阻塞现象

阻塞

在这里插入图片描述

非堵塞

在这里插入图片描述

阻塞等待: 空出大脑可以安心睡觉。(不占用CPU宝贵的时间片)
非阻塞,忙轮询: 浪费时间,浪费电话费,占用快递员时间(占用CPU,系统资源)

解决阻塞死等待的办法

办法一:非阻塞、忙轮询

在这里插入图片描述

在这里插入图片描述

办法二:select

在这里插入图片描述
select 代收员 比较懒,她只会告诉你快递到了,但是是谁到的,你需要挨个快递员问一遍

办法三:epoll(主角出场)

在这里插入图片描述

epoll特点好处:

epoll API

int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); struct epoll_event { 
    __uint32_t events; /* epoll 事件 */ epoll_data_t data; /* 用户传递的数据 */ } / * @param epfd 用epoll_create所创建的epoll句柄 * @param op 表示对epoll监控描述符控制的动作 * * EPOLL_CTL_ADD(注册新的fd到epfd) * EPOLL_CTL_MOD(修改已经注册的fd的监听事件) * EPOLL_CTL_DEL(epfd删除一个fd) * * @param fd 需要监听的文件描述符 * * /* * events : {EPOLLIN, EPOLLOUT, EPOLLPRI, EPOLLHUP, EPOLLET, EPOLLONESHOT} */ typedef union epoll_data { 
    void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event new_event; new_event.events = EPOLLIN | EPOLLOUT; new_event.data.fd = 5; epoll_ctl(epfd, EPOLL_CTL_ADD, 5, &new_event); 

触发模式

水平触发与边缘触发

水平触发

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

水平触发优点:

边缘触发

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

select poll epoll的区别参考这个博客

https://blog.csdn.net/_/article/details/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208721.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:55
下一篇 2026年3月19日 上午10:55


相关推荐

  • 有序的hashmap_在待排序的元素基本有序的前提下

    有序的hashmap_在待排序的元素基本有序的前提下如何给HashMap中的值排序?这个问题很多人都遇到过,很常见的一个方案是使用LinkedHashMap,因为LinkedHashMap可以记住元素放入的顺序,可以认为是真正的“有序”(想让HashMap有序是不可能的),我比较喜欢。然而问题是往往数据已经封装在了HashMap中,我们必须手动的排序后再放入LinkedHashMap,这当然也就成了思路,代码实现起来也很简单,写出来看起来还挺舒服的…

    2025年8月5日
    5
  • 揭秘Agent框架:人工智能领域的创新应用案例解析

    揭秘Agent框架:人工智能领域的创新应用案例解析

    2026年3月16日
    3
  • tp3.2分页样式

    tp3.2分页样式首先要搞清楚的就是ThinkPHP3.2.3的分页类已经被移到了Think\Page.class.php,这是跟以前的版本有些不一样的,使用起来还是跟以前版本差不多,但是默认的效果不敢恭维,所以最好是自己加些样式。我加了一些样式(不怎么好看),大家可以自行的再去改进分页样式,效果图:在这里我有先把page的设置做成了一个函数getpage,将这个方法放到Application\Commo…

    2022年7月17日
    22
  • 一步一步教你_CT增强技术

    一步一步教你_CT增强技术一篇来自博客园的作者的介绍实现text-detection-ctpn一路的坎坎坷坷作者讲的很详细,一步一个脚印。很适合初次接触CTPN的小白,老鸟也会学到不少新的东西。感谢作者。…

    2025年5月22日
    4
  • Eclipse中SVN插件的基本使用「建议收藏」

    Eclipse中SVN插件的基本使用「建议收藏」首先在提交代码的时候,会看到有的文件前会有雪花标志,代表该文件被修改过。提交代码的时候,点击整个项目,右键—team—与资源库同步,这个目的是检查本地的代码和服务器上的代码有没有冲突,如果有冲突的话,应该像将冲突解决,否则提交代码会出错,解决冲突看我的另一篇博客。点击与资源库同步按钮之后,会跳转到TeamSynchronizing界面,这个时候eclipse会自动检测本…

    2026年4月13日
    4
  • TransactionScope应用

    TransactionScope应用.NETFramework2.0版中新增的TransactionScope单独使用确实很方便。但是在实际项目中都有自己的访问层,如何才能和自己的数据访问层结合起来使用呢?          在项目中我是这样处理数据的: /**////   ///外包业务访问类   ///   publicclassOutSourcingDAO   {       /**

    2022年7月19日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号