实测epoll的LT和ET模式

epoll有两种工作模式:LT(Level-Trigge)和ET(Edge-Trigger),LT为缺省模式。

  • LT:无限次地“驱动”事件处理逻辑去处理事件,直到事件被处理“干净”。未被处理“干净”的事件是指,事件未被处理,或事件被处理了,但尚未处理完全。例如,接收缓冲区有数据就绪,此时,事件处理逻辑不recv该数据,或只recv了一部分,都属于处理不干净。

  • ET:一个事件发生时,只”驱动“一次事件处理逻辑。处理逻辑若不把此事处理”干净“,以后将不再有机会。当然 ...


逐步实现TCP服务端Step04-8:epoll

epoll是对selectpoll的强化,是Linux(2.6内核开始支持)特有的机制。它有这么几个特点:1. 内核维护了一个事件列表用于记录各描述符上注册的事件,某个文件描述符上的事件只需向内核注册一次,不必像selectpoll那样每次调用都要向内核注册一遍;2. 监测结果集中只会给出就绪了的文件描述符;3. 支持ET工作模式。

这是在目前的程序(netio)结构下,使用select ...


逐步实现TCP服务端Step04-7:select、poll

select是最基本的I/O多路复用函数,Linux及Windows平台均提供支持。pollselect类似,二者的语义都是在给定的时间内对一组文件描述符进行遍历检查,找出其中的就绪者。

  • nfds:要求给出传入集合中最大的文件描述符值+1,内核需要知道这个值已确保其操作能涵盖结合中的所有文件描述符。
  • readfds/writefds/exceptfds ...


逐步实现TCP服务端Step04-6:I/O多路复用

I/O多路复用是一种I/O模式,由OS提供支持。基于该方式,可对多个I/O实施管理。

由进程发起的一次I/O操作,其执行包含两个阶段:1. 准备数据;2. 复制数据。处于用户空间的进程没有直接操作设备的权限,这两步操作都由内核完成。第一步所谓的准备数据,指的是内核将设备中的数据取到内核缓冲中。比如当收到一个完整TCP报文段时,其携带的数据会被存到内核缓冲中,此时的状态就是数据准备已就绪。第一步就绪后,第二步则会将内核缓冲中的数据拷贝到进程空间中的指定区域(用户缓冲 ...


逐步实现TCP服务端Step04-5:内存管理

这里要说的不是操作系统层面的内存管理,而是在netio及s中对对象实施的管理。之前实现的那些类大多重载了new运算符,在实例化时实际使用的是从共享内存中分配的一块空间。这块共享内存是事先创建好的一块足够大的空间,通过计算相关对象的尺寸,及运行时最多会创建的对象的个数可以得出这块共享内存的大小。

下图为目前为止各类间的静态关系 ...


逐步实现TCP服务端Step04-4:令Control更抽象

直接继承自Control的NControl和SControl代表了两种主控类,一种专注于通信,另一种则不需要通信。对专注于通信的类而言,Recover功能并非必要,不支持通信的主控类因不与client直连,可在client无感的情况下重启进程,此时的Recover功能是必要的。要实现Recover,主控类就需要构建在一块共享内存之上。

简单地说,在Control的基础之上,NControl要实现一套与通信相关的方法及属性且不需要SharedMemory属性,SControl需要SharedMemory属性,与通信相关的内容一律不要。

按照目前的设计,假设NControl自己实现了一个用于通信的方法,若想通过g_ncontrol直接调用到该方法的话 ...