📅  最后修改于: 2023-12-03 15:28:42.339000             🧑  作者: Mango
该问题是2004年计算机科学的GATE考试中的第6个问题。
有四个进程P0, P1, P2, P3需要访问一个临界区域,并且在共享资源上竞争。以下是进程实现中的三个关键部分:
1.for (i = 1; i <= N; i++)
从1到N的循环。
2.```while (TRUE) {
Criticalsection();
Remaindersection();}``` 进入关键部分,完成任务后退出。
wait(S);
等待信号S。程序员必须设计一个称为“门”的同步原语,以满足以下要求:
以下是门同步原语的实现:
semaphore mutex = 1;
semaphore gate = N;
semaphore turnstile = 0;
void gate(){
wait(gate);
wait(mutex);
turnstile++;
signal(gate);
signal(mutex);
Criticalsection();
wait(mutex);
turnstile--;
if (turnstile == 0) {
signal(mutex);
}
Remaindersection();
}
实现了一个名为“门”的同步原语。它使用一个二元信号量mutex来锁定关键部分,并使用一个整数计数器turnstile来实现门控制。
当第一个进程Pi到达关键部分时,它等待进入门,并通过wait(gate)减少gate上的计数器。
接下来,它尝试在mutex上等待(wait(mutex)),以确保进入和退出是按照正确的顺序进行的。然后turnstile被增加(turnstile++)并释放了mutex(signal(mutex))。
其他等待进入门的进程需要先通过wait(gate)获取访问许可。turnstile的值现在被增加,它们需要等待直到所有的进程到达turnstile等待区(turnstile == N),这时它们可以进入门。
当一个进程完成在门区(在Criticalsection();以及在Remaindersection();)中的操作时,它需要在任何其他进程进入之前离开。turnstile的值会减少一个(turnstile--)。
如果此时还有任何一个进程在turnstile等待区(turnstile > 0),则mutex将被保持,使下一个进程不能进入门。另一方面,如果这是最后一个等待进入门的进程(turnstile == 0),则mutex将被释放,以使下一个等待进入门的进程进入。
这样,门同步原语使用信号量来解决了进程互斥和同步问题,确保了资源的安全,让进程按照预期执行。
这个问题考察了计算机科学中的并发控制,以及信号量和进程同步技术。设计原语的过程中,需要综合考虑多种情况,例如进程的到达和离开,计数器的自增和自减等,往往需要自己尝试多次才能完成。这种问题解决能力,在软件工程中也是必不可少的。