如何绘制暂停队列信号量的状态图?

时间:2013-05-08 04:39:24

标签: semaphore

以下是问题: 每个进程可能处于不同的状态,不同的事件会导致进程从一个状态转移到另一个状态;这可以使用状态图表示。使用状态图解释如何实现暂停队列信号量。 [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;
  }
}

1 个答案:

答案 0 :(得分:1)

是进程或信号量的状态图,以及您正在谈论的信号量。 在最简单的信号量中:二进制信号量(即只有一个进程可以运行),操作wait()即访问共享资源和signal()的请求,即完成访问资源。

除了Start和Terminate状态之外,该进程的状态图只有两种状态:Queued(Q)和Running(R)。 状态图将是:

START = wait.CAN_RUN
CAN_RUN = suspend.QUEUED + run.RUNNING
QUEUED = run.RUNNING
RUNNING = signal.END

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

START = EMPTY
EMPTY = wait.RUN_PROCCESS + RUN_PROCESS
RUN_PROCESS = run.FULL
FULL = signal.EMPTY + wait.SUSPEND_PROCESS
SUSPEND_PROCESS = suspend.FULL

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

说明: 该进程调用'wait'方法(在伪代码中向上)并进入CAN_RUN状态,从那里它可以根据它是否获得'run'或'suspend'消息开始RUNNING或变为QUEUED。如果是QUEUED,它会在收到“运行”消息时开始运行。如果RUNNING在完成之前使用'signal'(在伪代码中向下)。

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