靠谱 的软件外包伙伴

您的位置:首页 > 新闻动态 > 软件开发网络IO的两种设计模式

软件开发网络IO的两种设计模式

2016-03-16 09:55:01

网络IO设计的Reactor和Proactor模式

在高性能IO设计中,有两种设计模式:Reactor和Proactor模式,其中Reactor模式用于同步IO,Proactor模式用于异步IO。

同步异步是针对应用程序和内核的交互而言的。同步是指用户进程触发IO操作并等待或轮询检查IO操作是否就绪,接着阻塞的完成IO操作;异步是指用户进程触发IO操作之后就做其它的事情,当IO操作完成之后会得到通知(如读取网络数据,此时数据已经由内核拷贝到用户缓冲区,用户进程可以直接使用)。

阻塞非阻塞是针对用户进程在触发IO操作之后根据IO操作就绪状态来采取的不同方式,阻塞是当IO操作尚未就绪,系统调用会一直阻塞至IO操作就绪,而采用非阻塞此时系统调用立即返回一个IO状态。阻塞非阻塞是在同步范畴下才有的概念,异步情况下是不区分阻塞非阻塞。

Reactor模式工作过程

Reactor模式用于同步IO,以读操作为例,其工作过程如下:

  1. 应用程序注册读就绪事件以及相关联的事件处理器(即回调函数)

  2. 事件分离器(多路IO复用)等待读就绪事件发生

  3. 发生读就绪事件,调用第一步注册的回调函数执行

  4. 回调函数先执行读操作,将数据从内核复制到用户缓冲区,然后再根据数据内容作下一步处理

Proactor模式工作过程

Rroactor模式用于异步IO,以读操作为例,其工作过程如下:

  1. 应用程序初始化异步读取操作,以及注册相应的事件处理器,此时事件处理器关心的是IO读取完成事件,而不是读取就绪事件

  2. 事件分离器(多路IO复用)等待读操作完成事件

  3. 事件分离器等待读操作完成时候,操作系统调用内核线程完成读取操作,即将读取内容从内核拷贝到用户缓冲区中,此缓冲区由应用程序传递。

  4. 事件分离器捕获读事件完成,激活注册的事件处理器,事件处理器直接从缓冲区中读取数据进行下一步的处理

总结

Reactor和Proactor都是基于事件驱动的,事件触发时执行相应的回调函数,所不同的是两者执行回调函数前IO状态不一致,Reactor是就绪状态,需要应用程序去完成IO操作,而Proactor此时已经处于IO完成状态,可以直接进行下一步操作。

目前只有windows中有真正的异步IO–IOCP,使用了Proactor模式,Unix/Linux下并没有实现异步IO,使用的还是Reactor模式

 

关于:中科研拓

深圳市中科研拓科技有限公司专注提供软件外包、app开发、智能硬件开发、O2O电商平台、手机应用程序、大数据系统、物联网项目等开发外包服务,十年研发经验,上百成功案例,中科院软件外包合作企业。通过IT技术实现创造客户和社会的价值,致力于为用户提供最佳的软件解决方案。联系电话400-0316-532,邮箱sales@zhongkerd.com,网址www.zhongkerd.com


  上一篇   [返回首页] [打印] [返回上页]   下一篇