2018/12/10 什么是NIO

早上占坑


BIO:一个线程接受一个请求,然后一直接待到处理完这个请求后再接待下一个请求。

普通的设计模式就是这种BIO模式,它的问题在于一个线程接待请求的全部处理过程,这样请求中有需要等待的操作后,它会闲下来等待,这样让线程闲下来是一个资源浪费。可以通过过程优化提高吞吐量。

NIO:将任务拆分为多个步骤,即将耗时处理的步骤和非耗时的任务分开,然后处理时每个线程不再负责接待请求的全部处理周期,而是只负责一个部分,这样负责非耗时处理的线程可以处理最大量的请求交给下一步的耗时线程,耗时线程又一直在处理耗时操作,这样就没有线程处于等待状态,也就没有资源的浪费,提高了吞吐量。核心,每个线程只负责处理单独的一部分任务,相当于将业务请求操作拆分后在流水线上处理。

NIO一般用非阻塞式IO来概括。它的核心是请求处理拆分,多个线程流水线处理。

 

异步:使用异步调用,可以大大地节省资源,因为异步调用后,线程不用等待耗时方法执行完毕,可以直接释放占用的cpu资源,等耗时方法执行完毕后回调的方式执行后续处理,这样不会让线程闲起来。

所以NIO+异步是提高吞吐量的利器。

 

示例:

服务器端有一个需要进行磁盘操作,然后数据处理,然后数据库操作的复杂业务接口。(或者需要反复进行数据库操作的业务接口,这种场景很常见)

当调用该接口时,如果一个线程负责一个请求,因为负责接收请求的线程数量是有限的,所以其它的请求只能排队等待处理完毕,而一个线程在处理这个请求中会有很多等待的过程,这个对线程处理能力是个浪费。并且如果前面流程处理的任务很慢,对后面流程中的处理潜力也是浪费。

如果将请求处理拆分,分别由不同的线程完成不同的部分操作,这样,每个部分都可以以最大的处理能力,一刻不歇地接待处理请求,这样吞吐量就更大了。

 

异步提高吞吐量的原理,

因为异步一般是对耗时操作进行异步,主要是文件处理、数据库处理等,我们知道多线程的核心就是将CPU时间分为时间片来提高利用率,而其实这些文件处理、数据库处理会有自己的硬件处理,不需要CPU的干预,所以这时候释放时间片,不再占用时间片既不会影响这些任务的执行,又会节省出原本等待它执行完毕的时间片,所以提高了吞吐量。核心,这些耗时操作本身不需要CPU时间片就可以独立完成处理(对数据库来说不需要本地的CPU时间片资源)。

上一步的举例,如果遇到一个IO处理,那么如果用BIO方式,接待线程会一直等内存和磁盘交换完数据,然后继续后面的处理,它等待这个时间就被浪费了,如果这个线程只负责接待IO请求,将所有的IO请求异步调用,IO处理完成后回调交给下一步处理的线程,这样明显这个线程可以不停地接待和处理IO请求,比起等待的同步调用,吞吐量大大提高了。

 

注意:

尽管NIO+异步能提高系统吞吐量,但其并不能让一个请求的等待时间下降,相反可能会增加等待时间。

注意:此处与多线程的作用相同,多线程并不能让一个请求的等待时间下降,相反可能会增加等待时间,但多线程能大大提高吞吐量。大大提高吞吐量,大大提高吞吐量,大大提高吞吐量,重要的事情说三遍。

(一直描述为多线程可以提高效率,其实不太直观,此处看到吞吐量三个字醍醐灌顶,豁然开朗,字字珠玑。。。)

 

 

 

 

 

 

 

 

 

 

 

明天servlet

posted @ 2018-12-10 09:08  BaizLi  阅读(266)  评论(0编辑  收藏  举报