信号量和等待队列之间的区别

时间:2014-06-13 09:24:53

标签: linux-kernel kernel linux-device-driver

任何人都可以解释这两种机制之间的区别,即内核中的理论和实现视角。可以等待队列用于线程同步,如果没有,为什么?

2 个答案:

答案 0 :(得分:3)

Semaphore结构中已存在等待队列。好的,我们稍微详细了解一下。

信号量结构如下:

typedef struct 
{
      int value;
      process *wait_queue;
}

其中“value”是一次信号量变量的值,“wait_queue”是等待资源的进程列表。信号量有两种类型:

  1. 计算信号量
  2. Binary Semaphore(Mutex Locks)
  3. 计数信号量可以在无限制域内,即 Semaphore.value 可以是负整数到正整数。但是Binary Semaphore的值只有0和1。现在我们将两个操作 wait() signal()定义为:

    wait(Semaphore *S)
    {
         S->value--;
    
         if(S->value < 0)
         {
              Block the process;
              Add it to S->wait_queue;
         }
    
    }
    
    signal(Semaphore *S)
    {
           S->value++;
    
           process *temp = Take a process from "S->wait_queue";
           Change the state of "temp" from block to ready state; 
    }
    

    因此,只要进程尝试获取资源,首先它将对与该资源关联的信号量执行 wait()操作。如果该资源是免费的(或该资源的任何实例是免费的),那么资源将被分配给该进程,否则将阻止进程并将其放入 wait_queue 。如果进程离开资源,则它将执行 signal()操作,并且 wait_queue 中的一个进程的状态将从等待状态更改为就绪状态。

答案 1 :(得分:2)

等待队列是基于事件的机制,您等待特定条件为真        它们不是锁。

信号量是锁定。你不能在某种条件下等待成真。

    Take lock 
    Process data
    Release lock.