什么是内核线程,它如何与进程一起工作?

5
根据我的理解,用户线程是由用户从库中创建并在用户空间中管理的。一个进程可以包含一个或多个用户线程,而内核对它们没有意识。
那么内核线程是什么呢?它们与进程类似还是与用户线程类似被包含在进程中?
此外,我看到了用户线程映射到内核线程的图表。就执行方面而言,这到底是如何运作的呢?内核调度一个内核线程并执行映射到该线程的用户线程吗?

一个进程可以包含一个或多个用户线程,内核并不知道它们的存在。实际上,内核知道用户空间线程,这就是它能够给它们分配不同的ID的原因(例如Windows)。我认为这可能更多是术语问题,特别是对于*nix系统来说。 - user541686
2个回答

3
是的,内核线程与进程非常相似。实际上,现代操作系统模糊了线程和进程之间的区别。在Linux中,clone系统调用可用于创建线程(相同的PID、相同的地址空间、相同的文件描述符表等)或进程(不同的PID等),或者介于两者之间的任何东西。
(FreeBSD有一个类似的系统调用rfork,它概括了fork。我认为统一线程和进程的想法起源于Plan 9。)

1
先生,您和我有类似的问题, 当用户线程发起系统调用时,与之对应的内核线程是否会被执行,并通过该内核线程返回系统调用的结果? - Instinct
@user1773070:我猜这取决于操作系统。这听起来是一种可行的实现策略,但我不太确定Linux或其他操作系统是如何做到这一点的。 - Fred Foo
@Instinct 是的!这就是为什么在大多数现代操作系统中,用户线程和内核线程之间存在一对一的映射。 "绿色线程" / "纤程" 是仅限于用户空间的线程(它们打破了一对一的属性),通常将其系统调用分配给仅用于I/O的线程池。每个I/O线程都有一个匹配的操作系统线程,以便它们可以运行系统调用。 - Dan

1

从这里开始: 内核与用户线程之间的关系

当他们说“映射”时,他们的意思是每个内核线程被分配给一定数量的用户模式线程。 内核线程用于为应用程序提供特权服务(如系统调用)。它们也被内核用于跟踪系统上正在运行的所有内容,分配给哪个进程多少资源以及进行调度。 如果您的应用程序频繁使用系统调用,则每个内核线程的用户线程越多,您的应用程序运行得越慢,因为所有系统调用都将通过内核线程传递,成为瓶颈。 但另一方面,如果您的程序很少使用系统调用(或其他内核服务),则可以将大量用户线程分配给一个内核线程而不会有太多性能损失,除了开销之外。 您可以增加内核线程的数量,但这会增加内核的开销,因此虽然单个线程在处理系统调用方面更具响应性,但整个系统的速度会变慢。 这就是为什么重要的是要找到内核线程数和每个内核线程的用户线程数之间的良好平衡。

还可以看看这里: 内核线程和用户线程有什么区别?

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

内核线程是特权级别的,可以访问用户模式线程无法访问的内容。可以查看维基百科上的 "Ring (Computer Security)"。在Windows中,用户模式对应于Ring 3,而内核模式对应于Ring 0。

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

这取决于操作系统。

现在就用户级线程而言,TCB是在用户地址空间中创建的吗?

TCB记录了内核用于运行该线程的信息,对吧?如果它分配在用户空间中,用户模式线程可能会修改或破坏它,这似乎不是一个好主意。那么,你认为它是在内核空间中创建的吗?

这些模型是什么?这些模型如何实际应用? Wikipedia 对此非常清楚。

谢谢您的回复。我仍然有点困惑内核线程是如何执行的。当用户线程进行系统调用时,映射到它的内核线程是否会被执行,并通过该内核线程返回系统调用的结果?此外,内核线程不在进程内吗?那么它们与进程类似吗? - Instinct
我们在谈论什么类型的系统架构? - Jordan
这只涉及用户线程和内核线程,但并没有澄清进程与内核线程之间的关系。 - Bhabani Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接