1、首先理解I/O密集和CPU密集
CPU密集型
CPU密集型,也叫计算密集型,一般是指服务器的硬盘、内存硬件性能相对CPU好很多,或者使用率低很多。系统运行CPU读写I/O(硬盘/内存)时可以在很短的时间内完成,几乎没有阻塞(等待I/O的实时间)时间,而CPU一直有大量运算要处理,因此CPU负载长期过高。
CPU密集几乎无I/O阻塞,CPU一直会全速运行。如果是单核情况下,开多线程是没有意义的,说白了就是一个CPU来回切着运行而已,徒增线程切换的资源消耗,卵用没有。可见,CPU密集任务只有在多核CPU上、开多线程才可能提速。
CPU使用率较高时,通常线程数只需要设置为CPU核心数的线程个数就可以了。单CPU对应单线程效率最高。
一般其计算公式可遵循:CPU密集型核心线程数 = CPU核数。
I/O密集型
I/O密集型相反,一般是指服务器CPU的性能相对硬盘、内存硬件好很多,或者使用率低很多。系统运行多是CPU在等I/O (硬盘/内存) 的读写操作,此类情景下CPU负载并不高。
I/O密集型的程序一般在达到性能极限时,CPU占用率仍然较低。这可能是因为任务本身需要大量I/O操作,而程序的逻辑做得并不好,没有充分利用CPU能力,导致线程空余时间很多。通常我们会开CPU核心数数倍的线程,在线程进行 I/O 操作 CPU 空闲时,启用其他线程继续使用 CPU,以提高 CPU 的使用率,充分利用CPU资源。
一般其计算公式可遵循:I/O密集型核心线程数 = CPU核数 / (1-阻塞系数)
阻塞系数在在0到1范围内。一般为0.8~0.9之间,也可以取0.8或者0.9。对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。
得出结论:
I/O密集型:当线程等待时间所占比例越高,需要越多线程,启用其他线程继续使用CPU,以此提高CPU的利用率; CPU密集型:当线程CPU时间所占比例越高,需要越少的线程。任务越多,花在进程、线程切换的时间就越多,通常线程数和CPU核数一致即可,这一类型在开发中主要出现在一些计算业务频繁的逻辑中。 I/O密集型任务的特点是CPU消耗很少,任务的大部分时间都在等待I/O操作完成(磁盘I/O远低于内存、CPU速度)。涉及到网络、磁盘I/O的任务多是I/O密集型任务。I/O密集型任务,线程数越多,CPU效率越高,但也有相对限度。
2、了解两种多线程任务
1):ForkJoinPool线程池最大的特点就是分叉(fork)合并(join),将一个大任务拆分成多个小任务,并行执行,再结合工作窃取模式(worksteal
)提高整体的执行效率,充分利用CPU资源,参考 parallelStream与CompletableFuture。
2):ThreadPoolExecutor中的线程无法选择优先执行子任务,要完成各自任务时,就需要创建多少个线程;参考多线程普通创建方法
标签:适配,任务,密集型,内存,服务器,线程,多线程,CPU From: https://www.cnblogs.com/innocenter/p/17116056.html