在进程vs作业对象上设置优先级和处理器关联

时间:2012-05-03 22:27:25

标签: .net process affinity

在.NET处理器中,可以使用Process.ProcessorAffinityProcess.PriorityClass属性设置所有线程和子进程的亲缘关系和优先级。使用job object似乎可以使用JOB_OBJECT_LIMIT_AFFINITYJOB_OBJECT_LIMIT_PRIORITY_CLASS标记设置相同的内容。

那么,在工作对象和流程之间设置上述某些限制之间的区别是什么?

编辑:一旦我将作业对象的限制设置为较低的值,低级别的进程仍然可以覆盖它们。这是否意味着工作对象限制没有得到加强?如何限制低负债的帐户/流程覆盖它们?

设置内容:


JOBOBJECT_BASIC_LIMIT_INFORMATION jobBasicInfo = {0};
jobBasicInfo.LimitFlags = JOB_OBJECT_LIMIT_AFFINITY;
jobBasicInfo.Affinity = (ULONG_PTR) (1);  // affinitize to processor 1
jobBasicInfo.LimitFlags = JOB_OBJECT_LIMIT_SCHEDULING_CLASS;
jobBasicInfo.SchedulingClass = 4;         // below normal priority class
SetInformationJobObject( hJob,
      JobObjectBasicLimitInformation,
      &jobBasicInfo,
      sizeof(jobBasicInfo));

如何通过低权益流程覆盖:


Process process = Process.GetCurrentProcess();
process.PriorityClass = ProcessPriorityClass.High;
// all processors mask
process.ProcessorAffinity = new IntPtr((int)Math.Pow(2, Environment.ProcessorCount) - 1);

1 个答案:

答案 0 :(得分:2)

有一个很大的区别和一些特殊情况。最大的区别是作业对象的限制只是:限制,同时设置例如进程优先级始终立即生效。将限制进程优先级高(作业对象)并将设置为高(PriorityClass)并不相同。当一个过程试图给予自己比工作对象更大的余地时,会出现特殊情况;在这种情况下,相关的API调用返回成功但实际上什么也不做,这不是正常的行为。