【问题标题】:What exactly is a kernel thread and how does it work with processes?内核线程到底是什么,它如何与进程一起工作?
【发布时间】:2013-04-25 16:54:42
【问题描述】:

据我了解,用户线程是由用户从库中创建并在用户空间中管理的。一个进程可以包含一个或多个用户线程,而内核不知道它们。

那么什么是内核线程?它们是类似于进程还是包含在类似于用户线程的进程中?

另外,我看到了用户线程映射到内核线程的图表。这在执行方面究竟是如何工作的?内核是否调度内核线程并执行映射到该线程的用户线程?

【问题讨论】:

  • “一个进程可以包含一个或多个用户线程,而内核不知道它们。”不是真的——内核知道用户级线程,这就是它如何给它们不同的ID。 (例如,参见 Windows。)我认为这可能更像是一个术语,尤其是对于 *nix 系统。

标签: operating-system


【解决方案1】:

是的,内核线程与进程非常相似。事实上,现代操作系统模糊了线程和进程之间的区别。在 Linux 中,clone 系统调用可用于创建线程(相同的 PID、相同的地址空间、相同的文件描述符表等)或进程(不同的 PID 等)或介于两者之间的任何东西。

(FreeBSD 有一个类似的系统调用 rfork,它概括了 fork。我认为统一线程和进程的想法起源于计划 9。)

【讨论】:

  • 先生,类似的问题,当用户线程进行系统调用时,映射到它的内核线程是否会被执行并通过该内核线程返回系统调用的结果?
  • @user1773070:我猜取决于操作系统。这听起来像是一个合理的实施策略,但我不太确定 Linux 或其他操作系统是如何做到这一点的。
  • @Instinct 是的!这就是为什么在大多数现代操作系统中用户和内核线程之间存在一对一的映射。 “绿色线程”/“纤维”是仅限用户空间的线程(破坏了一对一的属性),通常它们将系统调用分配给仅用于 I/O 的线程池。每个 I/O 线程都有一个要匹配的 OS 线程,以便它们可以运行系统调用。
【解决方案2】:

从这里Relationship between a kernel and a user thread

当他们说 map 时,他们的意思是每个内核线程都分配给一个 一定数量的用户模式线程。

内核线程用于为应用程序提供特权服务 (如系统调用)。内核也使用它们来跟踪 系统上正在运行的所有内容,有多少资源 分配给什么进程,并做调度。

如果您的应用程序大量使用系统调用,那么用户越多 每个内核线程的线程数,您的应用程序运行速度越慢, 因为内核线程会成为瓶颈,因为所有系统 调用会通过它。

但另一方面,如果您的程序很少使用系统调用 (或其他内核服务),可以分配大量用户 线程到内核线程没有太多的性能损失,其他 比开销。

您可以增加内核线程的数量,但这会增加开销 到一般的内核,所以虽然单个线程会更多 响应于系统调用,系统作为一个整体将 变慢。

这就是为什么在数字之间找到一个良好的平衡很重要 内核线程数和每个内核线程的用户线程数。

另见此处: What is the difference between kernel threads and user threads?

内核线程和用户线程有什么区别?

内核线程具有特权,可以访问用户模式线程无法访问的内容。看看维基百科上的“Ring (Computer Security)”。在 Windows 上,用户模式对应 Ring 3,内核模式对应 Ring 0。

用于创建内核线程的技术有哪些?

这非常依赖于操作系统。

现在在用户级线程的情况下,这个TCB是在用户的地址空间中创建的吗?

TCB 记录有关内核在运行该线程时使用的线程的信息,对吗?所以如果它被分配在用户空间,用户模式线程可以修改或破坏它,这似乎不是一个好主意。那么,您不认为它是在内核空间中创建的吗?

这些型号是什么?这些模型在实际中是如何使用的?

Wikipedia 似乎很清楚这一点。

【讨论】:

  • 感谢您的回复。我对内核线程的执行方式仍然有些困惑。当用户线程进行系统调用时,映射到它的内核线程是否被执行并通过该内核线程返回系统调用的结果?而且,内核线程不在进程内部吗?那么它们是否类似于流程?
  • 我们在谈论什么类型的系统架构?
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 2011-08-02
  • 2021-12-09
  • 2010-11-24
  • 2019-11-28
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多