信号量和 waite queu的区别
Hi ,all内核中信号量和wait queue 都可以做睡眠等待,我不知道他们的实质区别是什么?什么时候使用? 回复 1# firocu
Hi ,all
内核中信号量和wait queue 都可以做睡眠等待,我不知道他们的实质区别是什么?什么时候使用?
信号量用来实现临界区的包括。与自旋锁相比,信号量可以用在睡眠的环境下,适宜保护较长的临界区。由于竞争信号量使用了进程睡眠和唤醒操作,不适合保护较短的临界区。
linux内核信号量通过等待队列实现。
我看了,内核semaphore的内核实现源码,并没有wait queue的内容。
作为替代我找到了, struct semaphore_waiter waiter;
我知道,wait queue是作为一种内核“设施”存在的, 我想了解背后的设计哲学。
也许太较真了。 thanks for your reply。
回复 2# 瀚海书香
回复 3# firocu
wait queue的代码实现应该是wait_queue.h(or include/wait.h)那些吧。 这个可以直接看代码理解的更好,
信号量 是用等待队列实现的
比如:
#define __wait_event(wq, condition)
do {
DEFINE_WAIT(__wait);
for (;;)
{
prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE);
if (condition)
break;
schedule();
}
finish_wait(&wq, &__wait);
} while (0) 应用场合的不同
信号量 用于竞争资源,这个操作系统教科书上都有很详细的说明
实际上 wait queue 也可能实现这个功能
wait_event_interruptible_timeout(wq, condition, timeout)
这里wq表示被竞争的资源, condition用来表示数量是否大于0, timeout设置永远等待
那么就是一个信号量式的等待资源了,实际上某段时间的内核版本里 信号量就是用spin lock和 wait queue来实现
在生产者-消费者模型里,你用信号量 就不合适的,但 wait queue 就可以很好的工作
页:
[1]