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就是一个连续的字节数组,读写必经之地。
个人理解总结、不足之处欢迎提出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KISSING_MONSTER

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值