多线程的应用场景
要解决这个问题,首先要分析以下两个问题:
1 为什么要使用多线程?
使用多线程,本质上就是提升程序性能,最核心的就是降低延迟和提升吞吐量。
2 多线程的应用场景
在并发编程领域,提升性能本质上就是提升硬件的利用率,再具体点来说,就是提升 I/O 的利用率和 CPU 的利用率。
创建多少线程合适?
创建多少线程合适,要看多线程具体的应用场景。I/O 密集型程序和 CPU 密集型程序,计算最佳线程数的方法是不同的。
CPU 密集型计算
对于 CPU 密集型计算,多线程本质上是提升多核 CPU 的利用率,所以对于一个 4 核的 CPU,每个核一个线程,理论上创建 4 个线程就可以了,再多创建线程也只是增加线程切 换的成本。所以,对于 CPU 密集型的计算场景,理论上“线程的数量 =CPU * 核数”就是最合适的。不过在工程上,线程的数量一般会设置为“CPU 核数 +1”,这样的话,当线 程因为偶尔的内存页失效或其他原因导致阻塞时,这个额外的线程可以顶上,从而保证 CPU 的利用率。
CPU 密集型计算
最佳线程数 =CPU 核数 * [ 1 +(I/O 耗时 / CPU 耗时)]
对于 I/O 密集型计算场景,I/O 耗时和 CPU 耗时的比值是一个关键参数,不幸的是这个参数是未知的,而且是动态变化的,所以工程上,我们要估算这个参数,然后做各种不同场景 下的压测来验证我们的估计。不过工程上,原则还是将硬件的性能发挥到极致,所以压测时,我们需要重点关注 CPU、I/O 设备的利用率和性能指标(响应时间、吞吐量)之间的 关系。
网友评论