【问题标题】:How do the Operating System know when a process should be put in the blocked state?操作系统如何知道进程何时应该处于阻塞状态?
【发布时间】:2019-12-26 14:50:20
【问题描述】:

我正在学习操作系统。而且我知道当当前没有可用资源时,可以将进程转为阻塞状态。我想知道,系统如何知道资源不可用?

请看下面的伪代码

resource;
resource_availability = False;
while(resource_availability == False){
   resource_availability = get_resource_state();
   if(resource_availability){
      resource = get_resource();
   }
}

while 循环将继续运行以检查资源是否可用,此代码中根本没有 WAITING。那么,系统怎么知道这个进程需要被阻塞呢?

【问题讨论】:

  • ....因为它管理所有这些。这就是操作系统 - 资源管理器。

标签: linux operating-system


【解决方案1】:

我想知道,如果资源不可用,系统如何知道?

通常,您尝试分配资源并失败。例如,它可能是这样的:

allocate_resource:
    resource = get_resource();
    if(resource == NULL) {
        do {
            block_task_until_resource_available();
            /* Wait to be unblocked */
            resource = get_resource();
         } while(resource == NULL);
    }
    return resource;

..和:

deallocate_resource:
    free_resource(resource);
    unblock_tasks_waiting_for_resource();
    return;

当然,您会期望更多的锁定/同步;并且可以将不同的代码段转移到不同的位置(例如,block_task_until_resource_available(); 可能内置在 get_resource() 中)。

while 循环将继续运行以检查资源是否可用,此代码中根本没有 WAITING。那么,系统怎么知道这个进程需要被阻塞呢?

本质上,用于取消分配资源的代码还负责通知调度程序该资源现在可用(以便调度程序可以解除阻塞等待资源的任何任务)。

while 循环通常存在,以防您因为资源变得可用而被解除阻塞,但随后一些其他任务在您之前分配了资源;或者因为数量上可能存在差异(例如,你想要 10 件东西,但没有,所以你阻止了,然后别人给了 5 件东西并叫醒了你,但 5 件还不够,所以你仍然需要等待更多)。

请注意,在某些情况下可能不需要 while 循环,因为强制执行严格的“先到先得”顺序(例如,当资源不可用时,您将被放入 FIFO 队列,而当资源被释放,等待时间最长的任务从 FIFO 队列中取出并解除阻塞,没有其他任务被解除阻塞)。即使在这种情况下,您可能仍然有一个“希望永远不需要”的 while 循环(优秀的内核开发人员使用“防御性编程”——总有可能在某处出现导致“不应该发生”实际发生的错误)。

【讨论】:

  • 所以你说块发生在while循环中。每次调用get_resource_state(),如果不可用调度器会阻塞进程?
  • @YiLuo:也许,是的 - 我更新了答案以提供有关任务何时阻塞的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2015-03-08
  • 2020-06-05
  • 2011-06-22
  • 1970-01-01
  • 2016-07-06
相关资源
最近更新 更多