我知道有很多事情会导致从用户空间切换到内核空间,比如malloc、ptherad_mutex_lock等。
我的问题是,如果自旋锁也会导致切换,还是它会留在用户空间?
此外,C++11在std::atomic上也提出了同样的问题:std::atomic将留在用户空间还是需要从用户空间切换到内核空间?
发布于 2020-01-15 19:52:15
这取决于实现方式,官方并不保证pthread_spin_lock会留在用户空间。在实践中,在具有CAS指令的系统上(即大多数商品SMP系统),通常会出现这种情况。
下面是指向x86、x86-64、ia64、sparc32、sparc64、PPC、SH4和general case的glibc实现的链接,所有这些都基于CAS循环。
同样,不能保证特定的std::atomic实现不会进入内核,但在实践中,特别是当std::atomic<T>::is_lock_free()返回true时,它将在原子指令的帮助下在用户空间中实现。
还要注意,在现代Linux中,pthread_mutex_lock是使用futex实现的,即“用户空间互斥锁”,在非争用的情况下,它仍然留在用户空间。只有当存在争用或需要保留更多虚拟内存时,malloc才会转到内核。
话虽如此,自旋锁是否是同步的正确选择是一个更广泛的问题,它取决于更多因素,而不仅仅是系统调用。正如在this question中所解释的,当争用状态非常短时,它在真正的SMP情况下很有用。大部分性能优势来自上下文切换和调度方面的节省。
一些互斥实现(例如Windows临界区)是混合的:它们会先旋转一段时间,然后才会转到基于syscall的锁。
https://stackoverflow.com/questions/59749676
复制相似问题