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

0 linux kernel

我不确定,我是否完全理解上述差异,所以我想自己解释一下,你可以打断我,因为我弄错了:“内核是创建内核线程。内核线程是由内核管理的进程。用户线程是进程的一部分。如果您有一个单线程进程,那么整个进程本身就是一个用户线程。用户线程进行系统调用这个系统调用由属于调用用户线程的特定内核线程提供服务。因此,对于进行系统调用的每个用户线程,都会创建一个内核线程,并且在内核线程完成其工作后,它将控制权交还给用户线程,然后内核线程被销毁。”

这样可以吗?

谢谢你!

来自德国的许多问候!

roo*_*oot 6

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

什么是内核?

内核基本上只是一块内存。它有足够的特权可以在其他任何东西之前加载,从而允许它设置 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 端口和硬件内存。

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

内核线程

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