Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux和Windows下的多线程模型_Linux_Windows_Multithreading_Operating System - Fatal编程技术网

Linux和Windows下的多线程模型

Linux和Windows下的多线程模型,linux,windows,multithreading,operating-system,Linux,Windows,Multithreading,Operating System,在过去的几个月里,我一直在学习操作系统课程。然而,我想澄清我读到的一点。据我所知,有三种类型的多线程模型可以将用户级线程映射到内核级线程- 多对一模型 多对多模型 一对一模式 我可以理解为什么多对一模型在并行处理方面效率不高,因为阻塞系统调用意味着停止任何处理。 然而,在我所指的《操作系统概念》(Abraham Silberschatz、Greg Gagne和Peter Galvin著)一书中,它说Linux和Windows系列都使用一对一模式,尽管为创建的每个用户线程创建一个内核线程会带来

在过去的几个月里,我一直在学习操作系统课程。然而,我想澄清我读到的一点。据我所知,有三种类型的多线程模型可以将用户级线程映射到内核级线程-

  • 多对一模型
  • 多对多模型
  • 一对一模式
我可以理解为什么多对一模型在并行处理方面效率不高,因为阻塞系统调用意味着停止任何处理。
然而,在我所指的《操作系统概念》(Abraham Silberschatz、Greg Gagne和Peter Galvin著)一书中,它说Linux和Windows系列都使用一对一模式,尽管为创建的每个用户线程创建一个内核线程会带来额外的开销
多对多模型不是更好吗?因为您有许多内核线程,足以实现高度并行,并且您可以始终选择两级模型将用户级线程绑定到内核级线程。

TLDR:为什么在Windows和Linux系统中,一对一多线程模型比多对多线程模型更受欢迎?

AFAIK,“多对多”模型意味着在用户空间中进行调度,因此它意味着每个程序必须在每个内核线程中运行自己的调度程序,使用它在分配给它的用户线程之间共享该线程。换句话说:您需要在每个内核线程中运行类似GNU Portable Threads的东西来分派分配给该内核线程()的用户线程

多对多模型不是更好吗

我建议再买一本书。AFAIK多对多模型完全是理论上的(如果有人知道使用它的系统,请在评论中指出)。这些模型是一种非常糟糕的解释线程的方法

在过去,操作系统并没有线程的概念。他们安排了要执行的进程。事实上,许多操作系统仍然是这样

线程的需求主要是由需要“任务”支持的Ada编程语言驱动的。为了有一个兼容的Ada实现,必须有一个在单个进程中模拟线程的库。在这样的系统中,进程调度自己的线程执行(“用户线程”),这有一个缺点,线程总是交错运行(从不在不同的处理器上并行运行)

这被称为“多对一”,但这是一个糟糕的描述。您的模型调用“多个用户线程”映射到单个“内核线程”。实际上,没有内核线程。相反,线程是在进程上下文中实现的

操作系统通常将进程视为具有多个可调度执行线程的地址空间。在这样的系统中,线程是调度的基本单元,而不是进程。它是方案中的一对一模型

它说Linux和Windows系列都使用一对一模式,尽管为每个创建的用户线程创建一个内核线程会带来额外的开销

这是一种BS。一个线程无论如何实现都会有开销。你经常会发现有人声称“多对一”比“一对一”更有效。这种说法似乎只是城市传说

为什么在Windows和Linux系统中,一对一多线程模型比多对多线程模型更受欢迎


“一对一”(也称为内核线程)模型更可取,因为它利用了多个处理器,并允许并行执行。它还避免了某些系统(如太监)中可能出现的阻塞问题。

因为在多对多模型中,会引入更多的开销。(然而,有些架构使用它,尤其是Goroutine或Actors。@eckes感谢您的快速回复。您能详细说明一下吗?到底是什么在多对多模型中引入了更多开销?除了操作系统中的任务调度器之外,您基本上还必须在软件中实现任务调度器。这还包括切换执行的方法任务或上下文。对于参与者模型或无堆栈软件线程,我想第二点问题不大。至少在Windows上,开销是最小的。内核堆栈只占用大约三页,而默认用户模式堆栈为1MB。大约1.2%,加上我猜少量的内务管理。虽然我不是作为一名专家,很明显,只有一种线程必须极大地简化事情,因此这可能是一个明智的权衡。谢谢你的回答!我想我会参考其他关于多线程的书籍。他们让它变得太复杂了。