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”是等待资源的进程列表。信号量有两种类型:
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”是等待资源的进程列表。信号量有两种类型:
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我没有说二进制信号量和互斥量是一样的,你应该再看一遍我的答案,不同的操作系统根据他们的需要有不同的信号量结构,如果这不是你问题的答案,那么我想我没有得到你到底想要什么。