Chinaunix

标题: 信号量和 waite queu的区别 [打印本页]

作者: firocu    时间: 2013-08-05 11:42
标题: 信号量和 waite queu的区别
Hi ,all

内核中信号量和wait queue 都可以做睡眠等待,我不知道他们的实质区别是什么?什么时候使用?
作者: 瀚海书香    时间: 2013-08-05 13:07
回复 1# firocu
Hi ,all

内核中信号量和wait queue 都可以做睡眠等待,我不知道他们的实质区别是什么?什么时候使用?



信号量用来实现临界区的包括。与自旋锁相比,信号量可以用在睡眠的环境下,适宜保护较长的临界区。由于竞争信号量使用了进程睡眠和唤醒操作,不适合保护较短的临界区。

linux内核信号量通过等待队列实现。

   
作者: firocu    时间: 2013-08-05 15:35
我看了,内核semaphore的内核实现源码,并没有wait queue的内容。
作为替代我找到了, struct semaphore_waiter waiter;

我知道,wait queue是作为一种内核“设施”存在的, 我想了解背后的设计哲学。
也许太较真了。 thanks for your reply。


回复 2# 瀚海书香


   
作者: kiongf    时间: 2013-08-06 10:00
回复 3# firocu


    wait queue的代码实现应该是wait_queue.h(or include/wait.h)那些吧。
作者: wzw200    时间: 2014-05-29 11:03
这个可以直接看代码理解的更好,
信号量 是用等待队列实现的

比如:
#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)
作者: senioryzc    时间: 2014-05-29 12:57
应用场合的不同
信号量 用于竞争资源,这个操作系统教科书上都有很详细的说明
实际上 wait queue 也可能实现这个功能
wait_event_interruptible_timeout(wq, condition, timeout)
这里wq表示被竞争的资源, condition用来表示数量是否大于0, timeout设置永远等待
那么就是一个信号量式的等待资源了,实际上某段时间的内核版本里 信号量就是用spin lock和 wait queue来实现

在生产者-消费者模型里,你用信号量 就不合适的,但 wait queue 就可以很好的工作




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2