操作系统如何知道进程何时应该处于阻塞状态?
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:也许,是的 - 我更新了答案以提供有关任务何时阻塞的更多信息。以上是关于操作系统如何知道进程何时应该处于阻塞状态?的主要内容,如果未能解决你的问题,请参考以下文章