在.NET处理器中,可以使用Process.ProcessorAffinity
和Process.PriorityClass
属性设置所有线程和子进程的亲缘关系和优先级。使用job object似乎可以使用JOB_OBJECT_LIMIT_AFFINITY
和JOB_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);
答案 0 :(得分:2)
有一个很大的区别和一些特殊情况。最大的区别是作业对象的限制只是:限制,同时设置例如进程优先级始终立即生效。将限制进程优先级高(作业对象)并将将设置为高(PriorityClass
)并不相同。当一个过程试图给予自己比工作对象更大的余地时,会出现特殊情况;在这种情况下,相关的API调用返回成功但实际上什么也不做,这不是正常的行为。