Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用户和内核模式下的线程_C_Multithreading_Operating System - Fatal编程技术网

C 用户和内核模式下的线程

C 用户和内核模式下的线程,c,multithreading,operating-system,C,Multithreading,Operating System,线程在用户模式下运行和内核模式下运行是什么意思?这与用户模式的线程执行指令和内核模式的线程执行指令有关吗?请详细说明。 另外,如果一个线程在用户模式下执行时被置于挂起状态,那么它可能会在内核模式下开始执行吗?如果是,怎么可能?到目前为止,我只知道一个挂起的线程将被完全挂起,即CPU将进行上下文切换来调度另一个线程。现代操作系统具有硬件支持,用于将用户代码与内核代码分离。在x86体系结构上,您可以设置正常用户代码无法访问的内存页,并触发页面错误,以便操作系统能够在出现错误的程序中生存 在内核模式下

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

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

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

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

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

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

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

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

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

到目前为止,我只知道一个线程如果被挂起将被完全挂起,也就是说,上下文切换将由CPU来安排另一个线程


对,这就是内核代码。因此,同一个核心运行用户空间代码,然后运行内核代码,然后运行另一个线程的用户空间代码。

但我仍然对切换这两个代码感到困惑…请参阅我问题的第二部分…正如我所说,细节是特定于硬件的。对于X86体系结构,内核通常应该在具有最高权限的环0中运行。用户代码在环3中运行。在Windows AFAIK中,环1,2不在IMO中使用。保护是通过具有控制结构来实施的,该控制结构告诉CPU允许的权限级别。这可能包括禁止各种指令以及内存保护。有关如何在X86架构上切换的详细说明,请在谷歌上搜索“受保护模式切换”或参阅《英特尔程序员手册》。您好,Devlus,谢谢您的解释。然而,这种困惑仍然存在。我对这种悬而未决的情况感到抱歉。现在,在阅读了你的回答之后,我的问题是这两种模式是什么?它们有何不同?它们包含哪些内容?考虑到我的上下文与用户模式同步和内核模式同步有关。为什么会这样,因为一些博客说,当在用户模式下执行时,它比内核模式快,而且切换b/w这些模式也需要一些时间。所以问题是,为什么这两种模式,它们包含什么,以及这两部分代码在地址空间中的什么位置被加载。不幸的是,术语“用户模式线程”或“内核模式线程”在多个上下文中有多个定义。例如,“用户模式线程”可以指由用户空间调度器调度的线程,也可以指在用户空间中运行的线程。在这种情况下,我的问题是这两种模式是什么?它们有何不同?它们包含什么?感谢David的回复。我很抱歉这样挂了。现在,在阅读了你的回答之后,我的问题是这两种模式是什么?它们有何不同?它们包含哪些内容?考虑到我的上下文与用户模式同步和内核模式同步有关。为什么会这样,因为一些博客说,当在用户模式下执行时,它比内核模式快,而且切换b/w这些模式也需要一些时间。所以问题是,为什么这两种模式,它们包含什么,以及这两部分代码在地址空间中的什么位置被加载。