【问题标题】:How do I draw a state diagram for a suspension-queue semaphore?如何绘制暂停队列信号量的状态图?
【发布时间】:2013-05-08 04:39:23
【问题描述】:

这是一个问题: 每个进程可能处于不同的状态,不同的事件导致进程从一种状态转移到另一种状态;这可以使用状态图来表示。使用状态图来解释如何实现挂起队列信号量。 [10分]

我的图表是正确的,还是我误解了这个问题? http://i.imgur.com/dC5RG6o.jpg

据我了解,挂起队列信号量维护一个阻塞进程列表,当当前进程完成其临界区时,从该列表中(可能是随机地)选择一个要解除阻塞的进程。因此状态图中的等待状态。

suspended_queue_semaphore 的伪代码。

struct suspended_queue_semaphore
{
  int count;
  queueType queue;
};
void up(suspended_queue_semaphore s)
{
  if (s.count == 0)
  {
    /* place this process in s.queue /*
    /* block this process */
  }
  else
  {
    s.count = s.count - 1;
  }
}
void down(suspended_queue_semaphore s)
{
  if (s.queue is not empty)
  {
    /* remove a process from s.queue using FIFO */
    /* unblock the process */
  }
  else
  {
    s.count = s.count + 1;
  }
}

【问题讨论】:

    标签: semaphore


    【解决方案1】:

    是进程的状态图还是信号量,你说的是哪个信号量。 在最简单的信号量中:二进制信号量(即只能运行一个进程),带有操作 wait() 即请求访问共享资源和 signal() 即完成访问资源。

    进程的状态图除了开始和终止状态外,只有两种状态:排队 (Q) 和运行 (R)。 状态图将是:

    开始 = 等待。CAN_RUN CAN_RUN = 挂起.QUEUED + 运行.RUNNING 排队=运行。运行 运行 = 信号。结束

    信号量有两种状态 Empty 和 Full 信号量的状态图是:

    开始 = 空 空 = 等待。RUN_PROCCESS + RUN_PROCESS RUN_PROCESS = run.FULL FULL = signal.EMPTY + wait.SUSPEND_PROCESS SUSPEND_PROCESS = 挂起.FULL

    编辑: 修正了状态图的表示法(很抱歉我的进程演算生锈了)并添加了内部进程 CAN_RUN、SUSPEND_PROCESS 和 RUN_PROCESS;内部消息运行和挂起。

    说明: 该进程调用“等待”方法(在您的伪代码中)并进入 CAN_RUN 状态,从那里它可以开始 RUNNING 或根据是否收到“运行”或“暂停”消息而成为排队。如果 QUEUED,它可以在收到“运行”消息时开始运行。如果 RUNNING 它在完成之前使用“信号”(在您的伪代码中)。

    信号量开始 EMPTY,如果它得到一个“等待”它进入 RUN_PROCESS 发出一个“运行”消息并变为 FULL。一旦 FULL,任何进一步的“等待”都会将其发送到 SUSPEND_PROCESS 状态,在该状态下它会向进程发出“暂停”。当收到“信号”时,它会返回 EMPTY 并且它可以保留在那里或根据队列是否为空再次进入 RUN_PROCESS(我没有对这些内部状态进行建模,也没有将队列建模为系统。 )

    【讨论】:

    • 谢谢,能否提供文章链接以供进一步阅读?我相信问题是要求显示暂停队列信号量的实现(以及因此对进程的影响),因此从就绪(您的排队)和运行的两种状态变为就绪(您的排队)的三种状态,运行并等待。
    • 这就是为什么我问你指的是哪个信号量。它支持什么方法(即传递什么消息)。在进程演算中,信号量将被建模为两个进程之间的交互:信号量和它同步的井进程/线程/任务。 AFAIK 挂起队列信号量是一种信号量,其中挂起的进程被放入队列中(即先到先得)。我不知道您的三状态信号量的语义,它们是否类似于具有两个队列的 C# 监视器(一个用于准备运行,一个用于等待脉冲?)。
    • 进一步考虑这一点,我认为信号量可能会干扰“调度”箭头从准备运行并将箭头推​​向等待状态。我不知道如何在图表上显示这个
    • 我添加了伪代码,详细说明了我所理解的挂起队列信号量的基本结构和方法。你是对的,队列将按照 FIFO 移除策略运行。
    • @Danny,您的伪代码只包含两条​​消息,up 和 down,进程只能处于运行或挂起两种状态。我认为您可能因取消和中断的消息而使您的答案过于复杂。
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多