我試圖找到現實世界的例子,在這些例子中,在單核上運行執行緒與跨越多個核相比可能有更多優勢。
跨內核生成執行緒與在同一內核中生成執行緒是否存在成本。
java(或作業系統)如何確定何時在特定內核上分配作業。
最后,有沒有一種方法可以明確指定執行緒應該在特定核心上運行還是該作業系統級別已確定?
uj5u.com熱心網友回復:
如果邏輯受 CPU 限制,則每個內核只需要一個執行緒,因為同一內核上的多個受 CPU 限制的執行緒會因背景關系切換、冷快取等而導致浪費。 如果執行緒不受 CPU 限制,而是受 I/O 限制,每個核心使用多個執行緒可能是有益的。但這取決于架構,例如,在 Seastar/Scylla 等每核執行緒架構中,您仍然希望每個內核有一個執行緒。
Java 不做任何事情來確定執行緒如何映射到內核。這是作業系統的任務,因為 Java 執行緒系結到本機執行緒。
在 Java 中,沒有將執行緒固定到內核的開箱即用的解決方案。但是您可以為此使用 taskset 或使用 Peter Lawrey 的庫之一:
https://github.com/OpenHFT/Java-Thread-Affinity
uj5u.com熱心網友回復:
java(或作業系統)如何確定何時在特定內核上分配作業。
目前在基于 OpenJDK 的 Java 實作中,Java 執行緒與主機作業系統執行緒一對一映射。因此,每個平臺(macOS、Linux、BSD、Windows、AIX 等)上的主機作業系統都會安排每個 Java 執行緒在它認為合適的內核上執行。
作為 Java 程式員,我們無法直接控制 Java 執行緒的執行時間。我們也不控制哪個內核執行執行。
有沒有辦法明確指定執行緒應該在特定核心上運行
不,不是在 Java 中。
跨內核生成執行緒與在同一內核中生成執行緒是否存在成本。
我們不能將我們的 Java 執行緒限制為特定的內核。所以你問題的第二部分沒有意義。
至于產生執行緒的成本,是的,當前的 Java 成本很高。執行緒當前使用相當多的記憶體(堆疊分配)和 CPU 時間(當 Java 代碼阻塞時,CPU 內核可以閑置)。
Project Loom 旨在大大降低此成本。他們努力的主要推動力是虛擬執行緒,也稱為纖維。Project Loom 技術的實驗版本現已推出,基于早期訪問的 Java 18。要了解更多資訊,請觀看 Loom 團隊成員(如 Ron Pressler 和 Alan Bateman)最近的演示和采訪視頻。
要了解有關 Java 執行緒的更多資訊,請閱讀 Brian Goetz 等人的這本優秀書籍:Java Concurrency In Practice。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/381454.html
