pthread_spinlock 是否导致从用户 space 切换到内核 space
Does pthread_spinlock cause switch from user space to kernel space
我知道很多事情会导致从用户 space 切换到内核 space,例如 malloc
、ptherad_mutex_lock
等
我的问题是自旋锁是否也会导致切换或者它会留在用户中 space?
此外,来自 C++11 的 std::atomic
上的相同问题:std::atomic
将保留在用户 space 中,或者它需要从用户 space 切换到内核space?
这取决于实现,pthread_spin_lock
不被官方保证保留在 user-space 中。在具有 CAS 指令的系统(即大多数商品 SMP 系统)的实践中,情况经常如此。
这里是 x86, x86-64, ia64, sparc32, sparc64, PPC, SH4 and the general case 的 glibc 实现的链接,全部基于 CAS 循环。
同样,不能保证特定的 std::atomic
实现不会进入内核,但在实践中,尤其是当 std::atomic<T>::is_lock_free()
returns true
时,它会在原子指令的帮助下在 user-space 中实现。
另请注意,在现代 Linux pthread_mutex_lock
中使用 futex
实现,即 "user-space mutex",它保留在非用户 space 中- 有争议的案件。 malloc
只有在存在争用或需要保留更多虚拟内存时才会进入内核。
话虽如此,自旋锁是否是同步的正确选择是一个更广泛的问题,取决于系统调用以外的更多因素。正如 this question 中所解释的,当竞争状态非常短时,它在真正的 SMP 情况下很有用。大部分性能优势来自上下文切换和调度的节省。
一些互斥体实现(例如 Windows 临界区)是混合的:它们会先旋转一段时间,然后才委托给基于系统调用的锁。
我知道很多事情会导致从用户 space 切换到内核 space,例如 malloc
、ptherad_mutex_lock
等
我的问题是自旋锁是否也会导致切换或者它会留在用户中 space?
此外,来自 C++11 的 std::atomic
上的相同问题:std::atomic
将保留在用户 space 中,或者它需要从用户 space 切换到内核space?
这取决于实现,pthread_spin_lock
不被官方保证保留在 user-space 中。在具有 CAS 指令的系统(即大多数商品 SMP 系统)的实践中,情况经常如此。
这里是 x86, x86-64, ia64, sparc32, sparc64, PPC, SH4 and the general case 的 glibc 实现的链接,全部基于 CAS 循环。
同样,不能保证特定的 std::atomic
实现不会进入内核,但在实践中,尤其是当 std::atomic<T>::is_lock_free()
returns true
时,它会在原子指令的帮助下在 user-space 中实现。
另请注意,在现代 Linux pthread_mutex_lock
中使用 futex
实现,即 "user-space mutex",它保留在非用户 space 中- 有争议的案件。 malloc
只有在存在争用或需要保留更多虚拟内存时才会进入内核。
话虽如此,自旋锁是否是同步的正确选择是一个更广泛的问题,取决于系统调用以外的更多因素。正如 this question 中所解释的,当竞争状态非常短时,它在真正的 SMP 情况下很有用。大部分性能优势来自上下文切换和调度的节省。
一些互斥体实现(例如 Windows 临界区)是混合的:它们会先旋转一段时间,然后才委托给基于系统调用的锁。