在计算机程序设计中,绿色线程是一种由运行环境或虚拟机调度,而不是由本地底层操作系统调度的线程。绿色线程并不依赖于底层的操作系统提供的支持,而是通过模拟来实现运行多线程,这种线程的调度发生在用户空间而不是内核空间,所以它们可以在没有原生线程支持的环境中工作。
词源
绿色线程的名称来源于最初的Java线程库。这是因为甲骨文公司的「绿色团队」最初设计了Java 的线程库。
性能
在多核处理器上,原生线程可以自动将工作分配给多个处理器,而绿色线程做不到这一点。在某些虚拟机中,绿色线程可以启动得更快。然而,在单处理器计算机上,最有效的工作方式依旧没有定论。在一台运行着(运行时间很长的)Linux 2.2 内核的电脑上的测试表明:
- 绿色线程的性能在线程激活和同步上明显好于原生线程。
- Linux原生线程的性能在 I/O 操作和上下文切换 (Context Switch) 上略好于绿色线程。
当一个绿色线程执行一个阻塞的系统调用,不仅是当前的线程被阻塞,而是当前进程中的所有线程都会被阻塞。如果虚拟机在实现绿色线程时,为每个 I/O 操作分配特定的 I/O进程(这些进程对用户透明)可以减少用户编程时的负责度,但是为了避免阻塞问题,绿色线程必须使用异步I/O操作。
对应的,在使用原生线程时,也有方法可以减少线程激活和同步的开销:
- 使用线程池可以通过重用有限数量的线程,来降低重新生成新线程的成本。
- 使用虚拟机和原生线程的语言可以使用Escape analysis,来避免在不需要的情况下同步代码块。
Java虚拟机中的绿色线程
舊版本
在Java 1.1中,绿色线程(至少在 Solaris 上)是JVM 中使用的唯一一种线程模型。由于绿色线程和原生线程比起来在使用时有一些限制,随后的 Java 版本中放弃了绿色线程,转而使用原生线程。是一个例外,它是低功耗设备的操作系统和Java虚拟机的混合体。它使用绿色线程来保持机器语言的绝对最小并支持分离的迁移。Kilim和Quasar 是在随后的 JVM 版本中通过修改Java 编译器产生的字节码来实现绿色线程的开源项目(Quasar 也支持 Kotlin 和 Clojure)。
Java新版的虛擬執行緒
從 Java 21 版開始,以代號 JEP 444 重新加入綠色-{}-執行緒的功能,並改名為「虛擬-{}-執行緒」。
其他语言的绿色线程
还有一些其他的编程语言也实现了可以替代原生线程的绿色线程。例如:
- CHICKEN Scheme uses lightweight user-level threads based on first-class continuations
- Common Lisp
- CPython with [http://greenlet.readthedocs.org greenlet], [http://eventlet.net/ eventlet] and [http://gevent.org gevent] , PyPy
- D offers fibers, used for asynchronous I/O as the basis for tasks in the web framework Vibe.d
- Erlang
- Go
- Haskell
- Racket (native threads are also available through Places)
- Rust support for green-threads is possible using mioco library
- SML/NJ's implementation of Concurrent ML
- Smalltalk (most dialects: Squeak, VisualWorks, GNU Smalltalk, etc.)
- Stackless Python supports either preemptive multitasking or cooperative multitasking through microthreads (so-called tasklets).
- Tcl has [http://www.tcl.tk/man/tcl8.6/TclCmd/coroutine.htm coroutines] and an event loop
- PHP supports green threads through [https://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html coroutines]
另请参阅
- 轻量级进程
- 协程
- Java虚拟机
- 全局解释器锁
- 纤程
- GNU可移植线程库
- Protothreads
参考资料
评论 (0)