0

在 .NET 中,所有线程和子进程的处理器关联和优先级类都可以使用Process.ProcessorAffinityProcess.PriorityClass属性进行设置。使用作业对象似乎可以使用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);
4

1 回答 1

2

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

于 2012-05-03T22:43:47.257 回答