对于网络IO的模型中的IO多路复用编程一般用于编写demo调试程序,再工业级生产产品中针对多路复select,poll,select的基础上做一层封装,在学术上有专业的名字Reactor和Proactor,Reactor应用于Linux服务器下的同步IO,Proactor应用于windows服务器的异步IO。
1 Reactor模型
普通函数调用流程如下:
程序调用函数---->函数执行----》程序等待—》结果和控制权返回----》程序继续
1.1 定义
reactor模型是一种事件驱动机制:
程序不主动调用某个api处理,而是相应的事件发生,reactor主动调用应用程序注册的接口进行处理。
1.2 思想
将所有要处理的IO事件注册到一个IO多路复用器上,同时主线程/进程在多路复用器上。一但有IO事件到来或者准备就绪,多路复用器返回并调用相应的事件处理函数。
1.3 三种reactor模型
a)单Reactor单线程模型
三个重要组件:
多路复用器(Reactor):负责监听注册进来的IO事件
事件分离器:将多路复用器中返回的就绪事件分到对应的处理函数中(dispatch)
事件处理器:负责处理特定事件的处理函数(对应图中read,decode,compute,encode,send等)
该模型中,reactor线程既要负责监听新连接的到来,又要dispatch请求到handler中。
消息处理流程如下:
1 reactor通过epoll监听连接事件,收到事件后通过dispatch转发
2 如果是连接建立事件,则有acceptor接收连接,并创建handler处理后续事件
3 如果不是建立连接事件,reactor会分发调用handler来响应
4 handler完成read—》业务处理—》send的完整业务流程。
简化版本的代码:
// reactor初始化 创建多路复用器
int reactor_init(struct reactor *r) {
r->epfd = epoll_create</