问题来了:每个进程可能处于不同的状态,不同的事件会导致进程从一种状态转移到另一种状态;这可以使用状态图来表示。使用状态图来解释如何实现挂起队列信号量。[10 分]
我的图表是正确的,还是我误解了这个问题? http://i.imgur.com/dC5RG6o.jpg
据我了解,挂起队列信号量维护一个阻塞进程列表,当当前进程完成其关键部分时,从中(可能随机)选择一个进程来解除阻塞。因此状态图中的等待状态。
suspend_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;
}
}