- 论坛徽章:
- 3
|
本帖最后由 captivated 于 2012-06-03 06:54 编辑
回复 8# firkraag
嗯... 基本同意你的看法, 以下是我个人的想法, 请指正:
1. LZ给的代码好像就是某个内核函数的实现? 可以想像, 调用这个函数的时候, 是在内核进程上下文中.
2. preempt_disable()的实现是增加preempt_count:
#define preempt_disable() \
do { \
inc_preempt_count(); \
barrier(); \
} while (0)
内核抢占在抢占之前都会检查 preempt_count, 如果 preempt_count 不为 0 则无法抢占.
3. 内核抢占发生的时机是在中断处理程序完成返回内核空间之前(或者显式地调用schedule()). 既然禁止了本地处理器的所有中断, 意味着时钟中断也是禁止的. 这样的话本地处理器上的内核调度根本没机会发生.
4. 个人猜测, 在smp系统上, 考虑到其它处理机的存在, 其它的处理器是可以调度的. 虽然某种程度上来说, 每个处理器只会调度自己的task队列, 但是考虑到这里处于内核空间(加上处理器负载均衡之类的?...) -- 因此其它的处理器可能有机会调度到这里并接着执行余下的代码? -- 由于其它的处理器并没有禁止中断, (假设这里没有preempt_disable的话)又发现preempt_count不为0, 所以可能发生调度?
期待正解ing... |
|