我知道Busy Waiting的实现。这是一个像这样的死亡循环:
//main thread
while (true) {
msg = msgQueue.next();
msg.runnable.run();
}
//....msg queue
public Message next() {
while (true) {
if (!queue.isEmpty()) {
return queue.dequeue();
}
}
}
所以,“next()”方法看起来像是被阻塞了,实际上它一直在运行。 这在书上称为“忙等待”。
什么是“进程被阻止”?它的实现细节又如何呢? 也是死亡循环吗?或者其他一些?像信号机制吗?
例如: 猫xxx | grep "abc"
进程“cat”读取文件并输出它们。
进程“grep”等待来自“cat”的输入。
所以在“cat”输出数据之前,“grep”应该被阻塞,等待输入并继续。 关于这个“阻塞”的细节是什么,死亡循环一直在读取输入流?或者真的停止运行,等待信号唤醒它运行?
最佳答案
区别主要在于过程中发生的情况:
<强>1。忙等待
忙碌等待的进程本质上是持续运行的,询问“我们到了吗?我们到了吗?现在怎么样,我们到了吗?”这个问题消耗了 100% 的 CPU 周期:
bool are_we_there = false;
while(!are_we_there)
{
// ask if we're there (without blocking)
are_we_there = ask_if_we_are_there();
}
<强>2。被阻止(或被阻止)的进程
被阻塞的进程会被操作系统挂起,并且当它等待的数据可用时会自动收到通知。如果没有操作系统的帮助,这是无法完成的。
示例是等待长时间运行的 I/O 操作或等待计时器到期的进程:
// use a system call to create a waitable timer
var timer = CreateWaitableTime()
// use another system call that waits on a waitable object
WaitFor(timer); // this will block the current thread until the timer is signaled
// .. some time in the future, the timer might expire and it's object will be signaled
// causing the WaitFor(timer) call to resume operation
更新
可等待对象可以在操作系统级别以不同的方式实现,但通常它可能是硬件计时器、中断和在操作系统中注册的可等待对象的组合通过客户端代码。当中断发生时,操作系统的中断处理程序被调用,该处理程序将扫描与该事件关联的任何可等待对象,并调用某些回调,该回调最终将向可等待对象发出信号(将它们放入有信号的状态)。这是一个过度简化的问题,但如果您想了解更多信息,您可以阅读中断和硬件计时器。
关于process - 阻塞等待和忙等待有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541119/