2013-03-28 3 views
3

사용자 지정 작업 스케줄러를 작성 중이며 Mono (Linux에서 실행 중)에서 현재 스레드에 대한 프로세서 선호도를 설정하는 방법이 있는지 알고 싶습니다. .Mono (Linux)에서 현재 스레드에 대한 프로세서 선호도 설정

Windows에서 실행되는 .NET 런타임의 경우 Lenard Gunda의 Running .NET threads on selected processor cores 문서에 따라 작동하도록했습니다.

  1. 는 그것은 P /을 Kernel32.dll 라이브러리에 GetCurrentThreadId에 전화를 호출 필요하기 때문에, 그의 접근 방식은 모노 (및 Linux)에 실패합니다.
  2. Process.Threads 속성은 현재 Mono에서 빈 컬렉션을 반환합니다.

아무도이 문제를 해결할 수 있습니까?

답변

2

lupus의 대답은 올바른 방향 이었지만 구현하기 위해서는 더 많은 연구가 필요했습니다 (예 : P/Invoke signature for sched_setaffinityresolution of libc.so.6). 다음의 경우 사람의 작업 코드 (제외 오류 처리는) 그것은 필요가있다 :

[DllImport("libc.so.6", SetLastError=true)] 
private static extern int sched_setaffinity(int pid, IntPtr cpusetsize, 
              ref ulong cpuset); 

private static void SetAffinity(int processorID) 
{ 
    ulong processorMask = 1UL << processorID; 
    sched_setaffinity(0, new IntPtr(sizeof(ulong)), ref processorMask); 
} 

편집 : 위의 서명이 내 실험을 위해 잘 작동하지만, 제안 보정 (내 다른 질문에서) David Heffernan's answer 참조 .

2

작업이 실제로 실행되는 시점을 제어 할 수 없다는 점은 커널에 달려 있다는 점에 유의하십시오. 어쨌든, Linux에서는 sched_setaffinity()를 호출하여 특정 CPU로 스레드를 바인드해야합니다.

인터페이스에 man sched_setaffinity를 참조하십시오.

관련 문제