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