【发布时间】:2018-04-06 17:57:47
【问题描述】:
我开始想知道进程、内核级线程和用户级线程之间的区别。
Linux API 中的进程和线程是指进程、内核级线程还是用户级线程?
对于 Python、Java 和 C# 等编程语言中的标准模块有同样的问题吗?
谢谢。
【问题讨论】:
标签: multithreading process operating-system
我开始想知道进程、内核级线程和用户级线程之间的区别。
Linux API 中的进程和线程是指进程、内核级线程还是用户级线程?
对于 Python、Java 和 C# 等编程语言中的标准模块有同样的问题吗?
谢谢。
【问题讨论】:
标签: multithreading process operating-system
Linux 进程和 linux 线程显然将是“内核级别”,因为 Linux 是内核。但是,您应该知道,进程和线程之间的区别在 Linux 中不像在其他一些操作系统中那样明显。 Linux 进程和线程是由clone 系统调用(http://man7.org/linux/man-pages/man2/clone.2.html)创建的,你将克隆的结果称为“进程”还是“线程”取决于你给它的选项。
对于语言 X 或库 Y,线程是“用户线程”(又名“绿色线程”)还是“内核线程”(又名“本机线程”)的问题取决于您使用的语言/库正在谈论,这可能取决于您正在谈论的库或语言的具体版本和具体实现。
【讨论】:
首先让我们定义术语
用户级线程:- 由内核之外的某个库创建和管理的线程。那就是内核不直接知道这些线程。
内核级线程:- 由内核创建和管理。对于每个内核级线程,内核都维护一些数据结构来存储相关信息。
虽然这些定义并不通用,但大多数文献都同意它们。(操作系统概念、现代操作系统等)
当我们谈论由某个库创建的线程时,它们总是用户级线程。 要理解的是从用户级线程到内核级线程的映射。
它使用哪种映射取决于库(JVM、.NET)。它可以使用一对一的模型,每个用户级线程都将映射到自己的内核级线程。或者它可以使用多对一模型,其中多个用户线程映射到同一个内核线程。
就 Linux 而言,它不区分进程和线程,但它为您提供了控制父子资源共享级别的能力。您可以通过使用克隆系统调用来做到这一点。如果您创建一个具有最大共享的子进程,那么它实际上就是一个线程。另一方面,如果您将标志传递给克隆,那么除了它的进程之外没有什么是共享的。
总而言之,编程库中的线程始终是用户级线程。因为它们既不是由内核创建也不是(直接)管理的。
【讨论】: