票证锁算法表现如何?

时间:2012-05-01 14:54:04

标签: locking pthreads

是否有人熟悉票证锁定算法,它取代了linux内核中的基本自旋锁算法?我希望找到一位专家。我从一些在线资料中读到,故障锁定算法应该更快,因为天真的算法压倒了CPU总线,所有线程都试图同时获得锁定。任何人都可以为我确认/否认这一点吗?

我做了一些自己的实验。门票锁定确实公平,但它的性能与pthread螺旋锁算法差不多。事实上,这只是一个较慢的触摸。

我看到它的方式,一个不公平的算法应该更快一些,因为早期占用锁的线程更快完成,给调度程序更少的工作。

我想对此有更多的看法。如果它不快,为什么在内核中实现了故障锁定,为什么它不在用户空间中使用?谢谢!

1 个答案:

答案 0 :(得分:2)

  

是否有人熟悉票证锁定算法,它取代了linux内核中的基本自旋锁算法?我希望找到一位专家。我从一些在线资料中读到,故障锁定算法应该更快,因为天真的算法压倒了CPU总线,所有线程都试图同时获得锁定。任何人都可以为我确认/否认这一点吗?

     

我做了一些自己的实验。门票锁定确实公平,但它的性能与pthread螺旋锁算法差不多。事实上,这只是一个较慢的触摸。

我认为引入ticket lock主要是因为公平原因。与MCS等可扩展锁相比,票证锁和自旋锁的速度和scalability几乎相同。它们都引入了许多高速缓存行无效和内存读取,它们压倒了CPU总线。

  

我看到它的方式,一个不公平的算法应该更快一些,因为早期占用锁的线程更快完成,给调度程序更少的工作。

没有涉及调度程序。票证锁和自旋锁是忙等待锁,等待时不会被阻止,但要检查锁定值。一旦锁定空闲,程序就会继续运行。控制流永远不会进入调度程序并返回。我们使用自旋锁而不是块唤醒锁的原因是块唤醒涉及上下文切换,这是昂贵的,而我们只是等待和燃烧CPU时间变得更便宜。因此,忙等待锁定只能用于“短”关键部分。

  

我想对此有更多的看法。如果它不快,为什么在内核中实现了故障锁定,为什么它不在用户空间中使用?谢谢!

它在内核中,因为内核代码也有关键部分,所以你需要内核空间锁来保护内核数据。但是,当然,您可以实现一个使用空间票证锁,并在您的应用程序中使用它。