Concurrency 如何使用信号量监控实现?

Concurrency 如何使用信号量监控实现?,concurrency,operating-system,semaphore,concurrent-programming,binary-semaphore,Concurrency,Operating System,Semaphore,Concurrent Programming,Binary Semaphore,这是我四天内的考试,我刚刚和我的演讲人谈过,他对演讲的这一部分非常不清楚,我真的很难和许多学生一起理解这一点 基本上,如果您想使用信号量实现霍尔监视器,那么所涉及的步骤顺序是什么 下面是伪代码 ] 更新: 我现在开始明白了 因此,第一张幻灯片是访问监视器的过程 如果您是唯一一个,那么您可以调用wait(互斥) 进入显示器,做你的事情,然后离开 如果有什么东西等待进入监视器,那么您将启动下一个信号量,这就是进入信号量的等待过程的顺序。否则,如果您是监视器中唯一的一个,则退出并启动互斥锁,以便其他

这是我四天内的考试,我刚刚和我的演讲人谈过,他对演讲的这一部分非常不清楚,我真的很难和许多学生一起理解这一点

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

下面是伪代码

]

更新:

我现在开始明白了

因此,第一张幻灯片是访问监视器的过程

如果您是唯一一个,那么您可以调用wait(互斥)

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

如果有什么东西等待进入监视器,那么您将启动下一个信号量,这就是进入信号量的等待过程的顺序。否则,如果您是监视器中唯一的一个,则退出并启动互斥锁,以便其他人可以进入互斥锁

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

当你等待时(c): c_count++//等待此条件的进程数,递增1 if(next_count>0)up(next)//如果要进入监视器的等待进程数大于零,up(next),取消阻止其中一个等待进程

else up(mutex)//如果你是唯一的一个,那么就打开mutex,让其他人进入 放下(c_sem)//挡住自己睡觉 c_count--//您醒来后等待此条件的进程数将减少

对于信号(c)部分:

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

next_counter++//希望进入监视器的进程数增加1 up(c_sem);//取消阻止等待此条件的进程之一 down(next)//如果有一个点可用,则按下此按钮,否则将获得等待进程的块和连接列表
下一个计数--//你醒来,试着进入监视器,伙计,我知道你为什么困惑了。这里的问题是这个例子合并了两个概念

信号量是互斥的一种形式。抽象地说,互斥量只是一个可以原子递增或递减的变量。您的up函数递增。如果多个进程同时向上或向下运行,则向下函数将递减事件。如果您只是将count=count+1等效,那么如果多个进程试图同时递增,您将得到随机结果

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

所以,如果我这样做了

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

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

 real_world_up (semaphore)
操作系统选择一个等待进程自动运行

所以你的白色显示器看起来像

  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 ;
那是显示器的部分。您的示例中令人困惑的部分是,它是一个使用学术信号量的写得很差的锁/解锁,它只是原子地递增和递减,不知道谁在等待它们

它的等待相当于我的锁。 这相当于我的解锁完全失效了

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


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

首先,我想2小时并不能让你平静下来,所以我甚至不尝试

另一方面,这是一场考试,不是一场黑客竞赛。话虽如此。。。你为什么不坚持教授幻灯片上的学术水平呢

如果你想要一个不同的版本来解释genius C.a.R.Hoare的基本工作,而不是看这个PowerPoint,你可以阅读所有内容,但最重要的一页应该是第15页:

并且:如果你想在考试后阅读原始试卷——为争取你没有拿到的分数做准备,或者只是为了好玩——这里有:


祝你考试顺利,汤姆

发信号等一下怎么样?对此有何评论?真实世界(信号量);是他检查下一次计数是否大于0的部分吗?WAIT完全等同于我显示的LOCK。如果您想将这些实现为信号量,那么可以在LOCK和WAIT方法(或您所称的任何方法)中管理next_计数。您的示例正在实现自旋锁(但它们已经停止了循环)。正如我所说的,我明白你为什么感到困惑。我不太清楚你在这里的意思,你可以举个例子来说明任何可能性,就此道歉,但是只是因为考试有点紧张。你能评论一下我在上面的更新中的解释是否正确吗?我们不知道的一件事是在你的信号量上定义了什么操作?如果未获取信号量,您需要将进程置于等待状态(在您的示例中显然不是这样),或者您需要知道信号量的值(在您的示例中从未执行)。next_count和c_count变量是冗余的。在多线程环境中,不应该以非原子方式(即使用+++)递增变量。基本上,如果信号量关闭且为零,则它将把进程放入等待进程列表(块),否则会减少资源。对于up操作,如果有进程正在等待,则将其取出并开始运行,否则递增resourcesOne信号量是有权访问监视器的任务数(1或0)。另一个信号量是等待访问监视器的任务数(0…n)