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() 没有,为啥?