问题前稍微讨论一下。Linux 2.4 内核是非抢占式的,所以如果我们在内核模式下进行系统调用时需要进行上下文切换,我们只需执行 set_need_resched 来引发一个标志,然后当我们返回用户模式时,我们检查标记并进行上下文切换。
让我们将其与具有抢占式内核的 linux 2.6 进行比较。我们不能只取 2.4 的内核并将 set_need_resched(提升标志)更改为 schedule()(重新调度的指令执行),因此在 linux 内核 2.6 中有一个计数器 preempt_count,它每次在 spin_lock() 上增加并在自旋解锁()。
实际上,这个字段“preempt_count”决定了内核是否可以被抢占。例如,在从时钟中断返回时,如果条件:
(current->need_resched == 1) && (current->preempt_count == 0)
为真,则内核执行上下文切换。
问题是为什么 linux 2.6 的内核在持有自旋锁类型的锁时会阻止抢占。
如果内核不阻止抢占,可能会发生什么情况?你能给我一个尽可能详细的具体例子吗?
谢谢你。