基础概念
同步:synchronous ,两个或两个以上随时间变化的量在变化过程中保持一定的相对关系
异步:与同步相对,没有这样的相对关系
阻塞:指调用结果返回之前,当前线程会被挂起。
非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
对于IO同步,异步,阻塞,非阻塞的理解见博文http://blog.csdn.net/historyasamirror/article/details/5778378 (基于unix网络编程1为依据)
Reactor模式应用于同步I/O, Proactor则应用于异步I/O
Reactor具体步骤:
1)应用程序注册读就绪事件和相关联的事件处理器
2) 事件分离器等待事件的发生
3)当发生读就绪事件的时候,事件分离器调用第一步注册的事件处理器
4)事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理
5)写入操作类似于读取操作,只不过第一步注册的是写就绪事件。
Proactor具体步骤:1)应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。
2)事件分离器等待读取操作完成事件
3)在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作(异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。
4)事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。