具有信号量和加权优先级的Reader-Writer

时间:2014-05-01 05:09:00

标签: semaphore

我想知道读写器问题是否有一个简单的解决方案,我们可以给读者优先权,但不是使用信号量的绝对优先级。基本上我想要在关键部分的队列中实现5个读者与1个写入者的比率。

换句话说:如果读者和作者想要进入关键部分,读者就会优先考虑。如果另一位读者想在此之后进入,他们也会优先考虑。这将继续为五位读者,之后作者将优先考虑。

例如,想象一下,如果有10位读者和2位作家想进入临界区。输入顺序为:

  1. 5位读者
  2. 1位作家
  3. 5位读者
  4. 1位作家
  5. 我很感激这方面的任何帮助。

1 个答案:

答案 0 :(得分:1)

我刚刚参与了两天前的设计会议,我们打算解决同样的问题。这就是我们想出来的。

class WeightedSemaphore {

  Map<String,Semaphore> layer1
  Semaphore layer2

  //ratios passed, for your example:  read:5, write:1
  public configure(int realLeases, Map<String,Integer> ratios) {
     for (String key : ratio.keys) {
        layer1.put(key, new Semaphore(realLeases * ratios.get(key))
     }
     layer2 = new Semaphore(realLeases, fair)
  }

  public acquire(String key) {
     layer1.get(key).acquire();
     layer2.acquire();
  }

}

这是最小的伪代码,但是得到了主要的观点。主要思想是设计一个2层信号量,其中layer2是一个信号量,其中包含我们想要支持的实际租约数量;而layer1用于塑造将要在layer2信号量上等待的工作。

这种方法有2个属性,我觉得很酷。

  1. 虽然它有利于具有更高比率的密钥,但它并没有表现出您在许多优先级队列类型系统中看到的饥饿行为。

  2. 当没有高优先级的工作要做时,它不会浪费容量。任何密钥都可以使用信号量的全部容量,但在新工作到来时会快速退出。

  3. 希望这有帮助。