对于多线程的使用,首先要考虑两个问题,为什么要使用多线程,多线程的应用场景是什么
使用多线程,目标是大家总所周知且很明确的,为了提高线程的性能,为了更快
如何去度量性能,主要可以考虑为降低延迟,提高吞吐量,这就是多线程的主要目标
延迟:简易来说就是发出了请求后多久能收到响应,延迟越短,性能越好
吞吐量:单位时间能处理的请求数量,吞吐量越大,说明处理性能好
但是 往往吞吐量的增大会带来延迟的增高
那么我们的主要目的就是在降低延迟,增大吞吐量的时候 做到一个最均衡的调配
为了满足这两个要求的均衡,主要的思路有,优化算法和压榨硬件性能.
我们这次的主要观察对象,就是在于压榨硬件的性能问题
对于常见的和程序交互的硬件,就是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耗时)]