libev
文章平均质量分 77
gqtcgq
这个作者很懒,什么都没留下…
展开
-
Libev源码分析10:libev中poll的用例
在Libev中,使用poll作为backend时,涉及到下面几种数据结构:int *pollidxs;int pollidxmax;struct pollfd *polls;int pollmax;int pollcnt; polls就是struct pollfd结构的数组,pollmax是该数组的实际大小,pollcnt表示该数组中,有效结构的个数。也就是监控的原创 2015-10-11 13:37:50 · 937 阅读 · 0 评论 -
Libev源码分析05:Libev中的绝对时间定时器
Libev中的超时监视器ev_periodic,是绝对时间定时器,不同于ev_timer,它是基于日历时间的。比如如果指定一个ev_periodic在10秒之后触发(ev_now() + 10),然后将系统时间调整为去年的一月一号,则该定时器会在一年后才触发超时事件。(ev_timer依然会在10秒之后触发) 一:数据结构 超时监视器ev_ periodic结构:t原创 2015-10-31 11:30:38 · 3027 阅读 · 0 评论 -
Libev源码分析09:select突破处理描述符个数的限制
众所周知,Linux下的多路复用函数select采用描述符集表示处理的描述符。描述符集的大小就是它所能处理的最大描述符限制。通常情况下该值为1024,等同于每个进程所能打开的描述符个数。 增大描述符集大小的唯一方法是先增大FD_SETSIZE的值,然后重新编译内核,不重新编译内核而改变其值时不够的。 在阅读Libev源码时,发现它实现了一种原创 2015-08-27 22:24:25 · 1223 阅读 · 0 评论 -
Libev源码分析01:Libev中的监视器结构(C结构体实现继承)
在Libev的源码中,用到了一种用C实现类似C++中继承的技巧,主要是用宏和结构体实现。 在Libev中,最关键的数据结构就是各种监视器,比如IO监视器,信号监视器等等。这些监视器的多数成员都是一样的,只有少部分成员为各自独有。这就非常类似于C++中继承的使用场景了。废话少说,代码如下(略有改动,某些宏做了展开):# define EV_CB_DECLARE(type) v原创 2015-09-13 17:11:55 · 1268 阅读 · 2 评论 -
Libev源码分析03:Libev使用堆管理定时器
Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆。 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率比较低,说白了,就是违背了局部性原理。这是因为在2叉堆中,对元素的操作通常在N和N/2之间进行,所以对于含有大量元素的堆来说,两个操作数之间间隔比较远,对CPU缓存利用不太原创 2015-10-17 13:15:53 · 1838 阅读 · 0 评论 -
Libev源码分析04:Libev中的相对时间定时器
Libev中的超时监视器ev_timer,就是简单的相对时间定时器,它会在给定的时间点触发超时事件,还可以在固定的时间间隔之后再次触发超时事件。 所谓的相对时间,指的是如果你注册了一个1小时的超时事件,然后调整系统时间到了去年的一月份,该超时事件依然会在1个小时之后触发。 一:数据结构1:超时监视器ev_timer结构:typedef struct ev_tim原创 2015-10-25 11:05:21 · 4367 阅读 · 0 评论 -
Libev源码分析06:异步信号同步化--sigwait、sigwaitinfo、sigtimedwait和signalfd
一:信号简述 信号是典型的异步事件。内核在某个信号出现时有三种处理方式:a:忽略信号,除了SIGKILL和SIGSTOP信号不能忽略外,其他大部分信号都可以被忽略;b:捕捉信号,也就是在信号发生时调用一个用户函数,注意不能捕捉SIGKILL和SIGSTOP;c:执行系统默认动作,注意大多数信号的系统默认动作是终止进程。 调用execve执行一个新原创 2015-11-06 21:37:33 · 7254 阅读 · 0 评论 -
Libev源码分析07:Linux下的eventfd简介
#include int eventfd(unsigned int initval, int flags); eventfd创建一个eventfd对象,该对象可用于用户空间的程序实现事件等待、通知机制,也可用于由内核向用户空间的应用进行事件的通知。eventfd对象在内核中包含了一个计数器,该计数器是64位的无符号整数(uint64_t),该计数器由eventfd函数的in原创 2015-11-06 22:44:21 · 1184 阅读 · 0 评论 -
Libev源码分析08:Libev中的信号监视器
Libev中的信号监视器,用于监控信号的发生,因信号是异步的,所以Libev的处理方式是尽量的将异步信号同步化。异步信号的同步化方法主要有:signalfd、eventfd、pipe、sigwaitinfo等。这里Libev采用的是前三种方法,最终都是将对异步信号的处理,转化成对文件描述符的处理,也就是将ev_signal转化为处理ev_io。 一:数据结构1:ev_signalt原创 2015-11-08 09:32:12 · 2435 阅读 · 0 评论 -
Libev源码分析08:Libev中的内存扩容方法
在Libev中,如果某种结构的数组需要扩容,它使用array_needsize宏进行处理,比如:array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2); 这就表示要将整型(int)数组fdchanges,由原来的fdchangemax个元素扩容为fdchangecnt,新扩容的内存空间使用EMPTR原创 2015-11-15 09:51:39 · 1006 阅读 · 0 评论 -
Libev源码分析02:Libev中的IO监视器
一:代码流程 在Libev中,启动一个IO监视器,等待该监视器上的事件触发,然后调用该监视器的回调函数。整个的流程是这样的: 首先调用ev_default_loop初始化struct ev_loop结构; 然后调用ev_io_init初始化监视器中的属性,该宏主要就是调用ev_init和ev_io_set; 然后调用ev_i原创 2015-10-25 10:27:52 · 2791 阅读 · 0 评论 -
epoll与fork
使用epoll时,如果在调用epoll_create之后,调用了fork创建子进程,那么父子进程虽然有各自epoll实例的副本,但是在内核中,它们引用的是同一个实例。所以会发生意想不到的问题,分情况看一下: 1:向子进程中的epoll实例添加描述符,描述符事件触发后,也会影响到父进程的epoll实例,代码如下:#define MAXEVENTS 20int lis原创 2015-09-28 22:22:52 · 2520 阅读 · 1 评论