Solaris 动态跟踪指南

旋转锁定探测器

在内核的某些上下文(如高级中断上下文和任何处理分发程序状态的上下文)中不能阻塞线程。在这些上下文中,此限制会禁止使用自适应锁定。在这些上下文中将改用旋转锁定来影响临界段的互斥。顾名思义,在存在争用的情况下,这些锁定的行为是旋转,直到拥有线程释放锁定。表 18–2 中介绍了与旋转锁定有关的三种探测器。

表 18–2 旋转锁定探测器

spin-acquire

获取旋转锁定之后将立即触发的暂挂事件探测器。 

spin-spin

在暂挂的旋转锁定上旋转的线程成功获取旋转锁定后将触发的争用事件探测器。如果两种探测器都已启用,则 spin-spin 将在 spin-acquire 之前触发。spin-spinarg1 包含旋转时间:获取锁定之前,在旋转状态中花费的时间(以纳秒为单位)。独立的旋转计数本身没有什么意义,但可用于比较旋转次数。

spin-release

释放旋转锁定之后将立即触发的暂挂事件探测器。 

自适应锁定比旋转锁定更常见。以下脚本显示了两种锁定类型的总计,以提供支持此观察的数据。

lockstat:::adaptive-acquire
/execname == "date"/
{
	@locks["adaptive"] = count();
}

lockstat:::spin-acquire
/execname == "date"/
{
	@locks["spin"] = count();
}

在一个窗口中运行此脚本,在另一个窗口中运行 date(1) 命令。终止 DTrace 脚本时,将会看到与以下示例类似的输出:


# dtrace -s ./whatlock.d
dtrace: script './whatlock.d' matched 5 probes 
^C
spin                                                             26
adaptive                                                       2981

如此输出所指示的那样,在运行 date 命令时获取的锁定,超过 99% 都为自适应锁定。令人吃惊的是,在执行像 date 这样简单的操作时获取了如此多的锁定。大量的锁定是具有极大可伸缩性的系统(如 Solaris 内核)所需的细分锁定的自然产物。