最近,我了解到linux内核中的suspended/blocked睡眠系统调用会将当前调用线程挂起到一个状态,这意味着在上述时间过去之前,它们不会使用。-完全理解。
现在是互斥和信号,
Mutex锁:
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版”
我的问题:
我知道繁忙等待并不是解决同步问题的有效方法,但是从上面提到的代码片段中,我对使用互斥和信号量是否会导致繁忙等待?(尽管互斥和信号量被广泛用于解决大多数sysnc问题)。
使我感到使用互斥量和信号量并不是解决同步问题的有效方法,因为它将消耗CPU周期(因为它不会导致挂起状态,而是在will循环中旋转)。
简而言之:会做互斥和信号量繁忙的等待,而不是将等待线程置于挂起的状态??。
提前谢谢!如果我理解错了,请纠正我!
发布于 2017-10-07 09:17:43
互斥和信号量是否繁忙地等待?
不,在内部,这些函数(例如,pthread_mutex_lock
之类的多线程互斥函数)使用原子性机器指令(用汇编程序编码),再加上futex(7)。
对于POSIX信号量(参见概览(7)),内核调度器将安排其他任务。所以它不忙着等待。
如果没有可运行的任务,内核将在其怠速回路中等待(而不需要消耗CPU周期)以寻找某种东西(如中断)。这样,你的笔记本电脑就不会过热,在这种情况下会使用过多的电池!
也可以阅读http://pages.cs.wisc.edu/~remzi/OSTEP/ (免费下载)。如果你想开发一些玩具内核的话,也可以看看OSDEV。您还可以研究Linux 内核的源代码,因为它是自由软件,然后询问核菜鸟。标准的C库及其线程层也是免费软件(请学习glibc或musl-libc源代码)。
https://stackoverflow.com/questions/46618470
复制相似问题