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这两者对于用户进程而言都是非阻塞的,而前三种,在数据从内核复制到用户空间这个过程,都是阻塞的。

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

你可能感兴趣的:(网络编程)