对于多线程的使用,首先要考虑两个问题,为什么要使用多线程,多线程的应用场景是什么

使用多线程,目标是大家总所周知且很明确的,为了提高线程的性能,为了更快

如何去度量性能,主要可以考虑为降低延迟,提高吞吐量,这就是多线程的主要目标

延迟:简易来说就是发出了请求后多久能收到响应,延迟越短,性能越好

吞吐量:单位时间能处理的请求数量,吞吐量越大,说明处理性能好

但是 往往吞吐量的增大会带来延迟的增高

那么我们的主要目的就是在降低延迟,增大吞吐量的时候 做到一个最均衡的调配

为了满足这两个要求的均衡,主要的思路有,优化算法和压榨硬件性能.

我们这次的主要观察对象,就是在于压榨硬件的性能问题

对于常见的和程序交互的硬件,就是IO和CPU设备

为此,我们要尽可能的压榨IO设备和CPU设备的利用率

而在此处的利用率则表示的是CPU+IO的综合利用率,其方案为,多线程情况下,尽可能的在保证减少线程切换的情况,增大CPU和IO设备的使用率

就是假设一个单线程的情况,程序对于设备的使用率必然不能到达100%

图片

只会向上图所示,在IO和CPU之间切换

但是如果有了两个线程,让A线程使用IO,B使用CPU,两者交替使用,则可以做到100%的利用率

图片

所以在低使用率的时候,应该考虑增加线程来提高吞吐量

在多核时代,考虑到IO和CPU交替执行的程序,就需要多线程来提高响应速度了

而且对于纯粹的计算也可以考虑多核来降低响应时间

那么第二个问题,创建多少线程合适

这就需要考虑Cpu和IO的关系了

分别考虑CPU密集型的计算和IO密集型的计算

对于CPU密集型的计算,就是提高CPU的利用率,对于4核的CPU,那么可以考虑为为创建4个线程,因为再多的线程也是加大了线程切换的成本,但是实际上最好设置为了CPU核数+1,这样的话,在某个线程失效了,后补线程也能顶上去

对于IO密集型的计算,主要是在IO中,但同时还是要考虑到CPU的操作,如果CPU/IO的操作的时间比为 1:2,那就使用3个线程

如果1:1,则使用2个线程

那么最佳的线程数就是 = 1 + (IO耗时/CPU耗时)

那么就是线程A执行IO操作,剩下的线程正好执行完CPU计算

对于多核的版本,则是

最佳线程数 = 核数 * [1+(IO耗时/CPU耗时)]

发表评论

邮箱地址不会被公开。 必填项已用*标注