Linux kernel 互斥和信号量是否;忙碌等待“;在LINUX系统中?

Linux kernel 互斥和信号量是否;忙碌等待“;在LINUX系统中?,linux-kernel,operating-system,mutex,semaphore,thread-synchronization,Linux Kernel,Operating System,Mutex,Semaphore,Thread Synchronization,最近我了解到,linux内核中的睡眠系统调用会将当前调用线程挂起到挂起/阻止状态,这意味着在上述时间过去之前,它们不会使用CPU。-完全理解 现在来看互斥和信号量 互斥锁: acquire() { while (!available) ; // busy wait --> my doubt available = false;; } release() { available = true; } 信号量锁: wait(S) { while (S <= 0) ; // bus

最近我了解到,linux内核中的睡眠系统调用会将当前调用线程挂起到挂起/阻止状态,这意味着在上述时间过去之前,它们不会使用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++;
}
等待{
这是我的疑问
S--;
}
信号机{
S++;
}
注:这些代码片段摘自ABRAHAM SILBERSCHATZ的“操作系统概念-第9版”

我的问题:

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

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

简而言之:互斥体和信号量忙着等待,而不是将等待的线程置于挂起状态吗??

提前谢谢!!如果我理解错误,请纠正

互斥量和信号量忙吗

不,在内部,这些函数(例如,Pthread mutex函数,如
Pthread\u mutex\u lock
)使用机器指令(在汇编程序中编码)与

对于POSIX信号量(请参阅),内核会安排其他任务,因此它不会忙于等待

如果没有任务是可运行的,内核将坐在它的等待(不燃烧CPU周期)的东西(如一个),所以你的笔记本电脑不会过热,并使用太多的电池在这种情况下

还可以阅读(免费下载)。如果你想开发一些玩具内核,也可以看看。你还可以学习Linux的源代码,因为它是ask on。标准C库及其pthread层也是免费软件(所以学习或源代码)

互斥量和信号量忙吗

不,在内部,这些函数(例如,Pthread mutex函数,如
Pthread\u mutex\u lock
)使用机器指令(在汇编程序中编码)与

对于POSIX信号量(请参阅),内核会安排其他任务,因此它不会忙于等待

如果没有任务是可运行的,内核将坐在它的等待(不燃烧CPU周期)的东西(如一个),所以你的笔记本电脑不会过热,并使用太多的电池在这种情况下


还可以阅读(可免费下载)。如果你想开发一些玩具内核,也可以看看。你还可以学习Linux的源代码,因为它是ask on。标准C库及其pthread层也是免费软件(所以学习或源代码).

简短的回答是“是”和“否”,但这比你的书中描述的要复杂得多。请看一下“和”。较长的形式是,如果获得互斥或信号量,它将停止调用线程,直到原语被释放。这比只旋转要好得多——如果它只是旋转i,你绝对正确t将非常低效。幸运的是,它不是。:-@jszakmeister不仅低效,它还会被破坏@好奇的家伙,真的@jszakmeister:我想我被书中的代码片段误导了,上面写着一行“忙碌等待”。简短的回答是“是”和“否”,但它比你的书中描述的要复杂得多。抢夺和。更长的形式是,如果获取了互斥或信号量,那么它将停止调用线程,直到原语被释放。这比单纯的旋转要好得多,你完全正确,如果它只是旋转,效率会非常低。幸运的是,它不是。:-)@jszakmeister不仅效率低下,还会被破坏@好奇的家伙,真的@jszakmeister:我想我被书中的代码片段误导了,上面写着一行“忙碌等待”。谢谢你的回答。我猜我被书中的代码片段误导了,上面写着一行“//busy wait”。当有人用C代码片段写一本书时,他不能用普通的C来表达wait。他会写一些注释。但是在你的书中,“忙碌”这个词令人困惑。谢谢你的回答。我猜我被书中的代码片段误导了,上面写着一行“//busy wait”。当有人用C代码片段写一本书时,他不能用普通的C来表达wait。他会写一些注释。但是在你的书中,“忙碌”这个词令人困惑。