【问题标题】:Userspace process preempts kernel thread?用户空间进程抢占内核线程?
【发布时间】:2012-01-17 04:56:47
【问题描述】:

目前我正在阅读“了解 Linux 内核,第 3 版”,在第 22 页我可以阅读:

在最简单的情况下,CPU 从 第一条指令到最后一条。然而,当下列事件之一发生时, CPU 交错内核控制路径:

  • 在用户模式下执行的进程调用系统调用,相应的 内核控制路径验证请求不能立即得到满足;它 然后调用调度程序来选择一个新的进程来运行。结果,一个过程 发生切换。第一个内核控制路径未完成,CPU 恢复某些其他内核控制路径的执行。在这种情况下,两人 控制路径代表两个不同的进程执行。

内核控制路径可以从执行系统调用的用户空间进程中中断吗? 我认为优先级非常重要:

  • 中断
  • 内核线程
  • 用户空间进程

我检查了勘误表,但找不到任何关于此的内容。

【问题讨论】:

  • 感谢乔纳森的编辑。这对我来说是新事物。
  • NP:在您输入问题时可以获得帮助,但需要一点经验才能自动完成。在您在这里待了几年之后(实际上,一个月左右可能就足够了),您会在没有想太多的情况下对其进行格式化。

标签: c linux


【解决方案1】:

您对优先级列表的看法是对的,但是(我认为)这本书想要表达的是:

  • 当(用户)进程进行系统调用时,内核开始代表它执行。
  • 如果系统调用可以完成(内核控制路径没有遇到障碍),那么通常会直接返回调用进程——想想getpid()函数调用。
  • 另一方面,如果系统调用无法完成(例如,因为磁盘系统必须将一个块读入内核缓冲池,然后才能将其数据返回给调用进程),那么调度程序用于选择要运行的新进程 - 抢占(代表该用户进程运行的控制内核线程)。
  • 在适当的时候,原始系统调用将能够继续,并且原始(代表系统运行的控制内核线程)用户进程将能够继续并最终完成,将控制权返回给用户空间进程在用户空间而不是内核中运行。

所以“否”:“内核路径不会被执行系统调用的用户空间进程中断”。

内核路径在代表用户空间进程执行系统调用时可能会被中断,因为:发生中断,或者内核路径必须等待资源变得可用,或者...

【讨论】:

  • 很好的答案。即使我不是流利的英语演讲者/读者,我仍然认为他们可以更好地描述这种情况。也许聘请你作为合著者? :)
  • 也许他们会注意到这一点并在第 4 版中修复它?
  • @JonathanLeffler:我很好奇硬件在进行上下文切换时如何切换模式。例如一个进程调用 fread()。这会导致中断,将 CPU 从用户模式切换到内核模式。但是磁盘驱动器很忙。因此调度程序决定运行一个新进程。但是,此过程可能处于用户模式。内核如何再次将 CPU 从内核态变为用户态?可能是中断? P.S:我指的是同一本书,也有类似的疑问。如果我的上述理解有误,请告诉我。
  • @ChethanRavindranath:我没有读过有问题的书,所以我不能保证我所说的与他们所说的一致。从用户空间到内核空间的切换是通过一条硬件指令完成的,该指令保存了足够多的原始上下文(程序计数器(P)、堆栈指针(SP),可能但可能不是其他一些寄存器),然后运行内核模式代码在继续进行适当的内核模式活动之前完成保存上下文(其他寄存器)。 [...继续...]
  • [...continuation...] 从内核模式切换回用户模式恰恰相反;恢复保存的寄存器,然后使用适当的硬件指令将 PC 和 SP 恢复到用户代码停止的位置。这是每次进行系统调用或发生中断时都会发生的事情,并且必须影响用户空间进程。它通常还涉及一些小的汇编代码sn-ps;它不是可以在大多数机器上用 C(例如)编写的东西。
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2020-03-18
  • 2015-03-05
相关资源
最近更新 更多