锁定策略如何影响等待时间

如果尚未收集 mttest 的性能数据,则您必须先进行收集,然后在性能分析器的两个单独实例中打开两个实验 mttest.1.ermttest.2.er。有关说明,请参见为 mttest 示例收集数据

本部分的示例显示数据的全局锁和局部锁对程序性能的影响。

  1. 在四 CPU 实验 mttest.1.er 的 [函数] 标签中找到 lock_local()lock_global()

    两个函数具有近似相同的相容用户 CPU 时间。这表明两个函数将完成等量工作。但是,lock_global() 具有较高的同步等待时间,而 lock_local() 则没有。

    两个函数的注释源代码显示了此情况的原因。

  2. 单击 lock_global(),然后单击 [源] 标签。

    lock_global() 使用全局锁保护所有数据。由于使用了全局锁,所有运行的线程都必须争相访问数据,而每次只有一个线程可访问这些数据。其余线程必须等待,直到工作线程释放对数据访问权的锁定为止。此行源代码负责同步等待时间。

  3. 单击 [函数] 标签中的 lock_local(),然后单击 [源] 标签。

    lock_local() 只锁定特定线程工作块中的数据。任何线程都无法访问另一个线程的工作块,因此每个线程都可以继续,而无需竞争或浪费时间等待同步。此行源代码(由此时起为 lock_local())的同步等待时间为零。

  4. 更改单 CPU 实验 mttest.2.er 的度量选择:
    1. 选择 [视图] 然后选择 [设置数据表示]。
    2. 清除 [互斥用户 CPU 时间] 和 [相容同步等待计数]。
    3. 选择 [时间] 列中的 [相容总 LWP 时间]、[相容等待 CPU 时间] 和 [相容其它等待时间]。
    4. 单击 [应用]。
  5. 在单 CPU 实验的 [函数] 标签中,找到 lock_local()lock_global()

    与在四 CPU 实验中一样,两个函数具有相同的相容用户 CPU 时间,因此它们将完成等量工作。同步行为也和对四 CPU 系统的行为相同:lock_global() 耗用大量时间进行同步等待,而 lock_local() 则不会。

    但是,lock_global() 的总 LWP 时间实际上要少于 lock_local() 的对应时间。这是因为每一锁定方案在确定线程在 CPU 上的运行时间时所采用的方式不同。由 lock_global() 设置的全局锁允许每个线程依次执行,直到它运行完毕为止。由 lock_local() 设置的局部锁将每个线程安排到 CPU 上以作为其运行的一部分,然后重复此过程,直到所有线程都运行完毕为止。在两种情况下,线程均要花费大量时间用于等待工作。lock_global() 中的线程将等待锁定。此等待时间出现在“相容同步等待时间”度量以及“其它等待时间”度量中。lock_local() 中的线程将等待 CPU。此等待时间出现在“等待 CPU 时间”度量中。

  6. 将度量选择恢复为单 CPU 实验 mttest.2.er 的缺省值。

    在 [设置数据表示] 对话框(应仍处于打开状态)中,执行以下操作:

    1. 选中 [互斥用户 CPU 时间] 和 [相容同步等待计数]。
    2. 清除 [时间] 列中的 [相容总 LWP 时间]、[相容等待 CPU 时间] 和 [相容其它等待时间]。
    3. 单击 [确定]。

找到要找的内容了吗?如未找到,请将您的意见通过电子邮件发送至 docfeedback@sun.com。
法律声明