📜  门| GATE-CS-2004 |问题6(1)

📅  最后修改于: 2023-12-03 15:28:42.339000             🧑  作者: Mango

门| GATE-CS-2004 |问题6

该问题是2004年计算机科学的GATE考试中的第6个问题。

问题描述

有四个进程P0, P1, P2, P3需要访问一个临界区域,并且在共享资源上竞争。以下是进程实现中的三个关键部分:

1.for (i = 1; i <= N; i++) 从1到N的循环。 2.```while (TRUE) {

        Criticalsection();
        Remaindersection();}``` 进入关键部分,完成任务后退出。 
  1. wait(S); 等待信号S。

程序员必须设计一个称为“门”的同步原语,以满足以下要求:

  1. 一次只能有一个进程位于关键部分.
  2. 第一个到达门的进程必须进入.
  3. 一旦任何进程进入门,其他进程必须等待直到进入的进程退出.
  4. 当进程退出门时,如果没有其他进程在门口等待,则门必须保持关闭.
自己动手

以下是门同步原语的实现:

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将被释放,以使下一个等待进入门的进程进入。

这样,门同步原语使用信号量来解决了进程互斥和同步问题,确保了资源的安全,让进程按照预期执行。

总结

这个问题考察了计算机科学中的并发控制,以及信号量和进程同步技术。设计原语的过程中,需要综合考虑多种情况,例如进程的到达和离开,计数器的自增和自减等,往往需要自己尝试多次才能完成。这种问题解决能力,在软件工程中也是必不可少的。