java,IO相关

201 阅读2分钟

image.png 一次IO的读写流程为客户端通过网络到达内核缓冲区再到用户缓冲区

同步阻塞IO

image.png 从发起调用,但数据返回的整个过程,用户线程一直处于阻塞状态

  • 优点:程序简单,在阻塞等待数据期间,用户线程挂起。用户线程基本不会占用 CPU 资源
  • 缺点:高并发环境下,内存、线程的切换会耗费大量资源

同步非阻塞IO

image.png

数据为就绪时候,反复调用read,返回fail信息,知道数据就绪,开始拷贝,这个过程处于阻塞。

  • 优点:在等待数据的时候可以返回,不会发生阻塞,实时性高。
  • 缺点:多次的io调用,会占用CPU资源,系统资源利用率低

IO多路复用

image.png

发起select,询问是否准备就绪,就绪之后发起read调用。

  • 优点:系统不必创建线程,也不必维护这些线程,从而大大减小了系统的开销。
  • 缺点:select/epoll系统调用,属于同步IO,也是阻塞IO。都需要在读写事件就绪后,自己负责进行读写,也就是说这个读写过程是阻塞的。

目前支持 IO 多路复用的系统调用,有 select,epoll 等等。select 系统调用,是目前几乎在所有的操作系统上都有支持

select 调用 :内核提供的系统调用,它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。

epoll 调用 :linux 2.6 内核,属于 select 调用的增强版本,优化了 IO 的执行效率。

异步IO

image.png

异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

  • 优点:非阻塞,
  • 缺点:不完善,

image.png