linux-kernel - LINUX 系统中的互斥量和信号量是否为 "Busy wait"?

标签 linux-kernel operating-system mutex semaphore thread-synchronization

最近我了解到 linux 内核中的 Sleep 系统调用会将当前调用线程暂停到 suspended/blocked 状态,这意味着它们不会使用 CPU,直到提到的时间过去了。 - 完全理解

现在介绍互斥量和信号量,

互斥锁:

acquire() {
while (!available)
; // busy wait    --> my doubt
available = false;;
}

release() {
available = true;
}

信号量锁:

wait(S) {
while (S <= 0)
; // busy wait --> my doubt
S--;
}
signal(S) {
S++;
}

P.S:这些代码片段摘自 “操作系统概念 - 第 9 版” 作者:ABRAHAM SILBERSCHATZ

我的问题:

我知道忙等待不是解决同步问题的有效方法,但是从上面提到的代码片段中我怀疑使用互斥锁和信号量会导致忙等待 ?? (尽管互斥量和信号量被广泛用于解决大多数 sysnc 问题)。

这又让我觉得使用互斥量和信号量不是解决同步问题的有效方法,因为它会消耗 CPU 周期 (因为它不会导致挂起状态,而是在 while 循环中旋转)

简而言之: 互斥锁和信号量是否忙于等待而不是将等待线程线程置于挂起状态??

提前致谢!!如果我的理解有误,请纠正我!!

最佳答案

Does mutexes and semaphores busy waits

不,在内部那些函数(例如 Pthread 互斥函数,如 pthread_mutex_lock)使用 atomic机器指令(用汇编程序编码)加上 futex(7) .

对于 POSIX 信号量(参见 sem_overview(7))内核 scheduler会安排其他任务。所以它不是忙着等待。

如果没有任务可运行,内核将位于其 idle loop 中。等待(不消耗 CPU 周期)某事(比如 interrupt )。所以在这种情况下,您的笔记本电脑不会过热和耗电过多!

另请阅读 Operating Systems: Three Easy Pieces (可免费下载)。另请查看 OSDEV如果你想开发一些玩具内核。您还可以研究 Linux 的源代码 kernel因为它是 free software然后在kernelnewbies上询问.标准 C 库及其 pthread 层也是免费软件(因此请研究 GNU glibcmusl-libc 源代码)。

关于linux-kernel - LINUX 系统中的互斥量和信号量是否为 "Busy wait"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46618470/

相关文章:

linux - 关于Linux内核的起点

c - *尼克斯读()/写(): Are they re-entrant?

html - 如何让我的搜索栏在所有屏幕上正确对齐。(和操作系统)

c++ - Boost 的作用域互斥锁和 WinAPI 的临界区有区别吗?

c# - 从没有管理员权限的用户应用程序访问全局互斥/信号量

multithreading - 如何在没有Arc的线程中使用互斥锁?

控制内核中的函数指针

linux - kvm 编译内核中缺少 channel

linux - 如何在 Linux 上编辑进程的 proc/pid/oom_adj

c - 更改大页分配的大小时由于initialize()函数导致的段错误