Ban*_*oot 7 linux operating-system linux-kernel
在linux内核中,信号量用于为关键的数据部分提供互斥,而完成变量用于在等待事件的2个线程之间进行同步.为什么不使用信号量进行这种同步?在信号量上使用完成变量有什么好处吗?
Las*_*sse 12
解释为什么最初实现完成:http: //lkml.indiana.edu/hypermail/linux/kernel/0107.3/0674.html
基本的总结是,我们必须通过具有服务员的堆栈上的锁定信号等待某些事件,然后再有服务员做这个(很常见)的方式"下()",这导致它阻塞,直到事它正在等待"up()".
这种方法效果相当不错,但是它在SMP上的竞争非常小(而且非常不可能),与信号量的实现一样,这不是一个想法本身的竞赛.我们可以修复信号量,但有几个原因不能:
- 信号量针对非争用情况进行了优化(故意)."等待完成"用法具有相反的默认情况
- 信号量非常复杂,特定
于体系结构,正是由于这种优化.试图改变它们是痛苦的.所以相反,我引入了"等待完成"的概念:
关于完成与信号量的更新最新信息 http://lkml.org/lkml/2008/4/11/323
您可能希望使用完成而不是信号量有两个原因.首先,多个线程可以等待完成,并且可以通过一次调用释放所有线程complete_all().让信号量唤醒未知数量的线程会更复杂.
其次,如果等待线程要释放同步对象,则在使用信号量时存在竞争条件.也就是说,在唤醒线程完成之前,服务员可能会被唤醒并释放对象up().完成时不存在此种族.(见Lasse的帖子.)
| 归档时间: |
|
| 查看次数: |
6507 次 |
| 最近记录: |