绿色线程与非绿色线程

伙计们,我想了解这些types的线程提供的优势。

  • 什么样的环境比非绿色好? 有人说绿色线程对于多核处理器来说更好。

  • 任何预期的行为问题。

维基百科的文章Green Threads很好地解释了这一点。

绿色线程是“用户级线程”。 它们由“普通”用户级进程安排,而不是由内核安排。 所以它们可以用来模拟不提供这种function的平台上的multithreading。

在Java的背景下,绿色线程已成为过去。 看到这篇文章 。 (这是关于Solaris的,但绿线程不再使用的事实对于通常的平台是有效的)。

从1.3版本的Sun JVM for Linux版本(参见archive.org 上的Linux平台上的Java [tm]技术)中绿色的线程被放弃了。 这可以追溯到2000年。对于Solaris,本地线程可从JDK 1.2获得。 这可以追溯到1998年。我甚至不觉得有一个Windows的绿色线程实现,但我找不到一个参考。

维基百科文章中提到了一些例外情况,我主要收集的是低功耗(embedded式)设备。

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

所以换句话说,绿线程对于一定规模的IO界限操作来说更好。

绿色线程是在应用程序级别而不是在OS中执行的线程。 这通常是在操作系统没有提供线程API的情况下完成的,或者它不能以你需要的方式工作。

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

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

绿色的线程不是由OS安排的。

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

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

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

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

性能:

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

当一个绿色的线程执行一个阻塞的系统调用时,不仅阻塞了这个线程,而且阻塞了进程内的所有线程。

当具有比处理器更多的活动线程时,绿色线程比原生线程快得多。

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

然后,Java删除了绿色线程,只依靠本地线程。 这使得Java Threads比绿色线程慢。

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

JAVAmultithreading是由两个模型实现的:

  1. 绿色螺纹模型
  2. 本地操作系统模型

绿色线程模型:由JVMpipe理的线程,不需要底层的操作系统支持就称为绿色线程。 像Sun Solaris这样的操作系统很less提供对绿色线程模型的支持。 它已被弃用,不build议使用。

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