BIO、NIO、AIO的概念及区别

  • BIO(同步阻塞IO,1.4以前版本的唯一选择):

同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务端就需要启动一个线程进行处理。

  • NIO(同步非阻塞IO,异步阻塞IO,1.4版本开始支持):

同步非阻塞IO:

同步并阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会发送到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的轮询IO操作是否就绪,这就要求用户进程不停的去轮询

异步阻塞IO:

此种方式是指用户发一起一个IO操作以后,不等待内核IO的操作完成,等内核IO操作完成以后会通知应用程序。这其实就是同步与异步最关键的区别,同步必须等待或者主动去轮询IO操作是否完成,那为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统并发性。

  • AIO(异步非阻塞IO,7开始支持):

在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等待IO操作完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。

  • reactor模式:
  1. 注册(读、写)就绪事件和相关联的处理器
  2. 事件分隔器等待事件发生
  3. 发生(读、写)就绪事件时,调用第一步注册的事件处理器
  4. 事件处理器作相应处理(读、写或后续处理)
  • proactor模式:
  1. 应用程序初始化一个异步读、写操作,然后注册相应的事件处理器,此时事件处理器不关注读、写就绪事件,而是关注读、写完成事件,这是区别于reactor的关键。
  2. 事件分离器等待读、写操作完成事件
  3. 在事件分离器等告待读、写操作完成的时候,操作系统调用内核线程完成读写操作(异步IO都是操作系统负责将数据读写应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),应用程序需要传递缓冲区,这也是区别于reactor的一点。
  4. 事件分离器捕获到读、写完成事件以后,激活应用程序注册的事件处理器,事件处理器直接从缓冲区读写数据,不需要进行实际的读、写操作。
扫描二维码关注公众号,回复: 788068 查看本文章

从上面可以看出,reactor和proactor模式的主要区别就是真正的读、写操作是由谁来完成的,reactor中需要应用程序自己读、写数据,而proactor模式中,应用程序不需要进行实际的读、写过程,它只需要从缓存区读取或者写入数据即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备。NIO通常采用reactor模式,而AIO通常采用proactor模式。

综上所述,同步和异步是相对于应用和内核的交互而言的,同步需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅系统调用系统函数的实现方式而已。

参考资料:

http://blog.csdn.net/liuj2511981/article/details/8658440

猜你喜欢

转载自xiep0110.iteye.com/blog/2232276
今日推荐