pthread_spinlock是否会导致从用户空间切换到内核空间

Does pthread_spinlock cause switch from user space to kernel space

本文关键字:空间 用户 内核 spinlock 是否 pthread      更新时间:2023-10-16

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

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

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

这取决于实现,pthread_spin_lock不能正式保证保留在用户空间中。在实践中,在具有CAS指令的系统(即大多数商品SMP系统(上,情况经常如此。

以下是 x86、x86-64、ia64、sparc32、sparc64、PPC、SH4 和一般情况的 glibc 实现的链接,所有这些都基于 CAS 循环。

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

另请注意,在现代Linux中,pthread_mutex_lock是使用futex实现的,即"用户空间互斥锁",在非争用的情况下,它保留在用户空间中。 仅当存在争用或需要保留更多虚拟内存时,malloc才会转到内核。

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

一些互斥体实现(例如 Windows 关键部分(是混合的:它们将首先旋转一段时间,然后才委派给基于系统调用的锁。