簡體   English   中英

如何使用Java Native Access為除Java.exe之外的進程設置進程關聯?

[英]How to use Java Native Access to set process affinity for processes besides Java.exe?

盡管手動操作相當容易,但我嘗試在初始創建時間后為各種VM自動設置Windows 7中的cpu親和性。 該項目是Java,我試圖避免直接包含C代碼,所以我一直在使用Java Native Access,它掩蓋了像winapi這樣的東西。 我是圖書館的新手,雖然通過快速谷歌搜索可以找到一些基本版本,但它在教程或示例中有點缺乏。

使用以下代碼,我可以設置主Java進程的親緣關系(本地ffffffffffffffff),但其他進程仍然完全不受影響,即使我有權使用任務管理器手動設置關聯。 我還迭代了從0到10000的所有整數,而不是只輸入我知道有效的id。

主要課程:

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinNT.HANDLE;

public class SetAffinity {
  public static void main(String[] args){
    int pid = -1;
    AffinityKernel instance = (AffinityKernel)Native.loadLibrary("Kernel32",AffinityKernel.class));
    System.out.println(instance.SetProcessAffinityMask(new HANDLE(new Pointer(pid)), 1));
  }
}

實用界面:

import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT.HANDLE;

public interface AffinityKernel extends Kernel32{
  public boolean SetProcessAffinityMask(HANDLE hProcess, int dwProcessAffinityMask);
}

因為我可以檢查它是否正確設置了它正在運行的進程的cpu親和性,我知道語法是正確的。

問題是:

除當前流程外,如何訪問/引用流程?

您正在尋找的另一個例程是OpenProcess ,它允許您獲取另一個進程的HANDLE,然后您可以在SetProcessAffinityMask使用該進程。 主叫簽名:

HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);

它已經在Kernel32接口中公開了。

已經提出使用JNA確定其他java進程的進程ID,這應該是可以理解的。

暫無
暫無

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

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