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

时间:2009-10-18 15:33:46

标签: multithreading

是否有任何全面的概述讨论所有不同类型的线程以及它们与操作系统和调度程序的关系?我听到了很多关于你是否想要某些类型的线程,或者线程池是性能增益还是性能损失,或线程是否很重的信息的矛盾信息,所以你应该使用这些其他类型的线程不会映射直接到真正的线程,但那么与线程池有什么不同......我瘫痪了。怎么有人理解它?假设使用一种实际上直接与线程交互的语言(我知道并发语言,隐式并行等等,作为需要知道这些东西的替代方法,但我现在对此感到好奇)

4 个答案:

答案 0 :(得分:0)

线程是Windows win32体系结构中进程的主要构建块。您可以忽略绿色线,纤维,绿色纤维,pthreads(POSIX)。超线程不存在。它是“超线程”,它是CPU架构的东西。你不能编码。你可以忽略它。

这使得线程使用。确实。只有线程。内核线程是内核的一个线程,它位于机器的虚拟内存地址空间的高2GB(有时高于1GB)。你无法触摸它。因此,您可以在大多数时间忽略它(除非您正在编写内核模式ring-0代码)。

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

线程有几个属性。这可能导致所有“种类”的线程。但是当你开始处理线程时,工作者线程可能是你唯一应该担心的。

答案 1 :(得分:0)

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

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

  • “绿色”通常表示“非操作系统级别”(由VM调度/处理,可能会也可能不会映射到多个操作系统级别的线程或进程)

  • pthreads是一个API(Posix线程)

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

  • 光纤是系统级协程。它们是线程,除了合作多任务而不是先发制人。

答案 2 :(得分:0)

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

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

线程池是一个稍微不同的东西。线程池背后的想法是将执行资源与实际执行分开,这样您就可以在线程池中使用多个线程(您的资源),当您需要执行某个任务时,您只需从中选择一个线程游泳池并将任务交给它。因此,线程池是设计多线程应用程序的一种方法。另一种设计方法是识别需要执行的不同任务(例如,从网络读取,将UI绘制到屏幕上),并为这些任务创建专用线程。这主要与线程是用户级还是OS级概念正交。

答案 3 :(得分:0)

我学到了很多阅读these slides

在看了Unicorn之后我才发现了这一点。