免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1989 | 回复: 5

[内核同步] 信号量和 waite queu的区别 [复制链接]

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
发表于 2013-08-05 11:42 |显示全部楼层
Hi ,all

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

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2013-08-05 13:07 |显示全部楼层
回复 1# firocu
Hi ,all

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



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

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

   

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
发表于 2013-08-05 15:35 |显示全部楼层
我看了,内核semaphore的内核实现源码,并没有wait queue的内容。
作为替代我找到了, struct semaphore_waiter waiter;

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


回复 2# 瀚海书香


   

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
发表于 2013-08-06 10:00 |显示全部楼层
回复 3# firocu


    wait queue的代码实现应该是wait_queue.h(or include/wait.h)那些吧。

论坛徽章:
0
发表于 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)

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

在生产者-消费者模型里,你用信号量 就不合适的,但 wait queue 就可以很好的工作
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP