内核,内核线程和用户线程之间的区别

时间:2019-07-23 09:11:05

标签: linux kernel

我不确定,如果我完全理解上述差异,那么我想自己解释一下,就我所知,您可以打扰我: “内核是创建内核线程的初始代码。内核线程是由内核管理的进程。用户线程是进程的一部分。如果您有单线程进程,那么整个进程本身就是一个用户线程。用户线程进行系统调用,并且该系统调用由属于调用用户线程的特定内核线程提供服务,因此对于进行系统调用的每个用户线程,内核线程是创建并在内核线程完成其工作之后,将控制权交还给用户线程,然后销毁内核威胁。”

这样可以吗?

谢谢!

许多来自德国的问候!

2 个答案:

答案 0 :(得分:0)

您正在混淆一些稍微不同的概念。

要遵循您写的内容,有一个内核,它是一段代码,用于处理操作系统的所有内部操作。它确实创建了内核线程,但是内核线程没有什么特别的。它们只是在“内核模式” 中运行的线程,并且不与任何“ User-Mode” 进程相关联。

现在,您的解释中缺少一个概念,这是更好地理解它的关键。内核模式(或有时称为系统模式),以及用户模式组成可用于OS的CPU模式。

内核模式是一种受信任的执行模式,它允许代码访问任何内存并执行任何指令。它处理I / O和系统中断。

用户模式是一种受限模式,该模式不允许执行代码访问与用户模式进程关联的内存地址以外的任何内存地址。

用户模式也无法访问I / O或许多与操作系统相关的功能(例如句柄或进程创建)。对于这些操作,用户模式代码应通过系统调用(如您正确提到的那样)调用到内核模式。

系统调用是一种特殊的CPU指令,它将CPU模式切换为内核模式,并开始执行由OS提供的特殊代码,该代码将分派不同的系统调用。因此,这意味着没有为内核模式线程安排工作,而是在同一用户模式线程的上下文中执行OS(内核/受信任)代码。唯一发生的是CPU模式更改为内核模式。

关于在内核线程中完成作业,我应该说,尽管在某些情况下,某些操作(例如I / O)可能被安排为单独的内核线程来完成,但是该内核在系统调用过程中不会创建和销毁线程。

支持者: 超过10年的驾驶员开发经验

也: http://www.linfo.org/kernel_mode.html

https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode

答案 1 :(得分:0)

对于内核与用户,我认为这不是一个很好的思维模型。我认为查看这些抽象的实现以充分理解它们很有用:

什么是内核?

内核基本上只是一块内存。它有足够的特权可以先加载,从而可以设置CPU的中断向量。

中断控制所有内容,包括I / O,计时器和虚拟内存。这意味着内核可以决定如何处理所有内容。

一个库也只是一块内存,您可以很好地将内核视为“系统调用库”。但是因为内核代表硬件,所以内存在每个人之间都是共享的。

内核模式与用户模式

内核模式是CPU的“自然”模式,没有任何限制(在x86 CPUS上为“ ring 0”)。用户模式(在x86 CPU上为“环3”)是指当使用某些指令或访问某些内存位置时,指示CPU触发中断。这样,当用户尝试访问内核内存或代表I / O端口的内存或硬件内存(例如GPU的帧缓冲区)时,内核就可以让CPU执行特定的内核代码。

进程和线程

进程也是一块内存,由它自己的堆和库使用的内存组成,其中包括内核。

一个线程(=一个调度单元)只是一个堆栈,其堆栈具有内核知道并跟踪的ID。那是线程运行时CPU使用的调用堆栈。用户线程有2个堆栈:一个用于用户模式,一个用于内核模式-但是它们仍然具有相同的ID。

由于内核控制计时器,因此它将计时器设置为关闭。每1毫秒。当计时器触发时(“计时器中断”),CPU运行内核为该中断设置的回调,在该回调中,内核可以看到当前线程已经运行了一段时间,并决定取消调度,而调度另一个线程

虚拟内存上下文

“虚拟内存上下文”是指CPU可以访问的所有内存。这包括进程的所有内存-包括用户模式堆和库的内存,所有进程线程的用户模式调用堆栈,系统中所有线程的内核模式堆栈,内核的堆内存,I / O端口,以及硬件内存。

当发生中断或系统调用时,虚拟内存上下文不会更改,仅将CPU标志翻转(即从环3转到环0),并且CPU现在返回其“自然”内核模式,其中它可以自由访问内核内存,I / O端口和硬件内存。

创建新进程时,实际发生的情况是创建了一个新线程,并为其分配了新的虚拟内存上下文。因此,每个进程都从单线程开始。该线程以后可以通过系统调用要求内核创建更多共享虚拟内存上下文(=进程)的线程(=堆栈),或要求内核创建更多线程,每个线程都具有一个新的虚拟内存上下文(=新进程)。 )。

内核线程

与任何其他库一样,内核可以具有自己的后台线程以进行优化。当出现这种需求时(在为系统调用提供服务时,任何进程的内存上下文中都可能发生这种情况),内核将创建新线程并为它们提供特殊的内存上下文,该上下文仅包含内核内存,而没有访问任何进程的内存。