Libevent核心原理
2024-08-25 08:48:34
Libevent 是一个事件驱动框架, 不能仅说他是一个网络库。
notejs就是采用与libevent类似的libev来做核心驱动的。
Libevent支持三种事件:io事件、信号事件、时间事件,并且事件的设置和使用方式是一样的。
libevent的核心原理是采用io多路复用的方式来单线程处理事件。至于为什么这么说,下面会分别对三种时间进行解释。
io事件: io事件包含socket可读、可写、断开、设备可读、可写等和IO相关的事件, libevent主要采用了epoll模型来进行i/o事件的多路复用(我说的是linux上,libevent也封装了select,poll模型,下面仅说采用epoll的情况)。 一句话解释epoll模型:就是在内核管理的设备或者资源上设置等待队列,当资源出现的时候,系统会通知epoll_wait唤醒,进行事件的处理。 总的来说, i/o事件的事件驱动依赖于操作系统。
时间事件: 时间事件,可以简单的解释一下, 如果我们想在500ms后执行一段代码,那么,就可以在libevent上面设置一个时间事件,代码封装到回调函数里面去。 如果看过epoll或者select的使用方式,你就会知道epoll_wait可以设置一个timeout,等待timeout这个时长,如果没有事件发生,也会返回。时间事件的处理就 将所有时间事件要等待时间最少的设置为timeout时间,这样,即使什么i/o事件也没有发生,也能在timeout后,处理该处理的时间事件。
信号事件: 简单的解释一下, 即使和i/o无关,也可以作为一个事件进行处理,信号的意思可以理解为一个字符串,例如当A发出一个“hello”,B注册了当收到“hello”事件的时候,就会执行一个函数。 其原理是, 将信号事件这种和I/O无关的事件转换为和I/O有关的,充分利用现有模型统一处理。事实上, 信号事件是采用一个client socket 和一个server socket, client socket只能写, server socket只能读, server sockert将recv到的client socket的文件描述符放到了epoll的事件集合中, 永远不删。 当发送信号的时候, 通过client socket进行发送, server socket收到数据,就会触发epoll_wait唤醒,如果发现这是server socket的事件,就会对信号事件进行遍历找到那个等待的。
事件的结构:
时间事件:采用最小堆组织, 时间最少的在顶部, 插入和删除都是log(N),主要是方便找到最小等待时间,方便设置time_out时间。
I/O事件:双向链表。
信号事件: 双向链表
激活事件:是libevent 的epoll_wait唤醒后,得到的所有要处理的事件双向链表。
主循环:
libevent采用一个主循环来处理所有事件处理和事件等待。
最新文章
- python——线程与多线程进阶
- python的最最最最最基本语法(2)
- ajax分页2:jquery.pagination +JSON 动态无刷新分页
- javascript whenReady
- 【转】最短路&;差分约束题集
- PHP读书笔记(6)- 数组
- 【Java基础】继承的一些总结
- phpcms v9自定义表单提交后返回上一页实现方法
- IDF实验室解题学习笔记1
- Hanoi汉诺塔问题——递归与函数自调用算法
- 十大ios开发者喜爱的开源库
- Python设计模式 - UML - 组合结构图(Composite Structure Diagram)
- Android 出现 activity supporting action_view is not set as browsable报错
- java8新特性(二)_lambda表达式
- POJ 2664
- PHP错误和异常处理
- 查询中mybatis的if判断里传入0
- USACO 6.5 The Clocks
- java spring boot 出现 java.lang.UnsatisfiedLinkError
- sysstat 工具