綠色執行緒

維基百科,自由的百科全書

電腦程式設計中,綠色執行緒是一種由運行環境虛擬機調度,而不是由本地底層作業系統調度的執行緒。綠色執行緒並不依賴底層的系統功能,模擬實現了多執行緒的運行,這種執行緒的管理調配發生在用戶空間而不是內核空間,所以它們可以在沒有原生執行緒支持的環境中工作。

詞源[編輯]

綠色執行緒的名稱來源於最初的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 版本中放棄了綠色執行緒,轉而使用原生執行緒。Squawk虛擬機英語Squawk virtual machine是一個例外,它是低功耗設備的作業系統和Java虛擬機的混合體。它使用綠色執行緒來保持機器語言的絕對最小並支持分離的遷移。Kilim和Quasar 是在隨後的 JVM 版本中通過修改Java 編譯器產生的字節碼來實現綠色執行緒的開源項目(Quasar 也支持 Kotlin 和 Clojure)。

其他語言的綠色執行緒[編輯]

還有一些其他的程式語言也實現了可以替代原生執行緒的綠色執行緒。例如:

Erlang 虛擬機中有一種有時候會被稱為『綠色執行緒』的東西,但是和我們討論的綠色執行緒有顯著地差異,將他稱為「綠色進程」可能更為合適。他們就像作業系統的進程(不像執行緒會共享系統資源),但在 Erlang 中是在 Erlang 運行系統(erts)中實現的。[來源請求]對與GHC Haskell,上下文切換發生在可配置的超時之後的第一次分配。 GHC執行緒也可能在其生命周期內的一個或多個OS執行緒上運行(GHC執行緒和OS執行緒之間存在多對多關係),允許在對稱多處理機器上實現並行性,而不會創建比成本更高的作業系統執行緒 需要在可用數量的內核上運行。Occam 在這個列表中是不尋常的,因為它的原始實現與 Transputer 綁定,因此不需要虛擬機。 後來在移植到其他處理器時引入了一個仿照Transputer設計的虛擬機,這是一個有效的選擇,因為涉及的開銷很小。大多數 Smalltalk虛擬機不對評估步驟進行計數,但是VM仍然可以搶占外部信號上的執行執行緒(例如即將到期的定時器或即將可用的I/O)。通常使用循環制輪轉調度機制,以便定期喚醒的高優先級進程來實現有效的分時分時搶占:

 [
    [(Delay forMilliseconds: 50) wait] repeat
 ] forkAt: Processor highIOPriority

其他實現方式,例如 QKS Smalltalk,總是採用分時的方式。 與大多數綠色執行緒實現不同,QKS Smalltalk也支持防止優先級反轉。

另請參閱[編輯]

參考資料[編輯]

  1. ^ CHICKEN Scheme. [5 November 2017]. (原始內容存檔於2020-12-23). 
  2. ^ thezerobit/green-threads. GitHub. [2016-04-08]. (原始內容存檔於2020-11-12). 
  3. ^ Application-level Stackless features — PyPy 4.0.0 documentation. [6 December 2015]. (原始內容存檔於2020-06-04). 
  4. ^ 4.0 4.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 
  5. ^ Multithreading in the MRI Ruby Interpreter ~ Christoph Schiessl ~ Ruby on Rails and JavaScript Developer in Munich (München). [22 August 2016]. (原始內容存檔於2019-02-02). 
  6. ^ 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. 
  7. ^ 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. 
  8. ^ Tcl event loop. [6 December 2015]. (原始內容存檔於2018-10-11).