pthread_spinlock是否会导致从用户空间切换到内核空间
Does pthread_spinlock cause switch from user space to kernel space
我知道很多事情都会导致从用户空间切换到内核空间,例如malloc
、ptherad_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 关键部分(是混合的:它们将首先旋转一段时间,然后才委派给基于系统调用的锁。
相关文章:
- 是否有 Windows 用户空间函数来枚举连接的网络共享?
- pthread_spinlock是否会导致从用户空间切换到内核空间
- 如何将 Boost::ASIO 与用户空间网络堆栈集成?
- 为什么共享内存(在IPC中)不需要上下文切换?这是内核空间的内存,可以映射到用户空间
- 用户空间(Linux)中是否有高分辨率时钟(我们)?
- UNIX用户空间中的实时IPC
- 如何在命名空间中引用用户定义的文本运算符
- 内核模块或用户空间应用程序
- 如何在 Linux 用户空间中处理类似 GPIO 中断的处理
- 从 Windows KMD 调用用户空间 API 函数
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 如何将具有空间的用户输入并将其返回到字符串中
- C++ - 用户空间代码中受保护代码的第二级
- Ubuntu,如何找到内核工作繁重的程序热点?似乎kernel.kallsyms上的函数没有标记为用户空间函数的子级
- 是否访问用户或内核空间
- 如何在不成为 root 用户的情况下在我的流程空间内"mount"?
- 为什么 ADL 优先于'std namespace'中的函数,但等于用户定义命名空间中的函数?
- 如何在用户空间中使用bitops.h
- 允许用户在迷宫游戏中最多移动五个空间
- 是什么阻止了用户空间程序切换到更高级别