我希望了解这些类型的线程提供的优势。
在哪些环境中,绿色线程比非绿色线程更好?一些人说绿色线程对于多核处理器更好。
是否存在任何预期的行为问题。
我希望了解这些类型的线程提供的优势。
在哪些环境中,绿色线程比非绿色线程更好?一些人说绿色线程对于多核处理器更好。
是否存在任何预期的行为问题。
Green threads是"用户级线程"。 它们由一个“普通”的用户级进程调度,而不是由内核调度。 因此,它们可用于在不提供该功能的平台上模拟多线程。
特别是在Java的语境下,Green threads已经过时了。 请参阅文章JDK 1.1 for Solaris Developer's Guide。(虽然这是关于Solaris的,但是Green threads不再使用的事实对于常见的平台仍然有效)。
从2000年起,Green threads在Sun JVM for Linux中被废弃(请参见Java[tm]Technology on the Linux Platform) 。 对于Solaris,自JDK 1.2以来即可使用本地线程(1998年)。 我甚至认为Windows从未有过Green thread的实现,但我找不到相关的参考资料。
正如维基百科的文章中所指出的那样,也有一些例外情况,我理解这主要是针对低功率(嵌入式)设备。
绿色线程是在应用程序层面实现的线程,而不是在操作系统中实现。通常这样做是因为操作系统没有提供线程 API,或者它不符合您的需要。
因此,优点是您可以获得类似线程的功能。缺点是绿色线程无法真正使用多个核心。
早期的一些 JVM 使用了绿色线程(我记得 Blackdown JVM 对 Linux 的移植就是这样),但现在所有主流的 JVM 都使用真正的线程。可能还有一些嵌入式 JVM 仍在使用绿色线程。
绿色线程内存是从堆中分配的,而不是由操作系统创建堆栈。这可能会使并发线程增加一个数量级或更多。正如其他人已经提到的,这不会自动利用多处理器,但典型的用例通常用于阻塞I/O - 例如,绿色线程可能允许您处理10万个并发连接,而不是10,000个。
换句话说,对于特定规模的IO绑定操作,绿色线程更好。
当活跃线程大于处理器数量时,绿色线程比本地线程快得多。
Java最初支持绿色线程,但与大多数现代绿色线程实现不同,它无法在多个处理器之间进行扩展,使Java无法利用多个核心。
然后Java删除了绿色线程,仅依赖本地线程。这使Java线程比绿色线程慢。
请注意,我并没有特别谈论Java对绿色线程的实现,因为与其他绿色线程实现不同,它不能在多核或多处理器系统中进行扩展。
绿色线程不由操作系统调度。
这意味着它们的调度发生在用户空间,而不是由内核处理。这意味着绿色线程通常不能使用所有CPU核心。
对于任何现代平台(例如x86或x64)运行Java,您将使用真正的线程。