java与网络io模型总结

根据《unix网络编程·卷一》所载,目前操作系统的网络io模型分为5中,分别为

  • blocking io :阻塞型io,再熟悉不过,处理accept、read、write都会阻塞用户进程,对应java中的bio
  • non blocking io:简称非阻塞,当通过系统调用的时候,如果没有连接或者数据到达就直接返回一个错误,用户进程不阻塞但是不断的轮询。注意这个不是java nio框架中对应的网络模型
  • io multiplexing:io多路复用才是nio对应的网络io模型。该模型对于用户进程也是阻塞的,优点是可以同时支持多个connetciotn。前三种都属于同步模式,既然都是同步的,如果要做到看似非阻塞,那么就需要轮询机制。相对于上一种模型,这种只是将轮询从用户进程转移到了操作系统内核,通过调用select函数,不断轮询多个connection是否ready,如果有一种ready好的,就通过事件通知用户进程,用户进程再通过事件来处理。所以在java的nio中会看到一大堆事件处理。这种模型的阻塞不是在socket层面的阻塞,而是在调动select函数的阻塞。而且相对于blocking io,还多了一次select的系统调用,其实性能会更低,所以在低吞吐量下,这种io不见得比bio+线程池的模型优越。
  • sign driven:极少使用,不讲
  • async io :java7时候开始升级,也成为nio2。实现了异步的io。前三种都是通过用户进程在主动获取(bio的阻塞,nbio的轮询和iomult的按事件获取),而aio交互很简单,用户进程调用后立即返回,用户进程不阻塞,内核当完成网络io和数据复制后,主动通知用户进程。前面说到的系统内核做的操作,除了等待网络io就绪数据到达内核,还有从系统内核复制用户空间去的过程,异步io这两者对于用户进程而言都是非阻塞的,而前三种,在数据从内核复制到用户空间这个过程,都是阻塞的。

详细内容的学习,可以参考这篇博文

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值