阻塞IO和非阻塞IO

一、阻塞IO

因为阻塞IO的存在,导致只能使用一个线程进行等待,等待的线程也会引起额外的资源消耗,引起CPU调度问题。如果数量达到百万级,需要发送的数量非常多,此时,大量的时间被用在了线程切换上,我们需要做的是尽量减少CPU处理线程消耗的时间,用来处理真正需要处理的数据。

当有客户端到达的时候,服务器会进行接收后的处理流程。accept会由阻塞状态变为非阻塞执行状态,会开启两个线程处理获取到的socket的inputstream和outputstream。如果不是即时写数据的话,只是需要开一个线程读取数据。输出可以通过线程池处理。所以,如果有1000个客户端连接,至少需要1000+个线程。如果读、写均开线程,那么需要2000+个线程,线程大部分在read()或write()处处于阻塞状态,此时线程没有处理任何内容,只是等待CPU的调度,此时需要消耗CPU线程切换时间。当线程读取到信息或者需要写入信息时,线程从阻塞状态切换到运行状态,CPU需要从用户状态切换到内核状态,此时需要消耗大量的时间。在1.4之前,一个线程大概占用1M的内存,虽然java8或java9一个线程的消耗只有几百K,但是当达到上万级别的时候,也是比较大的内存消耗。

 

二、非阻塞IO线程的优势

当客户端进行连接后,先注册连接,然后回调相应的方法。

此时,线程只有一个,只有主线程,此时主线程实际上是串行的处理模式,串行地进行客户端的连接监听、串行地进行数据的读取、输出事件。此时,一个线程处理所有客户端的所有事件,该线程一直处于繁忙状态,利用率比较高,此时可以说线程的性能比较高(不是指传输速度)。但不是充分利用了整个服务器的性能,服务器肯定不止一个cpu,一个线程肯定是弱化了它的能力。

如果对这些事件进行分组,通过线程池进行处理,从而满足计算机性能的调度。

 

三、NIO

NIO全称:Non-blocking I/O

JDK 1.4引入全新的输入输出标准库NIO,也叫New I/O

在标准的Java代码中提供了高速的、可伸缩的、面向块的、非阻塞IO操作

发布了174 篇原创文章 · 获赞 106 · 访问量 79万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览