任何人都可以解释这两种机制之间的区别,即内核中的理论和实现视角。可以等待队列用于线程同步,如果没有,为什么?
答案 0 :(得分:3)
Semaphore结构中已存在等待队列。好的,我们稍微详细了解一下。
信号量结构如下:
typedef struct
{
int value;
process *wait_queue;
}
其中“value”是一次信号量变量的值,“wait_queue”是等待资源的进程列表。信号量有两种类型:
计数信号量可以在无限制域内,即 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.