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 就可以很好的工作
页: [1]
查看完整版本: 信号量和 waite queu的区别