【问题标题】:Bound wait to solve race condition绑定等待解决竞争条件
【发布时间】:2015-08-13 22:36:08
【问题描述】:

我正在尝试给出一个竞争条件示例,然后编写一个算法来强制同步并编写一个实现有界等待解决方案的算法?! 我试过这样的情况,当学校的两个管理员 A 和 B 收到 2 个学生来注册他们,如果他们同时点击保存,那么 2 个学生将拥有相同的 ID

然后我使用信号量来解决它如下:-

Start
Initialization
Do
{
Wait(semaphore);
Submitting the order to generate the ID; \\ critical section
Signal(semaphore);
}while (true);

不知道这样是否正确并满足绑定等待?!!!

【问题讨论】:

  • 你是在问我们你应该做什么?你应该问你的助教。
  • 我应该使用互斥锁还是信号量
  • 尝试编辑您的问题以获得更好的清晰度。这不是一个真正的问题,而是需要其他人来解决您的任务。并且请尽量去掉问号和感叹号,它们并不是真正必要的,它们会让你看起来像是在对别人大喊大叫。
  • 我想如果我不爆发,我将添加具有新 ID 的同一用户。那么我可以在哪里打破条件,它可以满足绑定的服务员吗?!!

标签: algorithm process operating-system synchronization race-condition


【解决方案1】:

有界等待定义为:-

其他人的次数存在界限或限制 允许进程在一个进程之后进入它们的临界区 已请求进入其临界区,在此之前 请求被批准。

回到你的问题,这也是有限等待的一个例子,但仅限于两个进程之间。它没有正确意识到几个进程正在竞争执行它们的关键 -部分。有界等待的一个更好的例子是:-

n admins A[1],A[2],..,A[n] 在学校接收学生注册时,如果他们同时点击保存,则学生将拥有相同的ID。因此,一次允许单个管理员执行其关键部分代码(即注册学生)。

然后,返回使用信号量的解决方案,您可以执行以下操作:-

n 个进程共享一个信号量mutex,初始化为 1。每个进程 A[i] 组织为:-

do{
wait(MUTEX);
// critical section
signal(MUTEX);
// remainder section
} while(TRUE);

这也是一种方式,但不幸的是,它并没有清楚地说明有限等待。在这里,您可以通过对 wait() 和 signal() 函数进行一些改进来引入一些额外的约束满足。我会按照下面提到的另一种方式指导你。

您可以使用 Pieterson 的解决方案更好地实现这一点:-

 do{
  flag[i]=TRUE;
  turn = j;
  while(flag[j] && turn == j);
   // critical section
  flag[i]=FALSE;
   // remainder section
 } while(TRUE);

这为有限等待提供了更好的解决方案。只有当进程 A[i] 卡在条件 flag[j]==true and turn == j; 的 while 循环中时,才能阻止进程 A[i] 进入其临界区——这个循环是唯一的可能性。类似地,每个进程都将按照其他进程的执行计划安排各自的代码

每个都会在特定时间进入临界区。因此,所有进程最终都将被调度并执行其关键部分,除非发生任何错误,如死锁(这是另一个方面)。

因此,进程最多可以等待n-1 轮,最终将有机会执行其临界区——从而满足有限等待。对于避免竞争条件的情况,这是一个很好的解决方案 ----- 从而为每个学生提供唯一的注册 ID。


内容摘自本书Operating System Concepts(Galvin,Silberschatz and Gagne)

【讨论】:

  • @Sosolole-是的,Peterson 的解决方案是针对竞争条件/同步问题的基于软件的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多