【问题标题】:Threads in User and kernel mode用户模式和内核模式下的线程
【发布时间】:2013-07-05 03:19:15
【问题描述】:

线程在用户模式下运行和在内核模式下运行是什么意思?这与用户模式的线程执行指令和内核模式的线程执行指令有关吗?请详细说明。 另外,如果在用户模式下执行的线程被置于挂起状态,那么它是否可能开始在内核模式下执行?如果是,怎么可能?到目前为止,我只知道一个线程如果挂起将被完全挂起,即 CPU 将进行上下文切换以调度另一个线程。

【问题讨论】:

  • 不幸的是,术语“用户模式线程”或“内核模式线程”在多个上下文中有多个定义。例如,“用户模式线程”可能意味着由用户空间调度程序调度的线程,也可能意味着在用户空间中运行的线程。
  • 在这种情况下,我的问题是这两种模式是什么?它们有何不同以及它们包含什么?

标签: c multithreading operating-system


【解决方案1】:

线程运行在用户模式和内核模式是什么意思?

没有上下文就无法知道一个人所说的短语是什么意思。如果我不得不猜测,我会说他们正在谈论线程是由用户空间调度程序还是内核调度程序调度的。但也有可能他们实际上是在询问线程是在运行用户代码还是内核代码。

这是否与用户模式的线程执行指令和内核模式的线程执行指令有关?请详细说明。

可能是这样。也可能不是。没有上下文就无法知道一个人所说的短语是什么意思。

另外,如果在用户模式下执行的线程被置于挂起状态,那么它是否可能开始在内核模式下执行?如果可以,怎么可能?

对于内核调度线程的实现,调度程序在内核空间中运行。实际挂起线程的代码通常也在内核空间中运行,因为它必须将线程添加到各种内核调度程序数据结构中。所以恢复线程的线程也将在内核空间中运行。在更高级别的视图中,同一个执行线程可以“成为”内核调度程序,选择一个用户空间线程来执行,然后“成为”那个线程。

到目前为止,我只知道一个线程如果挂起将被完全挂起,即 CPU 将进行上下文切换以调度另一个线程。

没错,这就是内核代码。所以同一个内核运行用户空间代码,然后运行内核代码,然后运行另一个线程的用户空间代码。

【讨论】:

  • 感谢大卫的回复。我很抱歉这个悬而未决的上下文。现在,在阅读您的回复后,我的问题是这两种模式是什么?它们有何不同以及它们包含什么?考虑到我的上下文与用户模式同步和内核模式同步有关。为什么会这样,因为一些博客说在用户模式下执行时它比内核模式更快,并且在黑白切换这些模式需要一些时间。所以问题是,为什么这两种模式,它们包含什么,以及这两部分代码在地址空间中的什么位置被加载。
【解决方案2】:

现代操作系统具有将用户代码与内核代码分离的硬件支持。在 x86 架构上,您可以设置普通用户代码无法访问的内存页面,并会触发页面错误,以便操作系统可以在错误程序中生存。

在内核模式下运行的代码具有更高的权限,但也有更多的责任,因为并非所有内容都像从用户空间一样容易访问。如果用户代码卡住了,那么操作系统可以清理它。如果内核模式代码挂起,可能就没那么容易了,这取决于权限级别有多高。

【讨论】:

  • 但我仍然对这两个代码的黑白切换感到困惑......请参阅我问题的第二部分......
  • 正如我所说,细节是特定于硬件的。对于 X86 架构,通常内核应该运行在具有最高权限的 ring 0 中。用户代码在环 3 中运行。在 Windows AFAIK 中,环 1,2 未使用 IMO。保护是通过控制结构来实施的,它告诉 CPU 允许哪个特权级别。这可以包括禁止各种指令以及内存保护。有关如何打开 X86 架构的详细说明,您应该在谷歌上搜索“保护模式切换”或参考英特尔程序员手册。
  • 您好 Devolus,感谢您的解释。但是混乱仍然存在。
  • 我很抱歉这个悬而未决的上下文。现在,在阅读您的回复后,我的问题是这两种模式是什么?它们有何不同以及它们包含什么?考虑到我的上下文与用户模式同步和内核模式同步有关。为什么会这样,因为一些博客说在用户模式下执行时它比内核模式更快,并且在黑白切换这些模式需要一些时间。所以问题是,为什么这两种模式,它们包含什么,以及这两部分代码在地址空间中的什么位置被加载。
猜你喜欢
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2012-04-05
  • 2011-06-23
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多