bjab
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2011-06-07
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望35点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:4277回复:22

只能用spinlock来解决问题?

楼主#
更多 发布于:2008-01-12 16:22
请问内核对象:Event(事件),Mutex(互斥量), Semaphore(信号灯)等是否不能用在多CPU场合,只能用spinlock来解决问题?
zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-01-12 17:07
引用楼主bjab于2008-01-12 16:22发表的 只能用spinlock来解决问题? :
请问内核对象:Event(事件),Mutex(互斥量), Semaphore(信号灯)等是否不能用在多CPU场合,只能用spinlock来解决问题?


是啊,只有spinlock是用于多CPU同步的
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2008-01-12 20:15
方法很多,执行体资源,临界区,push lock 等等都可以
驱动开发者 呵呵
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
地板#
发布于:2008-01-12 20:16
在WIN2000中微软大部分使用spinlock来解决同步问题
后来在XP中使用了push lock(支持读或写共享访问),使系统效率得到了较大提升,同时也不用提升到DPC level,不过push lock没有提供相应接口,驱动中的话,可以使用执行体资源,效果很好
驱动开发者 呵呵
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2008-01-12 22:06
引用楼主bjab于2008-01-12 16:22发表的 只能用spinlock来解决问题? :
请问内核对象:Event(事件),Mutex(互斥量), Semaphore(信号灯)等是否不能用在多CPU场合,只能用spinlock来解决问题?


这些在多核环境中都可以用。
zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2008-01-12 22:07
WQXNETQIQI 受教了
 

我还以为只有spin lock这东西能用于多CPU同步,
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2008-01-12 22:26
唉,WQXNETQIQI 答非所问,还是我来说说吧。

Event之类的可等待内核对象完全可以用在多CPU上。

楼主的误解恐怕源于DDK文档片面强调SpinLock适用于多CPU这一点。

实际上SpinLock和Event不是一个层次的东西。前者主要用于保证原子操作,后者才是用于同步的,而且后者的实现依赖前者。

在单CPU上,等待对象的内部实现用提升IRQL到DISPATCH_LEVEL的办法保证原子操作,而多CPU用的是SpinLock。所以不管单CPU还是多CPU,Event就是Event,用法一样。

可等待内核对象的限制是不能在DISPATCH_LEVEL上被等待,此时SpinLock才用来替代它们实现“同步”操作。
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2008-01-12 22:59
楼主想问应该是“如何在多CPU上不用SPINLOCK实现数据同步”才对吧?

spinlock对效率有较大损耗,因此多CPU上尽量使用执行体资源或push lock~~

event只能用来做自己的线程间的同步,只有执行体资源、PUSHLOCK或SPINLOCK才可以用做系统所有线程间的数据同步!

SpinLock做非dispatch_level下的同步也很常用,win2000中很多非dispatch_level的数据同步也是用spinlock实现的
驱动开发者 呵呵
rangzh
驱动小牛
驱动小牛
  • 注册日期2005-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望150点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-01-13 20:21
视优先级而定吧

假如你需要同步的代码有一些可能在DISPATCH_LEVEL,那么就应该用SpinLock了
bjab
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2011-06-07
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望35点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-01-14 10:32
我在内核线程中使用KeWaitForSingleObject等待KMutex对象,导致计算机重启动,但单CPU下运行正常,不知为什么?还望各位大侠指教。
bjab
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2011-06-07
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望35点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-01-14 11:38
那么是说像mutex这样的内核对象也能用于多CPU多线程之间的同步?还有,执行体资源怎么用?
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2008-01-14 14:35
引用第7楼WQXNETQIQI于2008-01-12 22:59发表的  :
楼主想问应该是“如何在多CPU上不用SPINLOCK实现数据同步”才对吧?

spinlock对效率有较大损耗,因此多CPU上尽量使用执行体资源或push lock~~

event只能用来做自己的线程间的同步,只有执行体资源、PUSHLOCK或SPINLOCK才可以用做系统所有线程间的数据同步!

做非dispatch_level下的同步也很常用,win2000中很多非dispatch_level的数据同步也是用spinlock实现的
.......


1,楼主问的并不是“如何在内核实现高效的读写锁”,只是同步的话,一般的可等待对象都可以啊。你扯出执行体资源和PushLock,当然不切题。

2,都说了,SpinLock和Event之类的可等待对象(包括执行体资源)不是一个层次的东西,不要片面的比较。

3,何谓“系统所有线程”?你倒是用执行体资源让你的线程和系统的延迟写线程同步一下试试。别的线程不和你的线程用同个可等待对象,你怎么同步?用同一个对象的话,Event也一样可以,只是同步的方式不同而已:Event是事件,Mutex是互斥,ERESOURCE是读写锁。

4,对少量数据做简单操作时,当然用SpinLock比较高效。SpinLock实现的原子操作可以看作轻量级的“同步”,你要认定这就是一种同步那也无所谓。
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2008-01-14 14:39
引用第9楼bjab于2008-01-14 10:32发表的  :
我在内核线程中使用KeWaitForSingleObject等待KMutex对象,导致计算机重启动,但单CPU下运行正常,不知为什么?还望各位大侠指教。


用虚拟机自己调试一下看看啊。
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2008-01-14 14:44
引用第10楼bjab于2008-01-14 11:38发表的  :
那么是说像mutex这样的内核对象也能用于多CPU多线程之间的同步?还有,执行体资源怎么用?


当然可以,DDK里的源代码没有分单CPU和多CPU两个版本吧,所以Event就是Event。

执行体资源就是ERESOURCE,用法就不用问了吧,自己查DDK文档嘛。
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-01-15 21:51
SpinLock:就像n多人早上抢一个厕所,谁能先进去把门锁上就是谁的。

Event:当侧所里的人出来后,大家可以抢了。
zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2008-01-16 09:55
引用第14楼GoodOnline于2008-01-15 21:51发表的  :
SpinLock:就像n多人早上抢一个厕所,谁能先进去把门锁上就是谁的。

Event:当侧所里的人出来后,大家可以抢了。



很形象,哈哈
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2008-01-16 12:55
引用第14楼GoodOnline于2008-01-15 21:51发表的  :
SpinLock:就像n多人早上抢一个厕所,谁能先进去把门锁上就是谁的。

Event:当侧所里的人出来后,大家可以抢了。



Event也分Synchronous和Notification的
ks12345
驱动小牛
驱动小牛
  • 注册日期2006-09-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望223点
  • 贡献值0点
  • 好评度189点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-01-31 12:13
引用第16楼AlexSho于2008-01-16 12:55发表的  :



Event也分Synchronous和Notification的

两者的区别是虾米呢?
Synchronous 的 Event 是不是只满足多个 wait 线程中的一个,其他继续 wait 啊?
Thinking
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2008-01-31 16:13
引用第7楼WQXNETQIQI于2008-01-12 22:59发表的  :
event只能用来做自己的线程间的同步,只有执行体资源、PUSHLOCK或SPINLOCK才可以用做系统所有线程间的数据同步!
.......


比如用IoCreateNotificationEvent创建一个命名事件,不是各个驱动之间也可以相互同步了吗?
张帆的内核学习论坛 http://bbs.kerneldev.com
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
19楼#
发布于:2008-01-31 16:17
ANY LEVEL SPIN_LOCK也有人实现了~哈哈
没有战争就没有进步 X3工作组 为您提供最好的军火
上一页
游客

返回顶部