netty

初识NIO-什么是NIO模型

2020-04-23  本文已影响0人  马路边的小破孩

什么是NIO?

       NIO 全称 Non-blocking IO(也叫new io,即同步非阻塞io),它是是JDK 1.4 及以上版本里提供的一种新处理io的api,它的出现是为了可以提供非阻塞式的高伸缩性网络。

       IO模型除了NIO呢,还有传统的BIO模型和最新的AIO模型,BIO全称blocking io(即同步非阻塞io),它在我们日常的编程中应用最广泛,也是最简单的;AIO模型全称 Asynchronous I/O(即异步非阻塞IO),JDK7及之后的版本开始支持,异步 IO 操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

为什么需要NIO?

传统阻塞式的系统使用的是一个请求一个线程处理请求,一旦有高并发请求,便成为系统的瓶颈,会有如下问题:

1.线程不够用,一旦有大量的连接,线程池也不够用。

2.耗费资源,线程作为系统的宝贵资源,操作系统需要在它们之间切换,时间开销大。·更多的线程需要更多的内存空间。

3.阻塞I/O模式下,会有大量的线程被阻塞,一直在等待数据,这个时候的线程被挂起,只能干等,CPU利用率很低,换句话说,系统的吞吐量差。

HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

传统的阻塞IO的示意图如下:

传统的阻塞IO的示意图

NIO模型示意图如下:

NIO模型示意图

java IO中各种流都是阻塞的,当客户端发起请求时,服务端会分配一个线程进行处理,这就意味着当一个线程进行接收读或者写流处理时,如果没有事件发生,则该线程会一直被阻塞,再次期间不能做任何事情。举个例子,就像是客户在餐厅点餐时,由一名服务员进行服务,则客户在点餐期间,服务员需要一直等待,不能干任何事情直到客户点餐完毕;如果餐厅客户突然暴增,则餐厅的服务员人数不够无法提供服务。

java NIO非阻塞模式,是基于事件驱动的。当客户端发起请求后,服务端并不会分配一个线程,而是交由一个专门的线程接收请求(Selector)读取流,读取完毕后再交由专门的业务线程进行处理。还是点餐的例子,在客户点餐期间,服务员也没事干,当服务员收到另外一个客户端点餐完毕的请求后,他可以去处理点餐完毕的客户请求,而无需等待处于点餐客户的等待中;当餐厅客户突然暴增时,他们能更大程度的服务更多的客户。NIO之所以是同步非阻塞,就是因为底层操作系统支持同步非阻塞,JVM只是通过系统调用本地方法实现同步非阻塞的(本质上是操作系统实现同步非阻塞,而JVM只是通过本地方法执行系统调用而已)。linux系统提供了epoll系统调用,epoll是基于事件驱动方式来实现的(也就是说,底层操作系统准备好了数据,以事件驱动的机制回调通知),而NIO中的Selector的select()方法调用,是通过本地方调用epoll系统调用来实现非阻塞的,最大限度利CPU时间片,所以IO线程的瓶颈也就是硬件瓶颈。

上一篇下一篇

猜你喜欢

热点阅读