能力值:
( LV2,RANK:10 )
|
-
-
2 楼
抢个沙发!不错不错,支持一下
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
这样说不知对否?
其实自旋锁用来处理多处理器同步,就如同事件等对象用来处理进程或线程间同步一样:
要做到互斥和同步,必须在需要同步的地方让大家都得先来获得这个独占资源,不能“一厢情愿”
其实处理器也可以视为一个内核对象。。。。
|
能力值:
(RANK:450 )
|
-
-
4 楼
楼主说了这么多 根本就没有说中自旋锁的要害
自旋锁 本来就只是一个很简单的同步机制,在SMP之前根本就没这个东西,一切都是Event之类的同步机制,这类同步机制都有一个共性就是 一旦资源被占用都会产生任务切换,任务切换涉及很多东西的(保存原来的上下文,按调度算法选择新的任务,恢复新任务的上下文,还有就是要修改cr3寄存器会导致cache失效)这些都是需要大量时间的,因此用Event之类来同步一旦涉及到阻塞代价是十分昂贵的
比如 我用一个Event来控制2行代码的原子操作 这个时候一个CPU正在执行这个代码 另一个CPU也要进入 另一个CPU就会产生任务切换 为了短短的两行代码 就进行任务切换执行大量的代码 对系统性能不利 另一个CPU还不如直接有条件的死循环 等待那个CPU把那两行代码执行完
这也就是为什么自旋锁 要调整运行级别 因为另一个CPU可能在死循环不干活 自己必须快点执行完 要快点执行完 就必须保证自己的原子性 因此提高权限关闭中断是必须的
其实windows的自旋锁机制还是很简单的了 linux更复杂 linux提供了更多自旋锁操作方式 尤其是对中断中使用自旋锁的情况 当然一般是不提倡中断中使用自旋锁的
|
能力值:
( LV9,RANK:610 )
|
-
-
5 楼
我主要分析的是自旋锁如何实现,而不是为什么要用自旋锁啊
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我觉得挺不错的。。。。至少分享了他的学习成果
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
有个疑问, windows不是可抢占式内核吗? 代码中并没有提到关于内核抢占的处理。如果在代码在执行临界区的时候, 也就是持有自旋锁的时候, 发生了内核抢占, 另一个进程被重新调度, 而且这个进程也会访问那个临界区, 那样岂不是发生死锁了吗? 至少linux下式需要处理内核抢占的,windows内核不熟悉, 不知道它式怎么处理这个问题的?
|
能力值:
( LV9,RANK:610 )
|
-
-
8 楼
Windows下获取自旋锁时会提升IRQL至DISPATCH_LEVEL,此时当前线程不会被抢占,文中已有说明
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
LZ分析的很好
4楼兄弟说的也很到位,学习了
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
个人觉得写的还不赖
|
|
|