线程池线程数与(CPU密集型任务和I/O密集型任务)的关系

Posted 梦想空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池线程数与(CPU密集型任务和I/O密集型任务)的关系相关的知识,希望对你有一定的参考价值。

近期看了一些JVM和并发编程的专栏,结合自身理解,来做一个关于(线程池线程数与(CPU密集型任务和I/O密集型任务)的关系)的总结:

1.任务类型举例:

        1.1: CPU密集型:

                例如,一般我们系统的静态资源,比如js,css等,会存在一个版本号,如 main.js?v0,每当用户访问这个资源的时候,会发送一个比对请求到服务端,比对本地静态文件版本和服务端的文件版本是否一致,不一致则更新.这种任务一般不占用大量IO,所以后台服务器可以快速处理,压力落在CPU上.

        1.2: I/O密集型:

                比方说近期我们做的万科CRM系统,常有大数据量的查询和批量插入操作,此时的压力主要在I/O上.

2.线程数与任务类型的关系:

        2.1:与CPU密集型的关系:

                一般情况下,CPU核心数 == 最大同时执行线程数.在这种情况下(设CPU核心数为n),大量客户端会发送请求到服务器,但是服务器最多只能同时执行n个线程.

                设线程池工作队列长度为m,且m>>n,则此时会导致CPU频繁切换线程来执行(如果CPU使用的是FCFS,则不会频繁切换,如使用的是其他CPU调度算法,如时间片轮转法,最短时间优先,则可能会导致频繁的线程切换).

                所以这种情况下,无需设置过大的线程池工作队列,(工作队列长度 = CPU核心数 || CPU核心数+1) 即可.

        2.2:与I/O密集型的关系:

                1个线程对应1个方法栈,线程的生命周期与方法栈相同.

比如某个线程的方法栈对应的入站顺序为:controller()->service()->DAO(),由于DAO长时间的I/O操作,导致该线程一直处于工作队列,但它又不占用CPU,则此时有1个CPU是处于空闲状态的.

                所以,这种情况下,应该加大线程池工作队列的长度(如果CPU调度算法使用的是FCFS,则无法切换),尽量不让CPU空闲下来,提高CPU利用率.

 

若理解有误,请指正.技术分享图片

以上是关于线程池线程数与(CPU密集型任务和I/O密集型任务)的关系的主要内容,如果未能解决你的问题,请参考以下文章

场景应用:线程池的队列大小你通常怎么设置?

java中高并发和高响应解决方法

设置线程池大小 · 贰白

线程池大小选择:针对 I/O 密集型场景和 CPU 密集型场景

如何理解CPU密集型 和 I/O密集型

如何理解CPU密集型 和 I/O密集型