线程粒度因子与锁粒度因子
在一个有锁保护操作的程序中,每个线程内的计算可以分为如下图所示的几部分:
(点击查看大图)图1.6.1:线程内的计算分类 |
其中
ts - 表示锁内计算时间,大小由共享资源的操作时间决定,与共享资源类型有关,并且与程序员的程序设计有关。
tl - 表示 Lock操作和Unlock操作耗费的时间,如果CPU核的速度固定,那么它为一常量。
tp - 表示锁外可并行计算部分耗费的时间,大小与具体的应用类型及程序员的分解有关
为了形象地表示出各段计算间的比例关系,引入两个概念:线程粒度因子和锁粒度因子。
1. 线程粒度因子
线程粒度因子主要是用来反映一个线程的计算量大小,由 是常量,因此把线程内的有效计算和 的比值叫做线程粒度因子,记为:
线程粒度因子的大小与线程内有效计算量 有关,有效计算量越大,那么线程粒度因子就越大,因此线程粒度因子与具体的应用类型和程序员的线程分解方式有关。如果对固定的计算量,分解的线程数量愈多,那么线程粒度因子就愈小。要想使线程粒度因子取得较大的值,必须让线程的数量尽可能的少,当然最少不能小于CPU核数。
通常软件规模是随CPU核数增加而线性增加的,这也意味着对于给定的应用类型,线程粒度因子的最大值为一常量。
2. 锁粒度因子
锁粒度因子反映了一个线程内锁操作的粒度关系,用锁内计算和 的比值来表示锁粒度因子,记为:
将粒度非常小的锁叫做细粒度锁,细粒度锁是一个比较重要的概念,在以前的单核多线程编程中,采用细粒度锁可以取得很好的分时效果;在多核编程时,细粒度锁更重要了,它不仅可以取得分时效果,还可以使加速比性能得到大大提升,这一点在随后的锁竞争中的加速比分析中会给出详细描述。
锁粒度因子的大小取决于锁内计算的大小,因此要想使锁粒度变小就必须减少锁内计算量。锁内计算的大小是受共享资源的操作时间和锁内非共享资源操作时间决定的,因此可以从以下两个方面来减少锁粒度因子:
将非共享资源操作从锁内移到锁外
将大的共享资源操作设计成小的共享资源操作减少共享资源操作时间
共享资源的操作时间与共享资源类型有关。在固定的应用类型中,锁粒度因子的最小值可以看成是常数。