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采用一个主循环来处理所有事件处理和事件等待。

Libevent核心原理的更多相关文章

  1. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

  2. docker核心原理

    容器概念. docker是一种容器,应用沙箱机制实现虚拟化.能在一台宿主机里面独立多个虚拟环境,互不影响.在这个容器里面可以运行着我饿们的业务,输入输出.可以和宿主机交互. 使用方法. 拉取镜像 do ...

  3. HDFS 核心原理

    HDFS 核心原理 2016-01-11 杜亦舒 HDFS(Hadoop Distribute File System)是一个分布式文件系统文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文 ...

  4. 剖析SSH核心原理(一)

      在我前面的文章中,也试图总结过SSH,见 http://blog.csdn.net/shan9liang/article/details/8803989 ,随着知识的积累,总感觉以前说得比较笼统, ...

  5. 关于Ajax的技术组成与核心原理

    1.Ajax 特点: 局部刷新.提高用户的体验度,数据从服务器商加载 2.AJax的技术组成 不是新技术,而是之前技术的整合 Ajax: Asynchronous Javascript And Xml ...

  6. 高性能消息队列 CKafka 核心原理介绍(上)

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:闫燕飞 1.背景 Ckafka是基础架构部开发的高性能.高可用消息中间件,其主要用于消息传输.网站活动追踪.运营监控.日志聚合.流式 ...

  7. Python面向对象篇之元类,附Django Model核心原理

    关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...

  8. 《大型网站技术架构:核心原理与案例分析》【PDF】下载

    <大型网站技术架构:核心原理与案例分析>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062557 内容简介 本书通过梳理大型网站 ...

  9. Maven 核心原理

    Maven 核心原理 标签 : Java基础 Maven 是每一位Java工程师每天都会接触的工具, 但据我所知其实很多人对Maven理解的并不深, 只把它当做一个依赖管理工具(下载依赖.打包), M ...

随机推荐

  1. PHP 3:从Login界面谈PHP标记

    原文:PHP 3:从Login界面谈PHP标记 前一篇文章简要介绍了此实例.OK,我们就从第一个页面Login页面入手吧.还是看看界面怎么样,是不是很想指导它到底是如何实现的呢?好的,看看其代码吧: ...

  2. Ubuntu12.10无法安装openssh-server[已解决]

    因为要在Ubuntu下搞些东西,家里的台式有Deepin2013,但是发现有很多依赖的问题,实在不想解决,就到win7下用VBox安装了Ubuntu.打算使用SourceCRT连接虚拟机,但是在安装在 ...

  3. Spring IOC 之ApplicationContext的其他功能

    正如上面章节所介绍的那样, org.springframework.beans.factory 包提供了管理和操作beans的 基本功能. org.springframework.context包增加 ...

  4. C语言内存对齐(2)

    前两天参加了360测试实习生的笔试,碰到了一个有关c语言内存对齐的题目,回来后实现了一下,下面是代码: #include <stdio.h> #include <stdlib.h&g ...

  5. Azure China

    Azure China   Azure China (2) Azure China管理界面初探 摘要: <Windows Azure Platform 系列文章目录> 首先是Q&A ...

  6. C/S应用升级更新完整解决方案

    年末福利,C/S应用升级更新完整解决方案放送 程序员,工作累寿命短,大家应该学会分享,别浪费有限的生命与健康做重复的事情. C/S方式实现的应用有个升级更新功能是必需的,以前整过一个但是没考虑多套C/ ...

  7. Hadoop 从URL中读取数据

    package com.hadoop; import java.io.IOException; import java.io.InputStream; import java.net.URL; imp ...

  8. 用py2exe打包pyqt4出现的问题(转)

    使用pyqt完成窗体界面很方便,但是打包成exe之后会有问题,在网上找到解决办法如下: Another Solution to the same problem: from distutils.cor ...

  9. TD中{text-overflow:ellipsis;} 用法

    Styles: table{ table-layout:fixed; } table td{ text-overflow:ellipsis;overflow:hidden;white-space: n ...

  10. [转]Data Structure Recovery using PIN and PyGraphviz

    Source:http://v0ids3curity.blogspot.com/2015/04/data-structure-recovery-using-pin-and.html --------- ...