本节说到的半同步与半异步跟同步和异步并不是一个概念, 请不要混淆了. 也为了避免混淆, 下面也会对同步和异步做一个简要的说明.
同步/异步
同步和异步是属于IO模型中, 前面已经对IO模型有过接触了( 如 非阻塞IO[1]).
- 同步 : 内核通知进程有数据到来, 进程从内核空间中将数据复制到应用空间中.
- 异步 : 内核将数据复制到指定的空间中后通知进程, 进程只管处理数据. 异步不会阻塞.
以上同步和异步简单描述起来可能还是有人不太明了两者的区别. 一句话 : 同步需要进程自己复制数据, 而异步是内核复制好数据之后通知进程(不需要复制).
我们前面所有的IO模型都是同步的.
半同步/半异步
同时使用同步线程和异步线程来实现一个程序, 即半同步/半异步模式.
实现半同步/半异步有三个模块 : 异步处理模块(异步线程), 同步处理模块(同步线程)和队列模块
- 同步线程 : 处理客户逻辑 (工作线程处理事件).
- 异步线程 : 处理IO事件.
- 请求队列 : 保存正在等待被处理的就绪事件队列.
同步线程与异步线程之间的关联 : 异步线程监听到客户请求后, 就将其封装成请求对象插入到就绪队列中. 而请求队列将会通知某个工作在同步模式的工作线程来处理请求. 通知方式取决于实现.
关于半同步/半异步模式也有很多实现方