手赚网站哪里可以做海淘网站
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:28
当前位置: 首页 > news >正文
手赚网站哪里可以做,海淘网站,江西最新新闻事件,专门做排名的软件博客主页#xff1a;花果山~程序猿-CSDN博客 文章分栏#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习#xff0c;一起进步#xff0c;一起探索编程的无限可能吧#xff01;让我们一起努力#xff0c;一起成长#xff01; 目录 一#xff0c;接口 epo… 博客主页花果山~程序猿-CSDN博客 文章分栏Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习一起进步一起探索编程的无限可能吧让我们一起努力一起成长 目录 一接口 epoll_create epoll_ctl event 事件类型 epoll_wait 二epoll优点相较selectpoll 三epoll有2种工作方式 如何理解两种工作方式(快递员例子) 水平触发Level Triggered 工作模式 边缘触发Edge Triggered工作模式 epoll使用场景 epoll中的惊群问题(选学) ET模式使用思路 嗨收到一张超美的图愿你每天都能顺心 一接口 epoll_create epoll_create(size_t size) 用于创建一个epoll文件描述符返回一个非负整数表示新创建的epoll实例的文件描述符。size是一个建议值表示最初能容纳多少个事件但实际上内核可能会忽略此参数。 参数 size建议的初始事件槽的数量但在现代内核版本中此参数几乎无用内核会根据需要动态调整。 epoll_ctl epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) 用于向epoll实例添加、修改或删除文件描述符的监听事件。 参数 epfdepoll_create返回的epoll文件描述符。op操作类型可以是EPOLL_CTL_ADD添加、EPOLL_CTL_MOD修改、EPOLL_CTL_DEL删除。fd需要操作的文件描述符。event指向struct epoll_event结构体的指针包含需要监控的事件类型。 event 事件类型 EPOLLIN - 表示描述符可读例如有数据可读取。EPOLLOUT - 表示描述符可写例如可以发送数据。EPOLLERR - 表示描述符有错误。EPOLLHUP - 表示描述符挂起例如对端关闭了连接。EPOLLET - 这是一个边缘触发模式标志不是事件类型但它可以与其他事件类型结合使用以改变事件检测的行为。EPOLLONESHOT - 这个标志让 epoll_wait() 在第一次匹配到这个事件后就不再为这个文件描述符报告该事件直到 epoll_ctl() 再次修改此文件描述符的监听条件。EPOLLEXCLUSIVE - 当设置此标志时如果多个进程或线程尝试等待同一个事件那么仅有一个等待者会被唤醒 epoll_wait epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout) 等待已注册文件描述符上的I/O事件发生并返回就绪事件的数目。 参数 epfdepoll_create返回的epoll文件描述符。events一个指向epoll_event数组的指针用于返回就绪事件。maxevents最大可返回的就绪事件数。timeout等待的超时时间毫秒为单位。如果设置为负数或0则epoll_wait立即返回如果大于0则表示等待的时间。 结构体epoll_event 从底层原理理解三接口负责的功能图 当某一进程调用 epoll_create方法时Linux内核会创建一个eventpoll结构体这个结构体中有两个成员与epoll的使用方式密切相关 struct eventpoll{ …. /红黑树的根节点这颗树中存储着所有添加到epoll中的需要监控的事件/ struct rb_root rbr; /双链表中则存放着将要通过epoll_wait返回给用户的满足条件的事件/ struct list_head rdlist; …. }; 每一个epoll对象都有一个独立的eventpoll结构体用于存放通过epoll_ctl方法向epoll对象中添加进来的事件这些事件都会挂载在红黑树中如此重复添加的事件就可以通过红黑树而高效的识别出来(红黑树的插入时间效率是lgn其中n为树的高度). 而所有添加到epoll中的事件都会与设备(网卡)驱动程序建立回调关系也就是说当响应的事件发生时会调用这个回调方法. 这个回调方法在内核中叫ep_poll_callback,它会将发生的事件添加到rdlist双链表中. 在epoll中对于每一个事件都会建立一个epitem结构体. struct epitem{ struct rb_node rbn;//红黑树节点 struct list_head rdllink;//双向链表节点 struct epoll_filefd ffd; //事件句柄信息 struct eventpoll *ep; //指向其所属的eventpoll对象 struct epoll_event event; //期待发生的事件类型 } 如果 rdlist 不为空则把发生的事件复制到用户态同时将事件数量返回给用户 . 这个操作的时间复杂度是O(1)。 如何理解参数epfd的作用 总结一下, epoll的使用过程就是三部曲: 调用epoll_create创建一个epoll句柄; 调用epoll_ctl, 将要监控的文件描述符进行注册; 调用epoll_wait, 等待文件描述符就绪 二epoll优点相较selectpoll 接口使用方便: 虽然拆分成了三个函数, 但是反而使用起来更方便高效. 不需要每次循环都设置关注的文件,描述符, 也做到了输入输出参数分离开 数据拷贝轻量: 只在合适的时候调用 EPOLL_CTL_ADD 将文件描述符结构拷贝到内核中, 这个操作并不频繁(而select/poll都是每次循环都要进行拷贝) 事件回调机制: 避免使用遍历, 而是使用回调函数的方式, 将就绪的文件描述符结构加入到就绪队列中, epoll_wait 返回直接访问就绪队列就知道哪些文件描述符就绪. 这个操作时间复杂度O(1). 即使文件描述符数目很多, 效率也不会受到影响。没有数量限制: 文件描述符数目无上限 三epoll有2种工作方式 epoll 有 2 种工作方式 - 水平触发 (LT) 和边缘触发 (ET 如何理解两种工作方式(快递员例子) LT: 当你的外卖数据到时外卖员底层会一直给你打电话通知直到你下来将你的所有外卖都取走数据拿走 。 ET: 外卖来时外卖员(底层)只给你打一次电话你如果不下来取外卖员底层不会再通知你你的外卖数据就再也拿不到了。 比较标准的解释 水平触发Level Triggered 工作模式 epoll 默认状态下就是 LT 工作模式: 当epoll检测到socket上事件就绪的时候, 可以不立刻进行处理. 或者只处理一部分. 如由于只读了1K数据, 缓冲区中还剩1K数据, 在第二次调用 epoll_wait 时, epoll_wait 仍然会立刻返回并通知socket读事件就绪. 直到缓冲区上所有的数据都被处理完, epoll_wait 才不会立刻返回.(一直通知你直到数据全部取走)支持阻塞读写和非阻塞读写 边缘触发Edge Triggered工作模式 如果我们在第 1 步将 socket 添加到 epoll 描述符的时候 使用了EPOLLET标志, epoll进入ET工作模式. 当epoll检测到socket上事件就绪时, 必须立刻处理. 如上面的例子, 虽然只读了1K的数据, 缓冲区还剩1K的数据, 在第二次调用 epoll_wait 的时候, epoll_wait 不会再返回了. 也就是说, ET模式下, 文件描述符上的事件就绪后, 只有一次处理机会.ET模式下只有一次处理机会这样倒逼程序员要一次取完所有的数据ET的性能比LT性能更高( 相同的运行时间内epoll_wait 返回的次数少了很多 无效通知减少 增加其他socket通知的数量). Nginx默认采用ET模式使用epoll. 只支持非阻塞的读写 select 和 poll 其实也是工作在 LT 模式下 . epoll 既可以支持 LT, 也可以支持ET。 在 LT 情况下如果也能做到每次就绪的文件描述符都立刻处理, 不让这个就绪被重复提示的话 , 其实性能也是一样的 . 但是另一方面, ET 的代码复杂程度更高了。 epoll使用场景 epoll的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll的性能可能适得其反. 对于多连接, 且多连接中只有一部分连接比较活跃时, 比较适合使用epoll. 例如 , 典型的一个需要处理上万个客户端的服务器 , 例如各种互联网 APP的入口服务器 , 这样的服务器就很适合 epoll. 如果 只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll就并不合适 . 具体要根 据需求和场景特点来决定使用哪种IO 模型。 epoll中的惊群问题(选学) 惊群问题有些面试官可能会问到 . 建议同学们课后自己查阅资料了解一下问题的解决方案。 参考 http://blog.csdn.net/fsmiy/article/details/36873357 ET模式使用思路 1.epoll_ctl时添加的文件描述符需要添加设置 EPOLLET这样一旦事件就绪通过epoll_wait报告一次。 2.将需要设置的fd如listen_socket设置为非阻塞式在通过accept系统调用时进行轮询直到资源被全部提取后才结束轮询。采用非阻塞式就是为了避免一次未取完资源ET模式下事件不再通知导致事件资源丢失——可参考fcntl接口的非阻塞例子 例如这个监听套接字的例子 选择ET和LT 选择哪种模式取决于具体的应用场景和需求。如果你的应用程序需要处理大量并发连接并且对实时性要求较高那么 ET 模式可能是更好的选择。如果你的应用程序需要处理长时间存在的连接并且更关注稳定性那么 LT 模式可能是更好的选择。 用ET模式优化自主web服务器 Apache 和 Nginx 是两款广泛使用的 Web 服务器软件它们在处理大量并发连接方面表现出色。为了实现高效的并发处理这两款服务器都利用了 Linux 内核提供的高性能 I/O 多路复用机制 epoll。 Apache通常使用 Level Triggered (LT) 模式因为它提供了更好的稳定性和易用性。Nginx通常使用 Edge Triggered (ET) 模式因为它提供了更高的性能和实时性。 框架图 简单实现自主 web服务器的epoll的 ET模式框架图 优化心得总结 读事件思维逻辑 系统会自动检测已经被标识的套接字当套接字有数据到达时触发读事件并自动将该事件加载到 epoll 的事件队列中随后用户可以通过不断轮询 epoll_wait 函数来获取并处理这些事件如处理方法监听套接字上的 accept 操作。 写事件思维逻辑 当一个套接字的发送缓冲区满时写操作会被阻塞。内核维护了一个发送缓冲区的状态当缓冲区中有足够的空间可以写入数据时内核会将该文件描述符标记为可写即 EPOLLOUT 事件就绪。 关于写事件逻辑理解 1. 刚连接时是否需要设置写事件 当一个套接字刚刚建立连接时通常情况下发送缓冲区是有空间的。但是为了确保应用程序能够及时响应写操作通常的做法是在连接建立后立即设置写事件。这样做有几个好处 立即响应如果发送缓冲区确实有空间那么设置写事件可以确保应用程序能够立即响应写操作。这有助于提高应用的响应速度。预防缓冲区满的情况即使当前缓冲区有空间设置写事件可以防止未来缓冲区满时错过写事件。在 ET 模式下如果没有设置写事件当缓冲区满时应用程序将不会收到 EPOLLOUT 事件从而可能导致数据积压。 2. 在写操作被阻塞时设置写事件 如果你在写操作被阻塞时才设置写事件可能会导致以下问题 事件丢失在 ET 模式下如果写操作被阻塞并且在设置写事件之前缓冲区有了空间那么这个事件可能会被丢失。因为 ET 模式只会报告一次事件除非应用程序显式地清除事件状态。延迟响应如果在写操作被阻塞时才设置写事件可能会导致响应延迟。因为此时缓冲区已经有空间了但应用程序还没有设置写事件所以不会立即得到通知。 3. 刚连接时设置写事件是否会立即触发一次写事件 当一个套接字刚刚建立连接时发送缓冲区通常有空间。在这种情况下设置写事件确实可能会立即触发一次写事件。然而这是预期的行为处理起来比较简单。 异常事件逻辑 在epoll的ET模式下想要主要触发异常事件如EPOLLERR ,EPOLLHUP可以制造错误条件达到目的。比如通过主动close文件描述符那么EPOLLHUP事件会被触发。 总结一下 LT水平触发 EPOLLIN 触发条件 读缓冲区有数据就一直触发即epoll_wait时能检测到没有就不触发。 EPOLLOUT 触发条件 写缓冲区有空间可写则一直触发。 ET边缘触发 EPOLLIN 触发条件 1. 当读 buff 从 空 - 不空 时触发 2. 当有新数据到达时即读 buff 数据由 少 - 多 时触发 3. 当读 buff 有数据可读时我们不处理但是对相应fd进行epoll_ctl重新注册epoll_mod IN事件时触发。 EPOLLOUT 触发条件 1. 当写 buff 从 满 - 不满 时触发 2. 当有数据被送走时即写 buff 数据由 多 - 少 时触发 3. 当写 buff 有数据但是我们没处理没发送出去但是对相应fd进行epoll_ctl重新注册epoll_mod OUT事件时触发。 结语 本小节就到这里了感谢小伙伴的浏览如果有什么建议欢迎在评论区评论如果给小伙伴带来一些收获请动动你发财的小手点个免费的赞你的点赞和关注永远是博主创作的动力源泉。
- 上一篇: 手游传奇网站云南seo网站关键词优化软件
- 下一篇: 首钢建设二公司网站wordpress下载主题模板
相关文章
-
手游传奇网站云南seo网站关键词优化软件
手游传奇网站云南seo网站关键词优化软件
- 技术栈
- 2026年04月20日
-
手淘网站建设需求分析网页界面设计的尺寸
手淘网站建设需求分析网页界面设计的尺寸
- 技术栈
- 2026年04月20日
-
手机做印章网站湖南吉首建设官方网站
手机做印章网站湖南吉首建设官方网站
- 技术栈
- 2026年04月20日
-
首钢建设二公司网站wordpress下载主题模板
首钢建设二公司网站wordpress下载主题模板
- 技术栈
- 2026年04月20日
-
寿光建设银行光明路网站网络管理系统逻辑上的四个组成
寿光建设银行光明路网站网络管理系统逻辑上的四个组成
- 技术栈
- 2026年04月20日
-
寿光网站建设m0536页面模板免费
寿光网站建设m0536页面模板免费
- 技术栈
- 2026年04月20日
