为什么操作系统需要/维护内核线程?

时间:2014-10-12 11:32:34

标签: c multithreading linux-kernel kernel

以下是我遇到的三种线程模型。 基于以下3种体系结构,对于我来说,除了作为POSIX.1C的一部分引入的用户线程之外,还有一些称为内核线程的新内容。

这是1-1模型

enter image description here

这是N-1型号。

enter image description here

这是混合型号。

enter image description here

对于内核线程,我经历了很多关于SO的问题。这看起来更相关link以便澄清。

在进程级别,对于Linux加载程序(例如)加载的每个用户进程,内核不会为执行用户进程提出的机器指令分配相应的内核进程。用户进程只需要内核模式执行,当它需要来自内核模块的工具时[如malloc()/ fork()]。用户进程的调度由OS调度程序完成,并分配CPU核心。

例如,用户进程不需要内核执行模式来执行指令

a=a+2;//a is my local variable in a user level C function

我的问题:

1) 那么,内核级线程的目的是什么?为什么操作系统需要为用户级进程的相应用户线程维护内核线程(另外)?用户模式编程器是否可以通过编程为给定用户进程选择上述三种线程模型中的任何一种?

在我理解了第一个问题的答案之后,一个相关的补充是,

2)  内核线程实际上是由OS调度程序调度的,而不是用户线程调度的吗?

2 个答案:

答案 0 :(得分:3)

  

那么,内核级线程的目的是什么?

提供用于分配OS提供的一组资源的工具。该集总是在核心上执行CPU代码执行。其他可能包括磁盘,NIC,KB,鼠标,定时器,这可能是系统调用从线程请求的。内核管理对这些资源可用时的访问,并在资源冲突之间进行仲裁,例如。当没有可用的KB输入请求将从线程中删除CPU执行,直到KB输入可用。

  

为什么我们需要相应用户的内核线程(另外)   用户级进程的线程?

如果没有内核级线程,用户线程将无法获得执行 - 它将是死代码/堆栈。请注意,对于Linux,线程/进程的概念可能会有些混乱,但是,基本的执行单元是一个线程。进程是一个更高级别的构造,其代码必须至少由一个线程运行(例如,OS加载程序在第一次加载时在进程入口点运行代码)。

  

用户模式编程人员是否可以选择任何一个   以上三个线程模型,用于给定的用户进程   编程?

不,没有系统调用,这意味着离开用户模式。

  

内核线程是否实际上是由OS调度程序调度的,而不是用户调度的   螺纹

是的 - 只有当它可以使用它时才能执行它,当它不能执行时执行被删除,并且如果操作系统调度程序需要其他东西,则需要先抢占CPU。

答案 1 :(得分:2)

我认为在这些数字中使用内核线程这个词有点误导。我知道一本关于操作系统(设计)的书中的数字,如果我没记错的话,它们指的是操作系统如何安排工作的方式。 在图中,每个进程至少分配了一个由内核调度的内核线程

N-1模型显示内核根本不知道的多个用户域线程,因为后者调度了进程(或者如图所示,单个内核线程)。因此对于内核,每个进程都是一个内核线程。当为进程分配一段处理器时间时,它本身会根据自己的判断安排多个线程。

1-1模型中,内核知道用户域线程,并且调度程序会考虑为每个线程分配处理器时间。因此,内核不是调度整个进程,而是在进程内的线程之间切换。

混合模型结合了两个原则,其中轻量级进程实际上是内核已知的线程,并且计划由它执行。此外,它们实现了内核不知道的线程,并在用户区中分配处理器时间。

现在要完全混淆,Linux中实际上有一个真正的kernel thread。但据我理解这个概念,这些线程仅用于内核空间操作,例如当内核模块需要并行执行时。