【问题标题】:Does pthread_spinlock cause switch from user space to kernel spacepthread_spinlock 是否会导致从用户空间切换到内核空间
【发布时间】:2020-01-15 10:40:43
【问题描述】:

我知道有很多事情会导致从用户空间切换到内核空间,例如mallocptherad_mutex_lock 等。

我的问题是自旋锁是否也会导致切换或者它会留在用户空间中?

此外,关于 C++11 中 std::atomic 的相同问题:std::atomic 将留在用户空间还是需要从用户空间切换到内核空间?

【问题讨论】:

  • 为什么需要知道?
  • @user253751 嗯,我想知道mutexspinlockatomic的性能。

标签: c++ linux locking mutex atomic


【解决方案1】:

这取决于实现,pthread_spin_lock 没有官方保证会保留在用户空间中。在具有 CAS 指令的系统(即大多数商品 SMP 系统)上的实践中,通常会出现这种情况。

这里是x86x86-64ia64sparc32sparc64PPCSH4general case 的 glibc 实现链接,所有这些都基于 CAS循环。

同样不能保证特定的std::atomic 实现不会进入内核,但在实践中,特别是当std::atomic<T>::is_lock_free() 返回true 时,它将在原子指令的帮助下在用户空间实现.

还要注意,在现代 Linux 中,pthread_mutex_lock 是使用 futex 实现的,即“用户空间互斥锁”,在非竞争情况下它仍保留在用户空间中。 malloc 只有在发生争用或需要保留更多虚拟内存时才会进入内核。

话虽如此,自旋锁是否是同步的正确选择是一个更广泛的问题,它取决于系统调用的更多因素。正如this question 中所解释的,当竞争状态非常短时,它在真正的 SMP 情况下很有用。大部分性能优势来自于上下文切换和调度的节省。

一些互斥锁实现(例如 Windows 临界区)是混合的:它们会先旋转一段时间,然后再委托给基于系统调用的锁。

【讨论】:

  • 很好的解释。还有一个小问题:我能说 CAS 指令必须在内核空间吗?
  • 不,不需要,CAS指令只是一条CPU指令,它在用户空间和内核空间的工作方式相同。
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2016-06-26
  • 2012-06-23
  • 2014-06-02
相关资源
最近更新 更多