这是我4天的考试,我刚刚和我的讲师谈过,他对讲课的这一部分一直非常不清楚,我真的很想和很多学生一起学习如何理解这一点。
基本上,如果您想使用信号量实现Hoare监视器,涉及的步骤顺序是什么?
] 3
更新
我现在开始接受它
所以第一张幻灯片用于访问监视器的过程
如果你是唯一一个,那么你叫wait(互斥)
进入显示器做你的东西然后离开
如果有东西等待进入监视器,那么你上升下一个信号量,这是等待进入信号量的过程。否则,如果你是显示器中唯一的那个,那么你退出并启动互斥锁,这样其他人就可以进入互斥锁了
用于具有等待(条件)和信号(条件)的第二张幻灯片
当你等待(c): c_count ++ //等待此条件的进程数,递增1 if(next_count> 0)up(next)//如果想要进入监视器的等待进程数大于零,则向上(下一步),取消阻止其中一个等待进程
else up(mutex)//如果你是唯一一个然后上传互斥锁,那么其他人进入 down(c_sem)//阻止自己入睡 c_count-- //你醒来等待这个条件减少的进程数
表示信号(c)部分:
if(c_count> 0)//如果等待此条件的进程数大于0
next_counter ++ //希望进入监视器的进程数增加1 向上(c_sem); //解锁其中一个等待此情况的进程 down(next)//如果有一个点可用,则返回此get块并加入等待进程列表 next_count--; //你醒来并试图进入监视器
答案 0 :(得分:3)
伙计,我明白你为什么感到困惑。这里的问题是这个例子合并了两个概念。
信号量是互斥体的一种形式。在摘要中,互斥锁只是一个可以原子递增或递减的变量。你的向上功能递增。如果多个进程同时启动或关闭,则向下功能会减少事件。如果你只是等于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。
此时我将作为练习留下来创建一个锁定函数,该函数只允许一个进程/线程使用一对信号量获取锁定但允许多个进程等待,并且在解锁时允许一个等待进程/线程继续。
它需要一个解锁函数来解锁互斥锁对,以允许一个进程/线程继续。
答案 1 :(得分:0)
首先 - 2小时并不是真的让你冷静下来的时间,我想 - 所以我甚至都没试过。
另一方面:这是考试,而不是黑客马拉松。说完这个,...为什么不坚持教授幻灯片的学术水平。
如果你想要一个不同版本的解释天才C.A.R的基本工作。看看这个PowerPoint,你可以阅读它,但最重要的页面应该是第15页:MonitorPPT
并且:如果你想在考试后阅读原始论文 - 准备争取你没有得到或只是为了好玩的积分 - 这里是:C.A.R. Hoare - Monitors: An Operating System Structuring Concept
考试一切顺利,汤姆!