操作系统如何知道进程何时应该处于阻塞状态?

Posted

技术标签:

【中文标题】操作系统如何知道进程何时应该处于阻塞状态?【英文标题】: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。那么,系统怎么知道这个进程需要被阻塞呢?

【问题讨论】:

....因为它管理所有这些。这就是操作系统 - 资源管理器。 【参考方案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:也许,是的 - 我更新了答案以提供有关任务何时阻塞的更多信息。

以上是关于操作系统如何知道进程何时应该处于阻塞状态?的主要内容,如果未能解决你的问题,请参考以下文章

操作系统中如何引发进程调度?

进程的三态模型

在java多线程程序中,怎样实时找出处于等待(阻塞)状态线程、进程的个数。

进程的基本状态及转换

进程的状态

node.js 进程如何知道何时停止?