【问题标题】:Critical Regions Construct for Processes using Semaphore & Mutex (Hoare 1973)使用 Semaphore 和 Mutex 构建流程的关键区域 (Hoare 1973)
【发布时间】:2012-03-21 06:55:30
【问题描述】:

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

构造:

region x when (B) S;

每个共享变量都关联以下变量:

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

信号量互斥量初始化为1;信号量第一延迟 和 second-delay 初始化为 0。整数 first-count 和 second- count 被初始化为 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);

【问题讨论】:

    标签: process queue mutex semaphore monitor


    【解决方案1】:

    为了避免频繁检查条件B,设计为两次延迟。 由于假定条件 B 仅受 S 影响;因此,只有在执行 S 时,我们才应该再次检查条件 B。其余线程将卡在 first_delay 或 second_delay 中。

    当然,只要有一个延迟,代码就有意义了。尝试将所有 second_delay 替换为 first_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 将被反复检查。

    访问HERE了解更多详情!

    【讨论】:

      猜你喜欢
      • 2017-05-14
      • 2016-11-13
      • 1970-01-01
      • 2020-11-02
      • 2014-01-23
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2018-09-09
      相关资源
      最近更新 更多