绑定等待解决竞争条件
Bound wait to solve race condition
我正在尝试给出一个竞争条件示例,然后编写一个算法来强制同步并编写一个实现有界等待解决方案的算法?!
我试过这样的情况,当学校的两个管理员 A 和 B 接收 2 名学生注册他们时,如果他们同时点击保存,那么这 2 名学生将具有相同的 ID
然后我用信号量解决了如下问题:-
Start
Initialization
Do
{
Wait(semaphore);
Submitting the order to generate the ID; \ critical section
Signal(semaphore);
}while (true);
不知道这样对不对,满足绑定等待?!!!
有界等待定义为:-
There exists a bound, or limit, on the number of times that other
processes are allowed to enter their critical sections after a process
has made a request to enter its critical section and before that
request is granted.
回到你的问题,这也是有界等待的一个例子,但只是在两个进程之间。它没有正确地意识到几个进程正在争用执行他们的临界区。有界 waiting.would 的一个更好的例子是:-
当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);
这为有限等待提供了更好的解决方案。只有当进程 A[i] 卡在条件为 flag[j]==true and turn == j;
[=52= 的 while 循环中时,才能阻止其进入临界区]——这个循环是唯一的可能。类似地,每个进程都会根据其他进程的执行计划安排各自的代码。
每个都会在一定的时间进入临界区。因此,所有进程将最终被调度并执行它们的临界区,除非发生任何错误,如死锁(这是另一个方面)。
因此,一个进程最多可以等待n-1
轮,最终将有机会执行其临界区---从而满足有限等待。对于避免竞争条件的情况,这是一个很好的解决方案 ----- 从而为每个学生提供唯一的注册 ID。
摘自本书的内容Operating System Concepts(Galvin,Silberschatz and Gagne)
我正在尝试给出一个竞争条件示例,然后编写一个算法来强制同步并编写一个实现有界等待解决方案的算法?! 我试过这样的情况,当学校的两个管理员 A 和 B 接收 2 名学生注册他们时,如果他们同时点击保存,那么这 2 名学生将具有相同的 ID
然后我用信号量解决了如下问题:-
Start
Initialization
Do
{
Wait(semaphore);
Submitting the order to generate the ID; \ critical section
Signal(semaphore);
}while (true);
不知道这样对不对,满足绑定等待?!!!
有界等待定义为:-
There exists a bound, or limit, on the number of times that other processes are allowed to enter their critical sections after a process has made a request to enter its critical section and before that request is granted.
回到你的问题,这也是有界等待的一个例子,但只是在两个进程之间。它没有正确地意识到几个进程正在争用执行他们的临界区。有界 waiting.would 的一个更好的例子是:-
当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);
这为有限等待提供了更好的解决方案。只有当进程 A[i] 卡在条件为 flag[j]==true and turn == j;
[=52= 的 while 循环中时,才能阻止其进入临界区]——这个循环是唯一的可能。类似地,每个进程都会根据其他进程的执行计划安排各自的代码。
每个都会在一定的时间进入临界区。因此,所有进程将最终被调度并执行它们的临界区,除非发生任何错误,如死锁(这是另一个方面)。
因此,一个进程最多可以等待n-1
轮,最终将有机会执行其临界区---从而满足有限等待。对于避免竞争条件的情况,这是一个很好的解决方案 ----- 从而为每个学生提供唯一的注册 ID。
摘自本书的内容Operating System Concepts(Galvin,Silberschatz and Gagne)