Content deleted Content added
Haraldrudell (talk | contribs) |
improve wording, drop duplicate sentences |
||
(36 intermediate revisions by 19 users not shown) | |||
Line 1:
{{TOC limit|2}}
{{Short description|Computational threads scheduled by a run-time library}}
{{Distinguish|green thread}}
In [[computer programming]], a '''virtual thread''' is a [[Thread (computing)|thread]] that is managed by a [[runtime library]] or [[virtual machine]] (VM) and made to resemble "real" operating system thread to code executing on it, while requiring substantially fewer resources than the latter.
Earlier constructs that are not or not always preemptive, such as [[coroutine]]s, [[green thread]]s or the largely single-threaded [[Node.js]], introduce delays in responding to asynchronous events such as every incoming request in a server application.<ref>{{Cite web |last=Node.js |title=Don't Block the Event Loop (or the Worker Pool) |url=https://nodejs.org/en/docs/guides/dont-block-the-event-loop/ |access-date=2022-03-30 |website=Node.js |language=en}}</ref>
▲In [[computer programming]], '''virtual threads''' are [[Thread (computing)|threads]] that are scheduled by a [[runtime library]] instead of natively by the underlying [[operating system]] (OS). Virtual threads allows for tens of millions of preemptive tasks and events without swapping on a 2021 consumer-grade computer.<ref name="javaworld2">{{cite web |last1=Rudell |first1=Harald |date=2022-03-19 |title=massivevirtualparallelism |url=https://codeberg.org/haraldrudell/massivevirtualparallelism/src/branch/main/README.md |website= |quote= |df= |accessdate=}}</ref>, compared to low thousands of operating system threads<ref>{{Cite web |last=baeldung |date=2022-01-02 |title=Maximum Number of Threads Per Process in Linux {{!}} Baeldung on Linux |url=https://www.baeldung.com/linux/max-threads-per-process |access-date=2022-03-30 |website=www.baeldung.com |language=en-US}}</ref>. Preemptive execution<ref>{{Cite web |title=Go 1.14 Release Notes - The Go Programming Language |url=https://go.dev/doc/go1.14#runtime |access-date=2022-03-30 |website=go.dev}}</ref> is important to performance since constructs that are not preemptive, such as [[Coroutine|coroutines]] or the largely single-threaded [[Node.js]], introduce delays in responding to asynchronous events such as every incoming request in a server application<ref>{{Cite web |last=Node.js |title=Don't Block the Event Loop (or the Worker Pool) |url=https://nodejs.org/en/docs/guides/dont-block-the-event-loop/ |access-date=2022-03-30 |website=Node.js |language=en}}</ref>.
== Definition ==
* Preemption requires knowledge of multi-threaded programming to avoid torn writes, data races, and invisible writes by other threads.
==
Java servers have featured extensive and memory consuming software constructs allowing dozens of pooled operating system threads to preemptively execute thousands of requests per second without the use of virtual threads. Key to performance here is to reduce the initial latency in thread processing and minimize the time operating system threads are blocked.<ref>{{Cite web |title=Principles to Handle Thousands of Connections in Java Using Netty - DZone Performance |url=https://dzone.com/articles/thousands-of-socket-connections-in-java-practical |access-date=2022-03-30 |website=dzone.com |language=en}}</ref>
Virtual threads increase possible concurrency by many orders of magnitudes while the actual [[Parallel computing|parallelism]] achieved is limited by available execution units and pipelining offered by present processors and processor cores. In 2021, a consumer grade computers typically offer a parallelism of tens of concurrent execution units.<ref>{{Cite web |title=MacBook Pro 14-inch and MacBook Pro 16-inch |url=https://www.apple.com/macbook-pro-14-and-16/ |access-date=2022-03-30 |website=Apple |language=en-US}}</ref>
The many magnitudes of increase in possible preemptive items offered by virtual threads is achieved by the language runtime managing resizable thread stacks.<ref>{{Cite web |title=JEP draft: Virtual Threads (Preview) |url=https://openjdk.java.net/jeps/8277131#Memory-use-and-interaction-with-garbage-collection |access-date=2022-03-30 |website=openjdk.java.net}}</ref>
In order to support virtual threads efficiently, the language runtime has to be largely rewritten to prevent blocking calls from holding up an operating system thread assigned to execute a virtual thread<ref>{{Cite web |last=Szczukocki |first=Denis |date=2020-03-18 |title=Difference Between Thread and Virtual Thread in Java {{!}} Baeldung |url=https://www.baeldung.com/java-virtual-thread-vs-thread |access-date=2022-03-30 |website=www.baeldung.com |language=en-US}}</ref> and to manage thread stacks.<ref>{{Cite web |date=2018-04-12 |title=Why you can have millions of Goroutines but only thousands of Java Threads |url=https://rcoh.me/posts/why-you-can-have-a-million-go-routines-but-only-1000-java-threads/ |access-date=2022-03-30 |website=rcoh.me |language=en-us}}</ref>
== Complexity ==
Because virtual threads offer parallelism, the programmer needs to be skilled in multi-threaded programming and synchronization.
Because a blocked virtual thread would block the OS thread it occupies at the moment, much effort must be taken in the runtime to handle blocking system calls. Typically, a thread from
Management of the virtual thread stack requires care in the linker and short predictions of additional stack space requirements.
== Implementations ==
=== Google Chrome Browser ===
Virtual threads are used to serialize singleton input/output activities and available to developers extending the browser. When a virtual thread is executing, it can hop on a different OS thread.<ref>{{Cite
=== Go ===
Go's ''goroutines'' became preemptive with
Java introduced virtual threads in 2023 with Java 21, with the limitation that any code running on a virtual thread which uses ''synchronised'' blocks or native calls will become pinned to its carrier OS thread.<ref>{{Cite web |title=Virtual Threads |url=https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html |access-date=2024-09-10 |website=Oracle Help Center |language=en-US}}</ref> The former limitation was fixed in Java 24.<ref>{{Cite web |title=JEP 491: Synchronize Virtual Threads without Pinning |url=https://openjdk.org/jeps/491 |access-date=2025-03-30 |website=OpenJDK |language=en-US}}</ref>
== Other uses of the term ==
Intel<ref>{{Cite web |title=Intel Technology Journal |url=https://www.intel.com/content/dam/www/public/us/en/documents/research/2007-vol11-iss-4-intel-technology-journal.pdf}}</ref> in 2007 referred to an Intel compiler specific optimization technique as virtual threads.
▲=== Java Project Loom ===
== See also ==
Line 85 ⟶ 87:
* [https://codeberg.org/haraldrudell/massivevirtualparallelism/src/branch/main/README.md massivevirtualparallelism Go program testing limits on virtual threads]
[[Category:Threads (computing)]]
[[Category:Virtualization]]
▲{{Drafts moved from mainspace|date=April 2022}}
|