我试图给出一个竞争条件示例,然后编写一个算法来强制同步并编写一个实现Bounded等待解决方案的算法?! 我试过一个案例,当学校的两名管理员A和B收到2名学生注册时,如果他们在同一时间点击保存,则2名学生将拥有相同的ID
然后我使用信号量解决它如下: -
Start
Initialization
Do
{
Wait(semaphore);
Submitting the order to generate the ID; \\ critical section
Signal(semaphore);
}while (true);
我不知道它是否正确并满足约束等待?!!!
答案 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)