Blocked 和 Busy Waiting 有啥不同?

Posted

技术标签:

【中文标题】Blocked 和 Busy Waiting 有啥不同?【英文标题】:what's different between the Blocked and Busy Waiting?Blocked 和 Busy Waiting 有什么不同? 【发布时间】:2014-12-19 21:21:55 【问题描述】:

我知道 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”应该被阻塞,等待输入继续。 关于这个“阻塞”的死亡循环一直在读取输入流的详细信息是什么?还是真的停止运行,等待信号唤醒它运行?

【问题讨论】:

大家好,现在,我知道有什么区别了:D,忙等待是一个循环,cpu会一直执行,block是一种内核/OS控制,不会浪费cpu资源。 【参考方案1】:

区别基本上在于流程发生了什么:

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

更新

可等待对象可能在操作系统级别以不同的方式实现,但通常它可能是硬件计时器、中断和向操作系统注册的可等待对象列表的组合通过客户端代码。当中断发生时,操作系统的中断处理程序会被调用,该处理程序会扫描与该事件关联的所有可等待对象,并调用特定的回调,最终将向可等待对象发出信号(将它们放入信号状态)。这是一种过度简化,但如果您想了解更多信息,可以阅读中断和硬件计时器。

【讨论】:

umm... 操作系统如何做到这一点?【参考方案2】:

当您说“进程被阻塞”时,您实际上是指“线程被阻塞”,因为这些是唯一获得 CPU 时间的可调度实体。当线程忙于等待时,它会在循环中浪费 CPU 时间。当线程被阻塞时,系统调用中的内核代码发现数据或锁不是立即可用的,因此它将线程标记为等待。然后它跳转到调度程序,该调度程序选择另一个准备执行的线程。阻塞系统调用中的此类代码可能如下所示:

100:    if (data_available()) 
101:        return;
102:     else 
103:        jump_to_scheduler();
104:    

稍后线程被重新调度并在第 100 行重新启动,但它立即到达 else 分支并再次离开 CPU。当数据可用时,系统调用最终返回。

不要逐字逐句,这是我根据我对操作系统的了解的猜测,但你应该明白。

【讨论】:

以上是关于Blocked 和 Busy Waiting 有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章

Java线程状态中BLOCKED和WAITING有什么差别?

Java 线程状态转换,WAITING 到 BLOCKED,还是 RUNNABLE?

Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

Java:两个 WAITING + 一个 BLOCKED 线程, notify() 导致活锁, notifyAll() 没有,为啥?

转:java线程状态说明,Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

Java基础教程——线程状态