綠色執行緒
在電腦程式設計中,綠色執行緒是一種由運行環境或虛擬機調度,而不是由本地底層作業系統調度的執行緒。綠色執行緒並不依賴於底層的作業系統提供的支持,而是通過模擬來實現運行多執行緒,這種執行緒的調度發生在用戶空間而不是內核空間,所以它們可以在沒有原生執行緒支持的環境中工作。
詞源
編輯性能
編輯在多核處理器上,原生執行緒可以自動將工作分配給多個處理器,而綠色執行緒做不到這一點。在某些虛擬機中,綠色執行緒可以啟動得更快。然而,在單處理器計算機上,最有效的工作方式依舊沒有定論。在一台運行著(過時很久的)Linux 2.2 內核的電腦上的測試表明:
- 綠色執行緒的性能在執行緒激活和同步上明顯好於原生執行緒。
- Linux原生執行緒的性能在 I/O 操作和上下文切換 (Context Switch) 上略好於綠色執行緒。
當一個綠色執行緒執行一個阻塞的系統調用,不僅是當前的執行緒被阻塞,而是當前進程中的所有執行緒都會被阻塞。如果虛擬機在實現綠色執行緒時,為每個 I/O 操作分配特定的 I/O進程(這些進程對用戶透明)可以減少用戶編程時的負責度,但是為了避免阻塞問題,綠色執行緒必須使用異步I/O操作。
對應的,在使用原生執行緒時,也有方法可以減少執行緒激活和同步的開銷:
- 使用執行緒池可以通過重用有限數量的執行緒來降低重新生成新執行緒的成本。
- 使用虛擬機和原生執行緒的語言可以使用Escape analysis來避免在不需要的情況下同步代碼塊。
Java虛擬機中的綠色執行緒
編輯舊版本
編輯在Java 1.1中,綠色執行緒(至少在 Solaris 上)是JVM 中使用的唯一一種執行緒模型。由於綠色執行緒和原生執行緒比起來在使用時有一些限制,隨後的 Java 版本中放棄了綠色執行緒,轉而使用原生執行緒。Squawk虛擬機是一個例外,它是低功耗設備的作業系統和Java虛擬機的混合體。它使用綠色執行緒來保持機器語言的絕對最小並支持分離的遷移。Kilim和Quasar 是在隨後的 JVM 版本中通過修改Java 編譯器產生的字節碼來實現綠色執行緒的開源項目(Quasar 也支持 Kotlin 和 Clojure)。
Java新版的虛擬執行緒
編輯從 Java 21 版開始,以代號 JEP 444 重新加入綠色執行緒的功能,並改名為「虛擬執行緒」[1]。
其他語言的綠色執行緒
編輯還有一些其他的程式語言也實現了可以替代原生執行緒的綠色執行緒。例如:
- CHICKEN Scheme uses lightweight user-level threads based on first-class continuations[2]
- Common Lisp[3]
- CPython with greenlet, eventlet (頁面存檔備份,存於網際網路檔案館) and gevent (頁面存檔備份,存於網際網路檔案館), PyPy[4]
- D offers fibers, used for asynchronous I/O as the basis for tasks in the web framework Vibe.d
- Erlang [來源請求]
- Go[5]
- Haskell[5]
- Julia uses green threads for its Tasks (頁面存檔備份,存於網際網路檔案館).
- Limbo [來源請求]
- Lua uses coroutines (頁面存檔備份,存於網際網路檔案館) for concurrency. Lua 5.2 also offers true C coroutine semantics through the functions lua_yieldk (頁面存檔備份,存於網際網路檔案館), lua_callk (頁面存檔備份,存於網際網路檔案館), and lua_pcallk (頁面存檔備份,存於網際網路檔案館). The CoCo (頁面存檔備份,存於網際網路檔案館) extension allows true C coroutine semantics for Lua 5.1.
- Occam, which prefers the term "process" instead of "thread" due to its origins in communicating sequential processes
- Ruby before version 1.9[6]
- Racket (native threads are also available through Places[7])
- 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).[8]
- Tcl has coroutines (頁面存檔備份,存於網際網路檔案館) and an event loop[9]
- PHP supports green threads through coroutines (頁面存檔備份,存於網際網路檔案館)
另請參閱
編輯參考資料
編輯- ^ JEP 444: Virtual Threads. openjdk.org. [2024-05-27]. (原始內容存檔於2024-10-09).
- ^ CHICKEN Scheme. [5 November 2017]. (原始內容存檔於2020-12-23).
- ^ thezerobit/green-threads. GitHub. [2016-04-08]. (原始內容存檔於2020-11-12).
- ^ Application-level Stackless features — PyPy 4.0.0 documentation. [6 December 2015]. (原始內容存檔於2020-06-04).
- ^ 5.0 5.1 Go and Dogma. research!rsc. [2017-01-14]. (原始內容存檔於2020-11-12).
for example both Go and Haskell need some kind of 「green threads」, so there are more shared runtime challenges than you might expect
- ^ Multithreading in the MRI Ruby Interpreter ~ Christoph Schiessl ~ Ruby on Rails and JavaScript Developer in Munich (München). [22 August 2016]. (原始內容存檔於2019-02-02).
- ^ Racket Places. [2011-10-13]. (原始內容存檔於2021-04-13).
Places enable the development of parallel programs that take advantage of machines with multiple processors, cores, or hardware threads. A place is a parallel task that is effectively a separate instance of the Racket virtual machine.
- ^ Stackless.com: About Stackless. [2008-08-27]. (原始內容存檔於2013-02-06).
A round robin scheduler is built in. It can be used to schedule tasklets either cooperatively or preemptively.
- ^ Tcl event loop. [6 December 2015]. (原始內容存檔於2018-10-11).