JavaNIO模型

先简单总结一下IO模型:

1. 阻塞IO模型

工作流程:用户线程发出IO请求,cpu内核检查返回数据是否就绪,此时用户线程一直处于阻塞状态。数据就绪后,内核将数据复制到用户线程中,并返回结果。

2. 非阻塞IO模型

工作流程:用户线程发出IO请求,cpu内核检查返回数据是否就绪,并返回。这个时候用户线程是非阻塞的,但是会不断询问内核数据处理结果。

3. 多路复用IO模型

在多路复用I/O模型中,会有一个被称为Selector的线程不断轮询多个Socket的状态,只有socket有读写事件时,才会通知用户线程进行IO读写操作。
多路复用IO模型、阻塞IO和非阻塞IO的区别:

  1. 阻塞IO和非阻塞IO需要为每个socket都建立单独的内核线程去处理该socket的数据,而多路复用IO则只需要一个线程就可以管理多个socket,并且只有socket有真正的读写事件时才会操作系统的I/O资源,这样就大大节省系统资源。
  2. 非阻塞IO模型在每个用户线程中进行socket状态检查,而多路复用IO实在系统内核中进行socket状态检测。在请求量高时明显提示效率。
  3. 多路复用I/O模型在有读写事件到达时,逐个进行处理。所以当事件响应体较大时,selector线程就会成为性能瓶颈,因此在多路复用方法体内一般不做复杂逻辑处理,只做数据接收和转发,将具体逻辑处理转发给后续业务线程处理。

4. 信号驱动IO模型

工作流程:用户线程发出IO请求,系统会为该socket注册一个信号函数,用户线程不会阻塞,数据处理好后会给用户线程发送信号。用户线程收到信号后会在信号函数中完成实际的IO操作。

5. 异步IO模型

JAVA NIO

依靠三大组件:Selector、Channel和Buffer。
其中一个Selector可以管理多个channel的事件。
传统的IO操作基于数据流进行操作,而NIO基于Channel和buffer进行读写。
NIO和传统IO的区别:

  1. IO面向流、NIO面向缓冲区。因为缓冲区的存在,可以在缓冲区进行数据的前后移动,比如数据的拆包、封包。
  2. 阻塞和非阻塞的区别,我在多路复用IO模型中有提到,这里就不写了。
  3. 那channle和stream有什么区别?channle可以双向读写,而stream是单向。

buffer就是一个连续的字节数组,读写必经之地。
个人理解总结、不足之处欢迎提出。


版权声明:本文为woshizouqi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>