簡體   English   中英

如何強制兩個Java線程在同一處理器/核心上運行?

[英]How to force two Java threads to run on same processor/core?

我想要一個不包含關鍵部分或類似同步替代方案的解決方案。 我正在尋找類似於Windows的光纖(用戶級線程)的東西。

操作系統管理在哪個核心上處理哪些線程。 您需要將線程分配給OS中的單個核心。

例如。 在Windows上,打開任務管理器,轉到進程選項卡並右鍵單擊java進程...然后將它們分配給特定的核心。

這是你將獲得的最好的。

據我所知,你無法實現這一目標。
僅僅因為操作系統管理正在運行的線程並根據它的調度程序分配資源。

編輯:
由於你的目標是有一個“備用”核心來運行其他進程,我建議你使用一個線程管理器並獲得系統上的核心數量(x),然后在特定系統上產生大多數x-1個線程。 這樣你就可以獲得備用核心。

前面的語句仍然適用,除非您在操作系統中指定,否則您無法指定運行線程的核心。 但是從java,沒有。

如果沒有將整個JVM分配給單個核心,我不確定你是如何做到這一點的。 在Linux中,您可以使用taskset:

http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

我想你可以在虛擬化環境(例如,VirtualBox / VMWare實例)中運行你的JVM並分配一個處理器,但我不確定那能得到你想要的東西。

我讀這是為了詢問Java應用程序是否可以控制線程親和性本身。 Java沒有提供任何方法來控制它。 它被視為主機操作系統的業務。

如果有什么可以做的話,操作系統可以,而且他們通常可以,盡管您用於線程固定的工具將是特定於操作系統的。 (但如果操作系統本身是虛擬化的,那么有兩個級別的固定。我不知道這是否會起作用/實用。)


現代JVM中似乎沒有任何相關的Hotspot JVM線程調整選項。

如果您使用的是Rockit JVM,您可以在“本機線程”(Java和OS線程之間存在1-1映射)和“細線程”之間進行選擇,其中多個Java線程被復用到少量OS線程上。 但AFAIK,JRocket“細線程”僅支持32位模式,並且它們不允許您調整所使用的OS線程數。

這實際上是你應該根據Sun支持合同提出的問題。 他們有多年來一直在想辦法如何從大型Java應用程序中獲得最佳性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM