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

Linux kernel 信号量和等待队列之间的区别,linux-kernel,kernel,linux-device-driver,Linux Kernel,Kernel,Linux Device Driver,有人能解释这两种机制之间的区别吗?从内核的理论和实现角度。等待队列可以用于线程同步吗?如果不能,为什么 等待队列已存在于信号量结构中。好的,让我们详细了解一下 信号量结构如下所示: typedef struct { int value; process *wait_queue; } 其中,“value”是一次信号量变量的值,“wait_queue”是等待资源的进程列表。信号量有两种类型: 计数信号量 二进制信号量(互斥锁) 计数信号量的范围可以是无限制域,即信号量。值

有人能解释这两种机制之间的区别吗?从内核的理论和实现角度。等待队列可以用于线程同步吗?如果不能,为什么

等待队列已存在于信号量结构中。好的,让我们详细了解一下

信号量结构如下所示:

typedef struct 
{
      int value;
      process *wait_queue;
}
其中,“value”是一次信号量变量的值,“wait_queue”是等待资源的进程列表。信号量有两种类型:

  • 计数信号量
  • 二进制信号量(互斥锁)
  • 计数信号量的范围可以是无限制域,即信号量。值的范围可以是从负整数到正整数。但二进制信号量只能有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(信号量*S)
    {
    S->值--;
    如果(S->值<0)
    {
    阻止进程;
    将其添加到S->wait_队列;
    }
    }
    信号(信号量*S)
    {
    S->value++;
    process*temp=从“S->wait_队列”获取进程;
    将“temp”状态从块更改为就绪状态;
    }
    

    因此,每当进程试图获取资源时,它首先会对与该资源关联的信号量执行wait()操作。如果该资源是空闲的(或该资源的任何实例是空闲的),则资源将分配给该进程,否则进程将被阻止并放入等待队列中。如果进程离开资源,它将执行signal()操作,并且等待队列中的一个进程的状态将从等待状态更改为就绪状态。

    等待队列已存在于信号量结构中。好的,让我们详细了解一下

    信号量结构如下所示:

    typedef struct 
    {
          int value;
          process *wait_queue;
    }
    
    其中,“value”是一次信号量变量的值,“wait_queue”是等待资源的进程列表。信号量有两种类型:

  • 计数信号量
  • 二进制信号量(互斥锁)
  • 计数信号量的范围可以是无限制域,即信号量。值的范围可以是从负整数到正整数。但二进制信号量只能有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(信号量*S)
    {
    S->值--;
    如果(S->值<0)
    {
    阻止进程;
    将其添加到S->wait_队列;
    }
    }
    信号(信号量*S)
    {
    S->value++;
    process*temp=从“S->wait_队列”获取进程;
    将“temp”状态从块更改为就绪状态;
    }
    

    因此,每当进程试图获取资源时,它首先会对与该资源关联的信号量执行wait()操作。如果该资源是空闲的(或该资源的任何实例是空闲的),则资源将分配给该进程,否则进程将被阻止并放入等待队列中。如果进程离开资源,则它将执行signal()操作,并且等待队列中的一个进程的状态将从等待状态更改为就绪状态。

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

    信号灯是锁。你不需要在特定的条件下等待真实

        Take lock 
        Process data
        Release lock.
    

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

    信号灯是锁。你不需要在特定的条件下等待真实

        Take lock 
        Process data
        Release lock.
    

    感谢您的回复,但这不是我要找的,我不认为二进制信号量和互斥量与上面提到的是一样的。我知道它们是如何工作的,我需要它们之间的区别,例如两者都可以用于线程同步,都将线程移动到睡眠模式。下面是内核中的结构<代码>结构等待队列头{spinlock\t lock;结构列表头任务列表;}
    struct信号量{spinlock\u t lock;无符号整数计数;struct list\u head wait\u list;}
    @srujan我没有说二进制信号量和互斥量是相同的,你应该再次阅读我的答案,不同的操作系统根据需要有不同的信号量结构,如果这不是你问题的答案,那么我想我没有得到你想要的确切信息。谢谢你的回答,但这不是我要寻找的,我不认为二进制信号量和互斥量与上面提到的是一样的。我知道它们是如何工作的,我需要它们之间的区别,比如两者都可以在线程同步之间使用,都将线程移动到睡眠模式。下面是内核中的结构<代码>结构等待队列头{spinlock\t lock;结构列表头任务列表;}
    struct信号量{spinlock\u t lock;无符号整数计数;struct list\u head wait\u list;}
    @srujan我没有说二进制信号量和互斥量是一样的,你应该再看一遍我的答案,不同的操作系统根据他们的需要有不同的信号量结构,如果这不是你问题的答案,那么我想我没有得到你到底想要什么。