【问题标题】:do semaphores satisfies bounded waiting信号量是否满足有限等待
【发布时间】:2010-12-03 19:00:19
【问题描述】:

信号量是满足有限等待还是仅仅为了提供互斥?

【问题讨论】:

    标签: semaphore


    【解决方案1】:

    回答

    从理论上讲,它可能会打破有限等待条件,如下所示。实际上,这在很大程度上取决于使用哪种调度算法。

    wait()signal()原语的经典实现如下:

    //primitive
    wait(semaphore* S)
    {
        S->value--;
        if (S->value < 0)
        {
            add this process to S->list;
            block();
        }
    }
    
    //primitive
    signal(semaphore* S)
    {
        S->value++;
        if (S->value <= 0)
        {
            remove a process P from S->list;
            wakeup(P);
        }
    }
    

    当一个进程调用wait() 并未能通过“if”测试时,它会将自己放入等待列表中。如果多个进程在同一个信号量上被阻塞,它们都会被放入这个列表中(或者你可以想象它们以某种方式链接在一起)。当另一个进程离开临界区并调用 signal() 时,将选择等待列表中的一个进程唤醒,准备再次竞争 CPU。但是,调度程序决定从等待列表中选择哪个进程。例如,如果调度是以 LIFO(后进先出)方式实现的,则可能某些进程处于饥饿状态。

    示例

    T1: thread 1 calls wait(), enters critical section
    T2: thread 2 calls wait(), blocked in waiting list
    T3: thread 3 calls wait(), blocked in waiting list
    T4: thread 1 leaves critical section, calls signal()
    T5: scheduler wakes up thread 3
    T6: thread 3 enters critical section
    T7: thread 4 calls wait(), blocked in waiting list
    T8: thread 3 leaves critical section, calls signal()
    T9: scheduler wakes up thread 4
    ..
    

    如您所见,尽管您正确实现/使用了信号量,但线程 2 的等待时间是无限的,甚至可能由于新进程的不断进入而导致饥饿。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多