java IO模型(BIO、NIO、AIO)

BIO

  • 传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。典型的阻塞IO模型的例子为:data = socket.read();如果数据没有就绪,就会一直阻塞在read方法。

NIO

  • Java NIO实际上就是多路复用IO。在多路复用IO 模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真 正调用实际的IO读写操作
  • 因为在多路复用IO模型中,只需要使用一个线程就可以管理多个 socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有在真正有 socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。
  • 在Java NIO中,是通 过selector.select()去查询每个通道是否有到达事件,如果没有事件,则一直阻塞在那里,因此这 种方式会导致用户线程的阻塞。
  • 一旦事件响应体很大,那么就会导致后续的事件 迟迟得不到处理,并且会影响新的事件轮询。
    在这里插入图片描述

AIO

  • 在异步IO模型中,当用户线程发起read操作之后,立刻就 可以开始去做其它的事。而另一方面,从内核的角度,当它受到一个asynchronous read之后, 它会立刻返回,说明read请求已经成功发起了,因此不会对用户线程产生任何block
  • 只需要先发起一个请求,当接收内核返回的成功信号时表示IO操作已经完成,可以直接 去使用数据了。
  • 说在异步IO模型中,IO操作的两个阶段都不会阻塞用户线程,这两个阶段都是由内核自动完成,然后发送一个信号告知用户线程操作已完成,收到信号 表示IO操作已经完成,不需要再在用户线程中调用IO函数进行实际的读写操作。
发布了20 篇原创文章 · 获赞 0 · 访问量 256

猜你喜欢

转载自blog.csdn.net/white_zzZ/article/details/103941538