为什么操作系统需要阻塞队列来进行任务调度?
因为每个信号量都有一个被其阻塞的任务队列,所以每当释放信号量(1次)时,就可以直接将其队列中的任务添加回操作系统的就绪队列。
形势:
3个任务(T1,T2,T3)都使用信号量S访问一些共享数据。
上述情况确实使用了S的阻塞队列,但它没有使用任何全局阻塞队列,比如操作系统的全局就绪队列。
那么,为什么操作系统要维护/需要阻塞队列呢?
(或者,在OS中是否引用了阻塞队列,实际上是每个信号量的阻塞队列,并且没有全局阻塞队列?)
发布于 2014-02-26 14:26:54
如果我正确理解了这个问题。
队列的最简单形式是建立在链接列表上。如果没有阻塞,就有可能有比赛条件。例如,假设我们有进程A和B,它们都呼叫叉。
A在跑步和叉子。
A准备添加到列表中,列表的大小为2。
上下文切换到B。
B也有叉子。
B准备添加到列表中,因为队列没有阻塞,列表的大小也是2。
B完成。
上下文切换到A。
A完成。
队列将具有{A,B,A-子}(不按特定顺序)。
但是B孩子会因为一个孩子重写了它而失去。
为了确保同时添加和从列表中删除一个任务,它需要相互排斥,因此我们需要信号量来阻止。
但是如果你想一想,信号量已经是一个阻塞队列了,因为在后端,它完全满足了我们的需要。
信号量的后端基本上是在任务期间“确保不会发生中断”(最低级别的阻塞形式),其他任何调用信号量的内容都将添加到信号量中的队列中。
因此,是的,操作系统需要阻塞队列。
https://stackoverflow.com/questions/22044006
复制相似问题