2018年7月2日

Green Process, Green thread, Native Process

在某個作業系統中,要達到 multitasking 的能力,必須要由 OS 提供建立 thread 或是 process 分別處理不同工作的 library,thread 跟 process 的最大差異是,thread 是在一個 process 裡面運作,多個 thread 之間可以共享資料。

而 Green Thread 是 Java VM 裡面的特殊用語,當時 Java VM 是利用 libthread.so 發展支援多工的專案,該專案名稱為 "Green",所以就稱為 Green Thread。

至於有人寫說 Erlang VM 的多工是採用了 Green Process,這就像是借用了 Green Thread 跟 Native Process 的概念,因為 Erlang 的 Process 之間不能共享資料,而又跟 Java 一樣本身是 VM,所以就借用了 "Green",稱為 Green Process。

有個比 Green Process 更一般化的名詞為 Light-weight process,他會以單一個 kernel thread 實作,運作在 user space,且會共享 memory address space。

Green threads wiki 中明確的下了定義,只要是取代 OS 原生的機制,透過 runtime library 或是 VM,進行 thread 的 scheduling 處理,這種 thread 就稱為 Green Thread。Green Thread 會在 user space 而不是 kernel space 運作,讓多工服務不需要 native thread 的支援。

但現今的 Java VM 其實也已經放棄了 Green Thread,而改回使用 native thread。原因在於運作的速度,在抽象化 thread 多工模型時,耗費了太多精力,再加上新的多核心 CPU,如果要完全運用所有CPU核心的運算能力,也就是 SMP,透過 OS 的 thread 機制會是最簡單且快速的,因此現在的 VM 都是直接映射到 OS 的 thread,再搭配 Thread Pool 的做法,可減少 Thread 建立跟銷毀所消耗的資源。


References

What other systems beside Erlang are based on “Green Processes”?

What's the difference between “green threads” and Erlang's processes?

What is the difference between multicore programming in Erlang and other language?

Erlang調度器的一些細節以及它重要的原因(譯文)

Why not Green Threads?

Java的Green threads是Coroutine嗎?