在LINUX系统中,互斥和信号量是否"忙等待"?

Leg*_*las 0 operating-system mutex semaphore linux-kernel thread-synchronization

最近我发现Linux内核中的Sleep系统调用会将当前调用线程挂起到挂起/阻塞状态,这意味着他们不会在上述时间过去之前使用CPU.- 完全理解.

现在来到互斥和信号量,

互斥锁:

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

release() {
available = true;
}
Run Code Online (Sandbox Code Playgroud)

信号量锁定:

wait(S) {
while (S <= 0)
; // busy wait --> my doubt
S--;
}
signal(S) {
S++;
}
Run Code Online (Sandbox Code Playgroud)

PS:这些代码片段取自ABRAHAM SILBERSCHATZ的"操作系统概念-9版"

我的问题:

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

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

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

提前致谢 !!.如果我的理解错了,请纠正我!

Bas*_*tch 5

互斥锁和信号量是否会忙碌等待

不,内部那些函数(例如Pthread互斥函数pthread_mutex_lock)使用与futex(7)耦合的原子机器指令(用汇编语言编写).

对于POSIX信号量(请参阅sem_overview(7)),内核调度程序将安排其他任务.所以它不忙等待.

如果没有任务可运行,则内核将在其空闲循环中等待(不会烧掉CPU周期)某些事情(如中断).因此,在这种情况下,您的笔记本电脑不会过热并使用太多电池!

另请阅读操作系统:三个简易件(可免费下载).如果你想开发一些玩具内核,也可以看看OSDEV.您还可以研究Linux 内核的源代码,因为它是免费软件然后在kernelnewbies上询问.标准C库及其pthread层也是免费软件(因此研究GNU glibcmusl-libc源代码).