process - 阻塞等待和忙等待有什么区别?

标签 process operating-system pthreads blocked-threads

我知道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/

相关文章:

在单独的函数中创建新进程 [c]

python - 运行 python 的 Unix 进程

c - 将变量传递给 pthread_create 函数

javascript - 通过 nodejs 重新附加到生成的进程

macos - OS X 是否支持 POSIX session ?

memory - 为什么要保留内存地址 0x0,为什么要保留?

api - 如何检测Win7家庭高级版、Win7专业版、Win7企业版或Win7旗舰版操作系统?

Windows "Handle Invalid"上的 Python 将标准输出重定向到文件时

C 线程互斥代码错误?

c++ - pthread互斥体: error LNK2019: unresolved external symbol c++