绿色线程与非绿色线程

时间:2011-04-19 07:43:23

标签: java multithreading terminology

我想了解这些类型的线程提供的优势。

  • 在什么环境下绿色线程比非绿色更好?有人说绿色线程更适合多核处理器。

  • 任何预期的行为问题。

7 个答案:

答案 0 :(得分:68)

维基百科文章Green Threads解释得非常好。

绿色线程是“用户级线程”。它们由“普通”用户级进程调度,而不是由内核调度。因此,它们可用于在不提供该功能的平台上模拟多线程。

特别是在Java的上下文中,绿色线程已成为过去。见文章JDK 1.1 for Solaris Developer's Guide。 (这是关于Solaris的,但绿色线程不再使用的事实对于通常的平台是有效的。)

自版本1.3发布以来,在Sun JVM for Linux中放弃了绿色线程(请参阅archive.org上的Java[tm] Technology on the Linux Platform)。这可以追溯到2000年。对于Solaris,可以从JDK 1.2获得本机线程。这可以追溯到1998年。我甚至认为Windows没有绿色线程实现,但我找不到相关的参考。

维基百科文章中提到了一些例外情况,我主要针对低功耗(嵌入式)设备进行收集。

答案 1 :(得分:19)

绿色线程内存是从堆中分配的,而不是由操作系统为其创建堆栈。这可能会在并发线程中产生一个数量级或更多的增加。正如其他人所提到的,这不会自动利用多个处理器,但是用例通常用于阻止I / O - 例如绿色线程可能允许您处理100k并发连接而不是10k。

换句话说,绿色线程在某种程度上更适合IO绑定操作。

答案 2 :(得分:18)

绿色线程是在应用程序级而不是在操作系统中实现的线程。这通常在操作系统不提供线程API时完成,或者它不能以您需要的方式工作。

因此,优点是您可以获得类似线程的功能。缺点是绿色线程实际上不能使用多个核心。

有一些早期JVM使用绿色线程(IIRC是Blackdown JVM端口到Linux),但现在所有主流JVM都使用真正的线程。可能有一些嵌入式JVM仍然使用绿色线程。

答案 3 :(得分:5)

当拥有比处理器更多的活动线程时,绿色线程比本机线程快得多。

Java最初支持绿色线程,但与大多数现代绿色线程实现不同,它无法扩展到多个处理器,从而使Java无法使用多个内核。

然后Java删除了绿色线程,以便仅依赖本机线程。这使得Java Threads比绿色线程慢。

请注意,我并没有特别谈论绿色线程的Java实现,它确实有缺点,因为它不像其他绿色线程影响无法在多核或多处理器系统中扩展。

答案 4 :(得分:4)

绿色线程是用户级线程而不是内核级线程。它们由用户库而不是内核调度。您可以拥有自己的调度机制来调度线程,而不是依赖于OS调度程序。

绿色线程模拟多线程环境而不依赖于任何本机操作系统功能,它们在用户空间而不是内核空间中进行管理,使它们能够在没有本机线程支持的环境中工作

表现:

在多核处理器上,本机线程实现可以自动将工作分配给多个处理器,而绿色线程实现通常不能。 在线程激活和同步时,绿色线程明显优于Linux本机线程。

当绿色线程执行阻塞系统调用时,不仅该线程被阻塞,而且进程中的所有线程都被阻止。

答案 5 :(得分:2)

操作系统未安排绿色线程。

这意味着它们的调度发生在用户空间中,而不是由内核处理。这意味着通常不能使绿色线程使用所有CPU内核。

对于目前运行Java的任何主流平台(例如x86或x64),您将使用真正的线程。

答案 6 :(得分:1)

JAVA多线程由两种模式实现:

  1. 绿色线程模型
  2. 原生OS模型
  3. 绿色线程模型:由JVM管理但未获得底层操作系统支持的线程称为绿色线程。很少有像Sun Solaris这样的操作系统提供对绿色线程模型的支持。它已弃用,不建议使用。

    本机操作系统模型:在底层操作系统的帮助下由JVM管理的线程称为本机操作系统模型。所有Windows操作系统都支持本机操作系统模型。