Multithreading 是否有任何全面的概述讨论了所有不同类型的线程?

Multithreading 是否有任何全面的概述讨论了所有不同类型的线程?,multithreading,Multithreading,有没有全面的概述来讨论所有不同类型的线程,以及它们与操作系统和调度程序的关系?我听过很多自相矛盾的信息,关于你是否想要某些类型的线程,或者线程池是一种性能提升还是一种性能打击,或者线程是很重的,所以你应该使用这些其他类型的线程,它们不能直接映射到真实的线程,但是这与线程池有什么不同。。。。我瘫痪了。有人怎么理解它?假设使用一种实际直接与线程交互的语言(我知道并发语言、隐式并行等,作为需要了解这些内容的替代,但我现在对此很好奇)线程是Windows win32体系结构中进程的主要构建块。您可以忽略

有没有全面的概述来讨论所有不同类型的线程,以及它们与操作系统和调度程序的关系?我听过很多自相矛盾的信息,关于你是否想要某些类型的线程,或者线程池是一种性能提升还是一种性能打击,或者线程是很重的,所以你应该使用这些其他类型的线程,它们不能直接映射到真实的线程,但是这与线程池有什么不同。。。。我瘫痪了。有人怎么理解它?假设使用一种实际直接与线程交互的语言(我知道并发语言、隐式并行等,作为需要了解这些内容的替代,但我现在对此很好奇)

线程是Windows win32体系结构中进程的主要构建块。您可以忽略绿色线程、光纤、绿色光纤、pthreads(POSIX)。超线程不存在。这就是“超线程”,它是一种CPU体系结构。您无法对其进行编码。你可以忽略它

这样就可以使用线程了。的确只有线程。内核线程是内核的线程,它位于机器虚拟内存加法空间的上2GB(有时是上1GB)中。你不能碰它。因此,您可以在大多数情况下忽略它(除非您正在编写内核模式的ring-0代码)

只有用户线程才是您应该关心的。它们有两种风格:主线程和辅助线程。每个进程至少有一个主线程,它是在创建进程(
CreateProcess
API调用)时为您创建的。辅助线程可以执行耗时较长的任务,否则会中断用户体验。在C#/,NET中,您可以使用BackgroundWorker类轻松创建和管理线程


线程有几个属性。这可能会导致所有类型的线程。但是,当您开始处理线程时,工作线程可能是您唯一应该担心的问题。

以下是我的简要总结,请随意评论和编辑:

  • 没有超线程,除非你在谈论英特尔的超线程,在这种情况下,它只是虚拟内核

  • “绿色”通常表示“非OS级”(由VM调度/处理,VM可能会也可能不会将这些映射到多个OS级线程或进程)

  • pthreads是一种API(Posix线程)

  • 内核线程与用户线程是一个实现级别(用户线程在userland中实现,因此内核不知道它们,其调度程序也不知道它们),“线程”通常是“内核线程”的别名

  • 光纤是系统级的协同路由。它们是线程,除了协同多任务而不是抢占


嗯,与大多数事情一样,除非线程被确定为瓶颈,否则通常不只是关心。也就是说,只需以通常的方式使用平台提供的线程功能,不必担心细节,至少在开始时是这样

但是,由于您显然想知道更多:通常,操作系统有一个线程作为执行单元的概念,这是OS调度器处理的。现在,在操作系统级线程之间切换需要上下文切换,这可能非常昂贵,并且可能成为性能瓶颈。因此,与直接将编程语言线程映射到操作系统线程不同,一些线程实现在用户空间中完成所有工作,因此只有一个操作系统级线程负责应用程序中的所有用户级线程。这在性能和资源方面都更有效,但问题是,如果您实际上有多个物理处理器,则不能在用户级线程中使用多个处理器。因此,还有一种分配线程的策略:拥有多个操作系统级线程,其数量与您拥有的物理处理器数量相关,并且每个线程负责多个用户级线程。这三种策略通常称为1:1(用户线程映射到操作系统线程)、N:1(所有用户线程映射到1个操作系统线程)和M:N(M个用户线程映射到N个操作系统线程)

线程池是一件稍微不同的事情。线程池背后的思想是将执行资源与实际执行分开,这样线程池中就有许多线程(您的资源)可用,当您需要执行某些任务时,只需从池中选择一个线程并将任务交给它即可。因此,线程池是设计多线程应用程序的一种方法。另一种设计方法是确定需要执行的不同任务(例如,从网络读取、将UI绘制到屏幕),并为这些任务创建专用线程。这与线程是用户级还是操作系统级的概念基本上是正交的。

我在阅读中学到了很多

我看了之后才发现这个