Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改线程';s靶核_Java_Multithreading_Cpu Usage_Cpu Cores - Fatal编程技术网

Java 更改线程';s靶核

Java 更改线程';s靶核,java,multithreading,cpu-usage,cpu-cores,Java,Multithreading,Cpu Usage,Cpu Cores,告诉线程以编程方式更改其正在处理的核心的方式是什么 假设我使用的是FX-8150,它有一些内核,但我希望我的一个线程能够在5.5内核中工作。这可能吗?如果是的话,你能给我一个Java的例子吗?该线程可以是另一个进程线程或当前进程线程 我的伪示例: time interval 1 : my_thread working in first core at 5GHz while other cores are 3.6 GHz time interval 2 : my_thread working in

告诉线程以编程方式更改其正在处理的核心的方式是什么

假设我使用的是FX-8150,它有一些内核,但我希望我的一个线程能够在5.5内核中工作。这可能吗?如果是的话,你能给我一个Java的例子吗?该线程可以是另一个进程线程或当前进程线程

我的伪示例:

time interval 1 : my_thread working in first core at 5GHz while other cores are 3.6 GHz
time interval 2 : my_thread working in second core at 5GHz while other cores are 3.6 GHz
time interval 3 : my_thread working in third core at 5GHz while other cores are 3.6 GHz
time interval 4 : my_thread working in fourth core at 5GHz while other cores are 3.6 GHz
time interval 5 : my_thread working in fifth core at 5GHz while other cores are 3.6 GHz
time interval 6 : my_thread working in sixth core at 5GHz while other cores are 3.6 GHz
time interval 7 : my_thread working in seventh core at 5GHz while other cores are 3.6 GHz
time interval 8 : my_thread working in eighth core at 5GHz while other cores are 3.6 GHz
所有其他内核都需要空闲。

我有一个名为的库,它允许您将正在运行的线程分配给逻辑线程或内核

在您的情况下,您需要为操作系统至少允许一个内核,并且您可以在Linux中保留所有剩余的内核。线程库将线程分配给这些保留核心。需要保留cpu的原因是为了防止其他线程在该cpu上运行。您可以告诉库为逻辑cpu或整个内核分配一个线程。您可以将线程分配到与另一个线程相同或不同的内核或套接字上


该库当前支持Windows和Linux。

假设您使用的是Windows 7。在Task Manager中找到流程,右键单击它,选择set affinity,选择要使用的核心

编程方式:

通过在与程序相同的文件夹中创建一个.bat批处理文件,可以永久设置程序的关联性,文件内容如下:

start /affinity 1 program_name.exe

start /affinity 1 <invoke your_java_program>
start/affinity 1程序\u name.exe
启动/关联1
这将强制程序仅使用cpu核心0。使用/亲和力2。。。指定cpu核心1等

然后,您应该修改程序的“开始”菜单和/或桌面快捷方式,以指向新创建的批处理文件

一个小小的缺点是,在程序打开之前,您会看到屏幕上有一个小小的cmd窗口短暂闪烁

为了获得额外的性能,您可以添加/high以赋予应用程序更高的cpu优先级

start /affinity 1 /high program_name.exe
start /affinity 1 <invoke your_java_program>
start/affinity 1/high program_name.exe
启动/关联1

这种特定于体系结构的操作级别肯定不是标准Java的一部分。如果你能在C语言中实现这一点,那么你就可以进行JNI调用。你说的是作为库还是在java中包含C语言?你为什么要这么做?我认为操作系统最好地完成了这项工作。我是说,您可以使用JNI调用C(或其他语言),并且可以做您想要做的事情。任何操作系统都有能力将单个线程的时间分离到所有核心上?好吧,看看pdf文件,这在程序中是否是动态的,就像每秒更改线程核心10-100次一样?理论上,但如果不这样做,可能会大大损及性能。通过防止cpu上的上下文切换,以确保线程始终在“热”缓存中运行,从而获得最佳结果。您的意思是,当一个内核太热时,会更改为其他内核,但该内核可能已经加热到某种程度,而缓存故障是坏的?它不会立即复制缓存,是吗?我指的是l2或独立的。我不是指温度方面的热。我的意思是,在分支预测方面,指令和数据缓存都填充了它们所需的数据。如果没有这个,一个线程可以运行2-5倍的速度。我需要它的编程请,假设每秒更改100次,则加热效果将被分离到所有内核,而不是单个内核。通过允许您的程序每秒完成并再次启动100次来更改亲和力将调用大量开销,这取决于您的程序开始工作所需的时间。