使用信号量和互斥体为进程构建的关键区域(Hoare 1973)



在学习操作系统的基本概念时,我在高级编程语言中的关键区域构造主题下找到了这段代码。这是霍尔在1973年给出的。我在网上搜索了一下,但找不到任何与此相关的参考资料。我的疑问是,为什么有两个队列:第一个延迟和第二个延迟?只需要一个队列就可以了吗?

构造:

region x when (B) S;

对于每个共享变量,将关联以下变量:

semaphore mutex, first-delay, second-delay;
int first-count, second-count; 

信号量互斥被初始化为1;信号量第一延迟以及第二延迟被初始化为0。整数第一-计数和第二-计数初始化为0

代码:

wait (mutex) ;
        while (!B) {
        first-count++;
        if (second-count > 0)
        signal (second-delay) ;
        else
        signal (mutex) ;
        wait (first-delay) ;
        first-count--;
        second-count++ ;
        if (first-count > 0)
        signal (first-delay) ;
        else
        signal(second-delay);
        wait (second-delay) ;
        second-count-- ;
    }
    S:
        if (first-count > 0)
        signal (first-delay) ;
        else if (second-count > 0)
        signal( second-delay) ;
        else
        signal(mutex);

它被设计为两个延迟,以避免频繁检查条件B。由于条件B被认为只受S的影响;因此,只有当S被执行时,我们才应该再次检查条件B。其余线程将被困在first_delay或second_delay。

当然,只要有一个延迟,代码就有意义了。试着用first_delay替换所有的second_delay,并消除琐碎的部分。你可能会得到这样的东西:

wait(mutex);
while (!B) {
    first_count++;
    if (first_count > 0)
        signal(first_delay);
    else
        signal(mutex);
    wait(first_delay);
    first_count--;
}
S;
if (first_count > 0)
    signal(first_delay);
else
    signal(mutex); 

然而,在这种情况下,条件B将被反复检查。

请访问此处了解更多详细信息!

最新更新