C N<-&燃气轮机;1线程模型工作?

C N<-&燃气轮机;1线程模型工作?,c,multithreading,linux-kernel,kernel,C,Multithreading,Linux Kernel,Kernel,这是对N-1线程模型的补充查询 在设计应用程序之前,需要注意线程模型的选择 在N-1线程模型中,单个内核线程可代表每个用户进程工作。OS调度器为该内核线程提供一个CPU时间片 在用户空间中,程序员可以使用POSIXpthread或WindowsCreateThread()在用户进程中生成多个线程。当程序员使用POSIXpthread或WindowsCreateThread()时,内核知道用户线程,并且调度程序会考虑每个线程分配处理器时间。因此,这意味着每个用户线程将获得一个内核线程 我的问题:

这是对N-1线程模型的补充查询

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

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

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

我的问题:


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

简短回答:Windows和Linux不只是这些

略长的回答(已编辑):

许多编程语言和框架向程序员引入多线程。同时,它们的目标是可移植,也就是说,不知道是否有任何目标平台支持线程。在这里,最好的方法是实现一个N:1线程,一般来说,至少对于没有线程支持的后端来说是这样

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

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

 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:这里存在具有隔离内存空间的用户线程)

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

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

事实并非如此。平台可以实现
pthread\u create
CreateThread
,或者它提供的任何其他“创建线程”函数,这些函数可以做任何它想做的事情

我的问题:

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


正如您在问题开头所解释的那样——当程序员创建线程时,它创建的线程不是内核知道的线程,而是userland scheduler知道的线程,整个过程仍然使用单个内核线程。

请添加注释,说明否决投票的原因,所以我可以纠正我的错误。我没有投反对票,但你可能应该把你已经尝试过的东西放进去,让你的问题更清楚/简洁和独立。你可能还应该把范围缩小到可以负责的事情。就目前情况而言,我觉得这是一个家庭作业问题。@Tangers这是自我发展学习,但不是家庭作业问题。所教的
一词是指针对这一点的在线讲座。在没有明确线程模型的情况下设计任何并发/网络应用程序是远远不够的。不鼓励使用特定于平台的线程设施,而支持C11的线程设施。@如果您能对此查询发表意见吗?1)那么,在JVM(不包括嵌入式平台)下运行的用户进程(运行java代码)看起来和N-1线程模型完全一样,jvm进程知道线程实现/调度,但内核不知道。我说得对吗?2) 相反,如果用户进程(使用pthread_create()或windows CreateThread())实际通知内核为每个用户线程关联一个内核线程,则会产生1-1线程模型。我说得对吗?我没有明白这一点,
有时是特殊的实现功能,比如反应堆模型或全局语言锁
因为1-1线程模型为每个用户线程都有内核线程,这会因为这些内核线程而增加用户进程虚拟地址空间的占用吗,Java程序员无法控制在1-1或混合模型环境中工作。他只能选择在N-1线程模型环境中工作,因为JVM负责创建和调度线程,而不是内核。我说的对吗?@overexchange否。如果Java程序员愿意,他们可以编写一个实现混合线程或N-to-1线程的Java程序。JVM通常提供1对1线程,程序员可以选择使用或不使用。好的,那么,如果Java代码继承并使用Oracle的
Java.lang.Thread
类,那么JVM在内部为您提供1-1线程模型。我正确吗?@overexchange Today,是的。在Java的早期很常见。