4

这是我 4 天后的考试,我刚刚和我的讲师交谈,他对这部分讲座非常不清楚,我和很多学生一起努力理解这一点。

基本上,如果您想使用信号量实现 Hoare 监视器,所涉及的步骤顺序是什么?

下面是伪代码 在此处输入图像描述

一个[![][1]] 3

更新:

我现在开始明白了

所以第一张幻灯片是用于访问监视器的进程

如果你是唯一的,那么你调用 wait(mutex)

进入显示器做你的事情然后离开

如果有东西等待进入监视器,那么你就启动下一个信号量,即等待进入信号量的进程队列。否则,如果您是监视器中唯一的人,那么您退出并向上互斥体,以便其他人可以进入互斥体

对于带有等待(条件)和信号(条件)的第二张幻灯片

when u wait(c): c_count++ //等待此条件的进程数,加一 if(next_count>0) up(next) //如果希望进入监视器的等待进程数大于零, up(next),解除阻塞等待进程之一

else up(mutex) //如果你是唯一一个然后 up mutex 所以其他人进入 down(c_sem) //阻止你自己睡觉 c_count-- //你醒来所以等待这个条件的进程数量减少

对于信号(c)部分:

if(c_count>0) // 如果等待这个条件的进程数大于 0

next_counter++ //想要进入监视器的进程数增加一(c_sem);// 取消阻塞等待此条件的进程之一 down(next) //如果有可用位置,则关闭此位置,否则获取阻塞并加入等待进程的列表 next_count--; //你醒来并尝试进入显示器

4

2 回答 2

3

伙计,我明白你为什么感到困惑。这里的问题是这个例子合并了两个概念。

信号量是互斥体的一种形式。抽象地说,互斥锁只是一个可以原子递增或递减的变量。你的 up 函数递增。如果多个进程同时启动或关闭,您的 down 函数会减少事件。如果你只是弥补相当于 count = count + 1 如果多个进程试图同时增加,你会得到随机结果。

在现实世界(学术界之外)中,信号量不仅仅是增加。您也可以等待信号量。

所以,如果我这样做

 real_world_down (semaphore)

我的过程减少了信号量。如果没有进程(或线程)锁定信号量(通常 = 0,以 1 为起点),我的进程将继续。如果另一个进程已经锁定了信号量(down < 0 之后的值),我的进程将等待。

当锁定信号量的进程完成并执行

 real_world_up (semaphore)

操作系统选择一个等待进程自动运行。

因此,您的 Hoare 监视器看起来像

  var 
     semaphore ; 
  Procedure Monitor

       real_world_down (semaphore) ;

       /* do whatever you want */

       real_world_up (semaphore) ;

 End ;

或者我们可以这样写:

  var 
     semaphore ; 
  Procedure Monitor

       lock (semaphore) ;

       /* do whatever you want */

       unlock (semaphore) ;

 End ;

那是监控部分。关于您的示例令人困惑的部分是,它是一个写得很糟糕的锁定/解锁,使用学术信号量只是原子地递增和递减并且不知道谁在等待它们。

它的等待相当于我的锁。这相当于我的解锁完全是FUed。

在这一点上,我将作为练习留给您创建一个锁定函数,该函数仅允许一个进程/线程使用一对信号量获取锁定,但允许多个进程等待,并且在解锁时将允许一个等待进程/线程继续。

它需要一个解锁功能来解锁互斥锁对以允许一个进程/线程继续。

于 2016-04-25T17:30:37.187 回答
0

首先——我想,2 小时并不是让你平静下来的时间——所以我什至不尝试。

另一方面:这是一场考试,而不是黑客马拉松。说了这么多,……你为什么不坚持你教授幻灯片的学术水平。

如果你想要一个不同的版本来解释天才 CAR Hoare 的基本工作,而不是看看这个 PowerPoint - 你可以阅读它,但对你来说最重要的页面应该是第 15 页:MonitorPPT

并且:如果您想在考试后阅读原始论文 - 为争取没有得到的分数或只是为了好玩做准备 - 这里是:CAR Hoare - Monitors: An Operating System Structuring Concept

祝你考试顺利,汤姆!

于 2016-05-06T06:14:06.353 回答