NIO和传统IO的区别.pdfVIP

  • 2
  • 0
  • 约1.09万字
  • 约 9页
  • 2017-06-07 发布于湖北
  • 举报
NIO 与传统 IO 的区别 感性认识: 传统的 socket IO 中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU 线程切换 的开销将非常巨大。使用 NIO ,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程 来为任意数量的连接服务。由于线程数量小于连接数量,所以每个线程进行 IO 操作时就不能阻塞,如果阻塞的话,有些连接 就得不到处理,NIO 提供了这种非阻塞的能力。 小量的线程如何同时为大量连接服务呢,答案就是就绪选择。这就好比到餐厅吃饭,每来一桌客人,都有一个服务员专门为 你服务,从你到餐厅到结帐走人,这样方式的好处是服务质量好,一对一的服务,VIP 啊,可是缺点也很明显,成本高,如 果餐厅生意好,同时来 100 桌客人,就需要 100 个服务员,那老板发工资的时候得心痛死了,这就是传统的一个连接一个线 程的方式。 老板是什么人啊,精着呢。这老板就得捉摸怎么能用 10 个服务员同时为 100 桌客人服务呢,老板就发现,服务员在为客人 服务的过程中并不是一直都忙着,客人点完菜,上完菜,吃着的这段时间,服务员就闲下来了,可是这个服务员还是被这桌 客人占用着,不能为别的客人服务,用华为领导的话说,就是工作不饱满。那怎么把这段闲着的时间利用起来呢。这餐厅老 板就想了一个办法,让一个服务员(前台)专门负责收集客人的需求,登记下来,比如有客人进来了、客人点菜了,客人要 结帐了,都先记录下来按顺序排好。每个服务员到这里领一个需求,比如点菜,就拿着菜单帮客人点菜去了。点好菜以后, 服务员马上回来,领取下一个需求,继续为别人客人服务去了。这种方式服务质量就不如一对一的服务了,当客人数据很多 的时候可能需要等待。但好处也很明显,由于在客人正吃饭着的时候服务员不用闲着了,服务员这个时间内可以为其他客人 服务了,原来 10 个服务员最多同时为 10 桌客人服务,现在可能为 50 桌,60 客人服务了。 这种服务方式跟传统的区别有两个: 1、增加了一个角色,要有一个专门负责收集客人需求的人。NIO 里对应的就是 Selector。 2、由阻塞服务方式改为非阻塞服务了,客人吃着的时候服务员不用一直侯在客人旁边了。传统的 IO 操作,比如 read() ,当 没有数据可读的时候,线程一直阻塞被占用,直到数据到来。NIO 中没有数据可读时,read()会立即返回 0 ,线程不会阻塞。 NIO 中,客户端创建一个连接后,先要将连接注册到 Selector ,相当于客人进入餐厅后,告诉前台你要用餐,前台会告诉你 你的桌号是几号,然后你就可能到那张桌子坐下了,SelectionKey 就是桌号。当某一桌需要服务时,前台就记录哪一桌需要 什么服务,比如 1 号桌要点菜,2 号桌要结帐,服务员从前台取一条记录,根据记录提供服务,完了再来取下一条。这样服 务的时间就被最有效的利用起来了。 具体分析: 一.Java NIO 和阻塞 I/O 的区别 1. 阻塞 I/O 通信模型 假如现在你对阻塞 I/O 已有了一定了解,我们知道阻塞 I/O 在调用 InputStream.read()方法时是阻塞的,它会一直等到数据 到来时(或超时)才会返回;同样,在调用 ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客 户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。阻塞 I/O 的通信模型示意图如下: 1 / 9 如果你细细分析,一定会发现阻塞 I/O 存在一些缺点。根据阻塞 I/O 通信模型,我总结了它的两点缺点: 1. 当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些 CPU 时间 2. 阻塞可能带来频繁的上下文切换,且大部分上下文切换可能是无意义的。 在这种情况下非阻塞式 I/O 就有了它的应用前景。 2. java NIO 原理及通信模型 Java NIO 是在jdk1.4 开始使用的,它既可以说成 “新 I/O” ,也可以说成非阻塞式I/O。下面是java NIO 的工作原理: 1. 由一个专门的线程来处理所有的 IO 事件,并负责分发。 2. 事件驱动机制:事件到的时候触发,而不是同步的去监视事件。 3. 线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。 阅读过一些资料之后,下面贴出我理解的java NIO 的工作原理图:

文档评论(0)

1亿VIP精品文档

相关文档