绑定等待解决竞争条件

时间:2015-05-31 11:48:44

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

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

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

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

我不知道它是否正确并满足约束等待?!!!

1 个答案:

答案 0 :(得分:0)

有界等待定义为: -

  

对其他人的次数存在约束或限制   允许进程在进程后进入其关键部分   已提出进入其关键部分的请求   请求被授予。

回到你的问题,它也是一个有限等待的例子,但只在两个进程之间。它没有正确认识到有几个进程正在争夺它们的执行临界区。有界等待的一个更好的例子是: -

n管理员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);

这为有限的等待提供了更好的解决方案。只有在条件为 flag[j]==true and turn == j; 的情况下,进程A [i]才会进入临界区,才能阻止进程A [i] - 此循环为唯一的可能性。类似地,每个进程将按照其他进程的执行计划的条款排列相应的代码。

每个人都会在某个时间进入关键部分。因此,所有进程将最终安排并执行其关键部分 ,除非发生任何错误,例如死锁(这是另一个方面)。

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

从书Operating System Concepts(Galvin,Silberschatz and Gagne)

中获取的内容