NIO,BIO和AIO的区别

Reactor模型:

  1. 应用程序在事件分离器注册 读就绪事件和读就绪事件处理器
  2. 事件分离器等待就绪事件发生
  3. 读就绪事件发生,激活事件分离器,分离器调用 读就绪事件处理器(既:可以进行操作了,开始读)
  4. 读就绪事件处理器开始进行读操作,把读到的数据提供给程序使用

Proactor模型:

  1. 应用程序在事件分离器注册 读完成事件和读完成事件处理器,并向操作系统发出异步读请求
  2. 事件分离器等待操作系统完成读取
  3. 在分离器等待的过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定的缓冲区,最后通知事件分离器读操作完成
  4. 事件分离器监听到读完成事件后,激活读完成事件的处理器
  5. 读完成事件处理器 处理用户自定义缓冲区的中的数据给应用程序使用

同步和异步的区别:

        就是读操作由谁完成,同步Reactor是指程序发出读操作后,由分离器监听到可以进行读操作时通知事件处理器进行读操作,异步的Proactor是指程序发出读请求后,操作系统立刻异步的进行读操作, 读完之后在通知分离器,分离器激活处理器直接直接取用已读到的数据。

一:同步阻塞IO(BIO)

    我们熟知的Socket编程就是BIO,一个Socket连接一个处理线程(这个线程负责这个socket连接的一系列数据传输)。阻塞的原因在于:操作系统的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。

三:同步非阻塞IO(NIO)

         New IO是对BIO的改进,基于Reactor模型。我们知道,一个socket连接只有在特点时候才会发生数据传输IO操作,大部分时间这个“数据通道”是空闲的,但还是占用着线程。NIO作出的改进就是“一个请求一个线程”,在连接到服务端的众多socket中,只有需要进行IO操作的才能获取服务端的处理线程进行IO。这样就不会因为线程不够用而限制了socket的接入。客户端的socket连接到服务端时,就会在事件分离器注册一个 IO请求事件 和 IO 事件处理器。在该连接发生IO请求时,IO事件处理器就会启动一个线程来处理这个IO请求,不断尝试获取系统的IO的使用权限,一旦成功(即:可以进行IO),则通知这个socket进行IO数据传输。

   NIO还提供了两个新概念:Buffer和Channel

Buffer:
–        是一块连续的内存块。
–        是 NIO 数据读或写的中转地。
Channel:
–        数据的源头或者数据的目的地
–        用于向 buffer 提供数据或者读取 buffer 数据 ,buffer 对象的唯一接口。
–         异步 I/O 支持
      Buffer作为IO流中数据的缓冲区,而Channel则作为socket的IO流与Buffer的传输通道。客户端socket与服务端socket之间的IO传输不直接把数据交给CPU使用,
而是先经过Channel通道把数据保存到Buffer,然后CPU直接从Buffer区读写数据,一次可以读写更多的内容。
      使用Buffer提高IO效率的原因(这里与IO流里面的BufferedXXStream、BufferedReader、BufferedWriter提高性能的原理一样):IO的耗时主要花在数据传输的路上,普通的IO是一个字节一个字节地传输,
而采用了Buffer的话,通过Buffer封装的方法(比如一次读一行,则以行为单位传输而不是一个字节一次进行传输)就可以实现“一大块字节”的传输。比如:IO就是送快递,普通IO是一个快递跑一趟,采用了Buffer的IO就是一车跑一趟。很明显,buffer效率更高,花在传输路上
的时间大大缩短。

  四:异步阻塞IO(AIO)

           NIO是同步的IO,是因为程序需要IO操作时,必须获得了IO权限后亲自进行IO操作才能进行下一步操作,AIO是对NIO的改进(所以又叫NIO.2),它是基于Proactor模型的。每个Socket连接在事件分离器注册IO完成事件和IO完成事件处理器。程序 需要进行IO时,向分离器发出IO请求并把所用的Buffer区域告知分离器,分离器通知操作系统进行IO操作,操系统自己不断尝试获取IO权限并进行IO操作(数据保存在Buffe区),操作完成后通知分离器;分离器检测到IO完成事件,则激活IO完成事件处理器,处理器会通知程序说“IO完成”,程序 知道后直接从Buffer区进行数据的读写。

       也就是说:AIO是发出IO请求后,由操作系统自己去获取IO权限并进行IO操作;NIO则是发出IO请求后,由线程不断尝试获取IO权限,获取到后通知应用程序自己进行IO操作。

猜你喜欢

转载自blog.csdn.net/w893433055/article/details/86095658
今日推荐