首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么操作系统需要阻塞队列来进行任务调度?

为什么操作系统需要阻塞队列来进行任务调度?
EN

Stack Overflow用户
提问于 2014-02-26 14:13:34
回答 1查看 1.3K关注 0票数 1

为什么操作系统需要阻塞队列来进行任务调度?

因为每个信号量都有一个被其阻塞的任务队列,所以每当释放信号量(1次)时,就可以直接将其队列中的任务添加回操作系统的就绪队列。

形势:

3个任务(T1T2T3)都使用信号量S访问一些共享数据。

  1. 就绪队列:{ T1T2T3 },S = 1,{}。 操作系统运行T1T1S获得1。
  2. 就绪队列:{ T2T3T1 },S = 0,{}。 操作系统运行T2T2S获取1,并被阻塞。
  3. 就绪队列:{ T3T1 },S = -1,{ T2 }。 操作系统运行T3T3S获取1,并被阻塞。
  4. 就绪队列:{ T1 },S = -2,{ T2T3 }。 操作系统运行T1T1在使用共享资源后将1发布到S。 在发布到S时,OS将T2添加回就绪队列。
  5. 就绪队列:{ T2T1 },S = -1,{ T3 }。 操作系统运行T2T2在使用共享资源后将1发布到S。 在发布到S时,OS将T3添加回就绪队列。
  6. 就绪队列:{ T3T2T1 },S = 0,{}。 操作系统运行T3T3在使用共享资源后将1发布到S

  1. 就绪队列:{ T3T2T1 },S = 1,{}。

上述情况确实使用了S的阻塞队列,但它没有使用任何全局阻塞队列,比如操作系统的全局就绪队列。

那么,为什么操作系统要维护/需要阻塞队列呢?

(或者,在OS中是否引用了阻塞队列,实际上是每个信号量的阻塞队列,并且没有全局阻塞队列?)

EN

回答 1

Stack Overflow用户

发布于 2014-02-26 14:26:54

如果我正确理解了这个问题。

队列的最简单形式是建立在链接列表上。如果没有阻塞,就有可能有比赛条件。例如,假设我们有进程A和B,它们都呼叫叉。

A在跑步和叉子。

A准备添加到列表中,列表的大小为2。

上下文切换到B。

B也有叉子。

B准备添加到列表中,因为队列没有阻塞,列表的大小也是2。

B完成。

上下文切换到A。

A完成。

队列将具有{A,B,A-子}(不按特定顺序)。

但是B孩子会因为一个孩子重写了它而失去。

为了确保同时添加和从列表中删除一个任务,它需要相互排斥,因此我们需要信号量来阻止。

但是如果你想一想,信号量已经是一个阻塞队列了,因为在后端,它完全满足了我们的需要。

信号量的后端基本上是在任务期间“确保不会发生中断”(最低级别的阻塞形式),其他任何调用信号量的内容都将添加到信号量中的队列中。

因此,是的,操作系统需要阻塞队列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22044006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档