绿线与非绿线


78

我想了解此类线程提供的优势。

  • 在哪些环境中,绿色线程比非绿色线程更好?有人说绿色线程更适合多核处理器。

  • 任何预期的行为问题。


5
绿色线程对于多核处理器来说是更好的选择,因为它不会使用mroe而不是一个内核,这是极不可能的。如果绿色线程更好,那么您就有了一个不应使用线程的程序(有时应使用不应使用的线程)
Peter Lawrey 2011年

1
哪里不应该使用线程?
user1657170

Answers:


81

维基百科文章“绿色线程”对此做了很好的解释。

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

特别是在Java上下文中,绿色线程已成为过去。请参见《JDK 1.1 for Solaris开发人员指南》。(这是关于Solaris的,但是不再使用绿色线程的事实对于通常的平台是有效的)。

从版本1.3开始,在Linux的Sun JVM中已放弃了绿色线程(请参阅archive.org上Linux平台上的Java [tm]技术)。可以追溯到2000年。对于Solaris,可以从JDK 1.2获得本机线程。那可以追溯到1998年。我什至认为Windows从来没有一个绿色线程实现,但是我找不到关于它的参考。

如Wikipedia文章所述,有一些例外,我主要收集低功耗(嵌入式)设备的信息。


8
对的事情古老的过去。上世纪。您的教授需要及时了解。
罗恩侯爵,

1
@ user1657170:他们不是什么?您提到的是什么“辅助线程”技术?

2
@ user1657170:仍然不明白您在我上面所写的内容。阅读我从前Sun链接到的文章,他们放弃了Solaris 2.6周围的绿色线程。
马太福音

4
@ user1657170:纤维(以及近来在几乎所有平台上突然出现的所有相关/类似的东西,或者像Erlang进程中那样一直存在的东西)与绿色线程无关,因为Java中使用了绿色线程这一术语。当然,Sun / Oracle具有本地线程,而JVM当然也使用它们。同样,如果您要指出的是上述事实中确实有误的内容,请引用准确的消息来源。

3
在我上面发布的内容中,您如何称呼这三个链接,特别是指向Oracle文档的链接,该链接与您在没有参考的情况下发布的内容相矛盾?顺便说一句,我已经在回答您的评论了,这完全是浪费时间。

22

绿色线程是在应用程序级别而非操作系统中实现的线程。通常在操作系统不提供线程API或无法按照您需要的方式工作时完成此操作。

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

有一些早期的JVM使用绿色线程(IIRC的Linux的Blackdown JVM端口使用了绿色线程),但是如今,所有主流JVM都使用真实线程。可能有些嵌入式JVM仍使用绿色线程。


16
绿色线程有几种使用多个本机线程的实现,以便利用多核或多处理器体系结构。这包括.NET中的线程库和Java的Quasar库。它们都使用与内核一样多的本机线程,并为其他线程使用绿色线程/光纤,从而在本机线程之间平衡它们。
user1657170

21

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

因此,换句话说,绿色线程在一定规模上更适合IO绑定操作。


3
使用绿色线程,您实际上并没有100k的并发连接。这只是一种幻想
Pacerier 2014年

7
从技术上讲,连接将是并发的,您无法同时处理它们的请求。
耶克·卢

堆栈的位置不会神奇地导致速度加快。
罗恩侯爵

绿色线程如何使100k并发连接的结果显示在客户端屏幕上?那是一种幻想吗?我们能否在代码不产生3D图形的情况下在屏幕上复制这种3D图形作为幻觉?
user1657170

5

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

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

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

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


对于计算密集型任务,绿色线程并没有明显更快,甚至根本没有更快。但是,对于某些任务,它是一个很好的工具。
JugsteR

对,他们是。它们执行计算的速度并不快,但是线程处理的速度却更快。它们不像真正的踏板那样提供并行性。大多数情况下,线程不涉及计算机密集型任务。尽管您可能会争辩说人们会过度使用线程,也许应该使用更多的状态机并将他们的工作适合过程编程。
user1657170

没有给出上下文,因此请不要承担任何责任。由于您可以在任意数量的cpu上运行绿色线程,就像“普通”线程一样,这种情况下的计算密集型意味着不会进行任何切换。由于没有切换,因此将绿色线程用于此类目的的好处就没有了。很抱歉,如果不清楚。因此,在我所讨论的特定场景中,绿色线程不会给您带来任何性能上的好处。
JugsteR

4

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

绿色线程可在不依赖任何本机OS功能的情况下模拟多线程环境,并且它们在用户空间而不是内核空间中进行管理,从而使它们可以在不具有本机线程支持的环境中工作

表演:

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

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


1
如何阻止进程中的所有绿色线程?如果此进程具有多个内核线程和一个在其上调度绿色线程的执行服务,该怎么办?如果执行syscall的线程根本没有调度其他任务怎么办?您的主张仅在单线程环境中是正确的。
marctrem

2
我的意思是说有1个内核线程用于一个进程的n个绿色线程,并且1个绿色线程进行阻塞调用(由单个内核线程处理),然后与该内核线程相对应的所有绿色线程都将被阻塞。显然,这对于映射到进程的n个绿色线程的m个内核线程不成立。无论哪种情况,您都不能说这是单线程环境-取决于内核线程调度。
艾尼克特·塔库尔

2

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

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

对于当今运行Java的任何主流平台(例如x86或x64),您将使用实线程。


3
绿色线程没有理由不能利用多个CPU。参见例如GHC和Go。
rightfold

2

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

  1. 绿线模型
  2. 本机OS模型

绿色线程模型:由JVM管理的线程,没有获得底层操作系统的支持,称为绿色线程。很少有像Sun Solaris这样的操作系统提供对绿色线程模型的支持。不推荐使用,不建议使用。

本机OS模型:由JVM在基础OS的帮助下管理的线程称为本机OS模型。所有Windows OS均支持本机OS模型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.