绿色线程与非绿色线程

Dea*_*mer 68 java multithreading terminology

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

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

  • 任何预期的行为问题.

Mat*_*Mat 69

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

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

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

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

维基百科文章中提到了一些例外,我主要针对低功耗(嵌入式)设备.

  • *古代*过去的事情.上世纪.你的教授需要了解最新动态. (7认同)
  • @ user1657170:Fibers(以及现在几乎所有平台上都出现过的所有相关/类似的东西,或者在Erlang进程中一直存在的东西)与绿色线程无关,因为Java中使用了这个术语.当然Sun/Oracle有本机线程,当然JVM使用它们.同样,如果你有一些特定的东西指出上述事实上是错误的,请引用准确的消息来源. (4认同)
  • @ user1657170:仍然不明白你在上面写的内容中指的是什么.阅读我从ex-Sun链接到的文章,他们放弃了围绕Solaris 2.6的绿色线程. (2认同)
  • 您在上面发布的内容中,您将这三个链接称为什么,特别是在此问题上没有参考的与您发布的内容相矛盾的Oracle文档链接?我完全回答你的评论,这完全是浪费时间. (2认同)

Yik*_* Lu 19

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

换句话说,绿色线程对于特定规模的IO绑定操作更好.

  • 从技术上讲,连接将是并发的,您无法同时处理它们的请求. (6认同)
  • 使用绿色线程,您实际上没有100k并发连接.这只是一种幻觉*. (3认同)

Mic*_*rdt 18

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

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

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

  • 有几种绿色线程的实现使用多个本机线程以利用多核或多处理器体系结构.这包括.NET中的线程库和Java的Quasar库.它们都使用与核心一样多的本机线程,并使用绿色线程/光纤作为其他线程,在本机线程之间进行平衡. (11认同)

Ani*_*kur 5

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

绿色线程在不依赖任何原生 OS 能力的情况下模拟多线程环境,并且它们在用户空间而不是内核空间中进行管理,使它们能够在没有原生线程支持的环境中工作

性能:

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

当一个绿色线程执行阻塞系统调用时,不仅该线程被阻塞,进程内的所有线程也被阻塞。

  • 进程中的所有绿色线程是如何被阻塞的?如果这个进程有多个内核线程和一个执行程序服务来在它们上分派绿色线程怎么办?如果执行系统调用的线程根本没有向其分派其他任务怎么办?您的主张仅在单线程环境中成立。 (2认同)
  • 我的意思是说,一个进程的 n 个绿色线程有 1 个内核线程,1 个绿色线程进行阻塞调用(单个内核线程处理),然后与该内核线程对应的所有绿色线程都将被阻塞。显然这不适用于映射到进程的 n 个绿色线程的 m 个内核线程。无论哪种情况,您都不能说它是单线程环境 - 取决于内核线程调度。 (2认同)

use*_*170 5

当活动线程比处理器更多时,绿色线程比本地线程快得多。

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

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

请注意,我并不是在专门讨论绿色线程的Java实现,它确实有缺点,因为它与其他绿色线程的含义不同,无法在多核或多处理器系统中扩展。