【问题标题】:Kernel mode preemption内核模式抢占
【发布时间】:2015-03-05 16:05:05
【问题描述】:

我了解新的 linux 内核允许抢占内核空间线程。 有人可以简要解释在内核模式下执行时抢占是如何工作的吗? 因此,当进行系统调用时,软件中断会将线程切换到内核模式并运行必要的程序。 现在,假设它的时间片已经结束——另一个用户线程正在运行,它也想在内核空间中执行。 (或者它可能是一个硬件中断)。 内核在中断时如何维护它为 T1 修改的任何结构的完整性?

【问题讨论】:

  • @shekhar 那确实回答了我的问题。我不是在谈论进程状态 - 我是在谈论在内核模式下被抢占 - 假设您正在更新内核中的某些数据结构
  • 是什么让你“了解新的 linux 内核允许内核空间线程被抢占”?您能否提供有关此假设来源的任何参考?哪个提交github.com/torvalds/linux/commits/master 介绍了它?
  • @xmojmr - "new" 可能不合适,但无论如何这里有一篇文章描述了 2.6 中的新特性 linuxjournal.com/article/7477 "从内核 2.6 开始,内核是可抢占的。现在可以抢占内核任务, 让一些重要的用户应用程序可以继续运行......因此,在 Linux 2.6 下,内核现在可以在任务中途中断,因此其他应用程序可以继续运行”

标签: linux linux-kernel operating-system


【解决方案1】:

Linux 内核保护其数据结构的方式与在多线程环境中运行的任何东西相同。

它可能会使用一些sort of lock 来保护必须以原子方式访问的数据结构。通常,这些包括自旋锁、互斥锁和信号量。

还有disable preemption 的函数,但通常不会显式使用,因为锁定代码会隐式处理。

【讨论】:

  • 感谢代码指针,尤其是“抢占点”,/include/linux/preempt.hpreempt_schedule
  • 事实上,它根据受保护资源的种类使用了几种代码锁(自旋锁、信号量、等待队列等)。
  • 那么死锁是内核中真正的可能性吗?例如,如果它被打断
  • @excalibur 死锁在内核中很可能发生。查看lockdep 了解一些调试方法。
【解决方案2】:

有人可以简单解释一下在内核模式下执行抢占是如何工作的吗?

它就像任何其他上下文切换一样工作。当可抢占代码中发生中断时,CPU 会跳转到相应的中断处理程序并在堆栈上留下一些信息(通常是被中断任务的 RIP/CS/EFLAGS/RSP/SS 寄存器),以便能够返回到前-稍后清空任务。

因此,当进行系统调用时,软件中断会将线程切换到内核模式并运行必要的程序。现在,假设它的时间片已经结束——另一个用户线程正在运行,它也想在内核空间中执行。 (或者它可能是一个硬件中断)。内核在中断时如何维护它为 T1 修改的任何结构的完整性?

让我们调用第一个(被抢占的)任务 T1 和新任务 T2。如果 T1 正在访问某些数据结构,那么 T1 必须首先获取锁。所有可能被多个线程同时访问的内核数据结构都受到锁的保护(几乎)。如果 T2 尝试访问相同的数据结构,那么它将无法获取锁,因为 T1 仍然拥有它,结果 T2 将阻塞并将 CPU 交还给另一个任务。一段时间后,T1 将再次开始执行,释放它的锁,再次休眠,切换回 T2,T2 获取锁,做它的事情,释放锁,等等。

如果多个线程尝试同时访问相同的受保护数据,通常只有第一个线程可以访问,所有其他线程都必须等待。

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2014-08-25
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多