线程池线程数与(CPU密集型任务和I/O密集型任务)的关系
来源:互联网 发布:jsp javabean MySQL 编辑:程序博客网 时间:2024/04/27 14:44
近期看了一些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密集型任务)的关系
- CPU密集型和I/O密集型区别
- I/O密集型和CPU密集型
- CPU密集型和I/O密集型
- 【并发编程】IO密集型和CPU密集型任务
- IO密集型线程 CPU密集型线程
- Java高并发编程——为IO密集型应用设计线程数与划分任务
- Java高并发编程——为IO密集型应用设计线程数与划分任务
- Java高并发编程——为IO密集型应用设计线程数与划分任务
- Java高并发编程——为IO密集型应用设计线程数与划分任务
- 线程与进程 计算密集型 IO密集型
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- 【Architecture】CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- myeclipse部署多个TOMCAT
- OS X_常用快捷键
- 大话设计模式策略模式_多种方法实现商场促销
- Spring多数据源的配置和使用
- java动态代理学习
- 线程池线程数与(CPU密集型任务和I/O密集型任务)的关系
- neuq oj 1049: 谭浩强C语言(第三版)习题6.5 C语言
- 用邻接表实现无向图
- 机器学习系列(6)_从白富美相亲看特征预处理与选择(下)
- oracle数据库中日期函数的用法
- 尝试向分析类转型1--scikit-learn(机器学习) 和 Weka(数据挖掘)
- 现实生活中的你
- 2015年Java工程师面试题总结
- 欢迎使用CSDN-markdown编辑器