【问题标题】:How does N<->1 threading model work?N<->1 线程模型如何工作?
【发布时间】:2014-12-07 12:42:55
【问题描述】:

继续question,这是对 N-1 线程模型的附加查询。

教导说,在设计应用程序之前,需要注意线程模型的选择。

在 N-1 线程模型中,单个内核线程可用于代表每个用户进程工作。操作系统调度程序给这个内核线程一个单一的 CPU 时间片。

在用户空间中,程序员可以使用 POSIX pthread 或 Windows CreateThread() 在用户进程中生成多个线程。由于程序员使用 POSIX pthread 或 Windows CreateThread(),内核知道用户级线程,并且每个线程都被调度程序考虑用于处理器时间分配。所以,这意味着每个用户线程都会得到一个内核线程。

我的问题:

那么,N-1 线程模型怎么可能存在呢?这将是 1-1 线程模型。请说清楚。

【问题讨论】:

  • 请添加评论以说明拒绝投票的原因,以便我纠正我的错误。
  • 我没有投反对票,但您可能应该输入您尝试过的内容,并使您的问题更清晰/简洁和独立。您可能还应该将范围缩小到可以回答的范围内。就目前而言,我觉得这是一个家庭作业问题。
  • @tangrs 这是自我发展学习,而不是家庭作业问题。 taught that 这个词指的是解决这一点的在线讲座。在没有明确线程模型的情况下考虑设计任何并发/网络应用程序是太远了。
  • 不鼓励使用特定于平台的线程工具,而支持 C11 的线程工具。
  • @nif 你能评论一下这个查询吗?

标签: c multithreading linux-kernel kernel


【解决方案1】:

在用户空间中,程序员可以使用 POSIX pthread 或 Windows CreateThread() 在用户进程中生成多个线程。当程序员使用 POSIX pthread 或 Windows CreateThread() 时,内核知道用户级线程,并且每个线程都被调度程序考虑为处理器时间分配。所以,这意味着每个用户线程都会得到一个内核线程。

这就是一对一线程的工作原理。

不必如此。一个平台可以实现pthread_createCreateThread,或者它提供的任何其他“创建线程”功能,可以做任何事情。

我的问题:

那么,N-1 线程模型怎么可能存在呢?这将是 1-1 线程模型。
请澄清。

正如您在问题开头所解释的那样——当程序员创建一个线程时,不是创建一个内核知道的线程,而是创建一个用户态调度程序知道的线程,仍然使用单个内核整个进程的线程。

【讨论】:

  • 因此,Java 程序员无法控制在 1-1 或混合模型环境中工作。他只能选择在 N-1 线程模型环境中工作,因为 JVM 负责创建和调度线程而不是内核。我说的对吗?
  • @overexchange 否。如果需要,Java 程序员可以编写实现混合线程或 N 对 1 线程的 Java 程序。 JVM 通常提供 1 对 1 线程,程序员可以选择使用或不使用。
  • 好吧,那么,如果Java代码继承并使用Oracle的Java.lang.Thread类,那么JVM内部为你提供了1-1线程模型,我说的对吗?
  • @overexchange 今天,是的。 Green threads 在 Java 早期很常见。
【解决方案2】:

简答:不只是 Windows 和 Linux。

答案稍长(EDITED):

许多编程语言和框架都向程序员介绍了多线程。同时,它们的目标是可移植的,即不知道是否有任何目标平台确实支持线程。在这里,最好的方法是实现一个 N:1 线程,无论是一般情况下,至少对于后端来说都是没有线程支持的。

典型的例子是 Java:该语言支持多线程,而 JVM 甚至对于不支持线程的非常简单的嵌入式平台也存在。但是,有一些 JVM(实际上是大多数)使用内核线程(例如 AFIK,Sun/Oracle 的 JVM)。

语言/平台不想将线程控制完全转移到操作系统的另一个原因有时是特殊的实现功能,例如反应器模型或全局语言锁。在这里,目标是使用 OS 调度无法访问的用户运行时系统(执行本地调度)中有关执行特殊模式的信息。

 Does [1:1 threading] add more space occupancy on User process virtual 
 address space because of these kernel threads?

嗯,理论上,执行流(进程、线程等)和地址空间是独立的概念。可以找到进程(这里作为一个通用术语)和内存空间之间的各种映射:1:1、n:1、1:n、n:n。但是,线程化的经典做法是,一个进程的多个线程共享任务的内存空间(即内存空间的所有者)。因此,用户线程和内核线程在内存空间方面通常没有区别。 (一个例外是,例如 Erlang-VM:这里存在具有隔离内存空间的用户线程)。

【讨论】:

  • 1) 因此,在 JVM(不包括嵌入式平台)下运行的用户进程(运行 java 代码)看起来与 N-1 线程模型完全一样,其中 jvm 进程知道线程实现/调度但不知道核心。我对么? 2)相反,如果用户进程(使用pthread_create()或windows CreateThread())实际上暗示内核为每个用户线程关联一个内核线程,这导致1-1线程模型。我说的对吗?
  • 我没有明白这一点are sometimes special implementation features as reactor modells or global language locks
  • 由于 1-1 线程模型对于每个用户态线程都有内核线程,这是否会因为这些内核线程而增加用户进程虚拟地址空间的空间占用?
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 2021-06-03
  • 2012-02-17
  • 2014-12-05
  • 2013-01-25
  • 2014-11-07
相关资源
最近更新 更多