2013-05-08 55 views
0

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

我的图是否正确,或者我误解了这个问题?

我的理解是,挂起队列信号量会保留一个阻塞进程的列表,从当前进程完成其临界区时(或许随机)选择一个进程来解除阻塞。因此状态图中的等待状态。

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

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

该进程的状态图只有两种状态:排队(Q)和运行(R)以及开始和终止状态。 状态图将是:

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

信号灯具有空和满 两个状态信号量状态图将是:

 
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;并且内部消息运行并暂停。

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

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

+0

谢谢,请您提供一篇文章的链接以供进一步阅读?我相信这个问题是要求在一个进程中显示暂停队列信号量的实现(以及影响),所以从两种就绪状态(你的排队)和运行到三种就绪状态(你的排队),运行并等待。 – 2013-05-08 15:32:42

+0

这就是为什么我问你指的是哪个信号量。它支持哪些方法(即传递哪些消息)。在进程微积分中,信号量将被建模为两个进程之间的交互:信号量和它同步的井进程/线程/任务。 AFAIK暂停队列信号量是暂停进程放入队列(即先到先服务)的信号量。我不知道你的三状态信号量的语义,它们是否类似于有两个队列的C#监视器(一个用于准备运行,另一个用于等待脉冲?)。 – 2013-05-08 23:38:32

+0

进一步思考这个问题,我认为信号量可能会干扰从已准备好运行的“已调度”箭头并将箭头推​​向等待状态。我不知道如何在图表上显示 – 2013-05-08 23:38:37