N< - > 1线程模型如何工作?

时间:2014-10-13 01:22:48

标签: c multithreading linux-kernel kernel

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

enter image description here

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

在N-1线程模型中,单个内核线程可用于代表每个用户进程工作。 OS调度程序为此内核线程提供单个CPU时间片。

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

我的问题:

那么,N-1线程模型如何才能存在?这将是1-1线程模型。请澄清。

2 个答案:

答案 0 :(得分:1)

简短回答:不仅仅是Windows和Linux。

答案稍长(已编辑):

许多编程语言和框架为程序员引入了多线程。同时,它们旨在便携,即,不知道任何目标平台是否确实支持线程。在这里,最好的方法是实现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 :(得分:1)

  

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

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

不一定是这种情况。平台可以实现pthread_createCreateThread或其他任何“创建线程”功能,它可以提供任何所需的功能。

  

我的问题:

     

那么,N-1线程模型如何才能存在?这将是1-1线程模型   请澄清。

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