0

.NETプロセッサでは、すべてのスレッドと子プロセスのアフィニティと優先度クラスは、プロパティを使用して設定できProcess.ProcessorAffinityますProcess.PriorityClassジョブオブジェクトを使用する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);
4

1 に答える 1

2

1 つの大きな違いといくつかの特殊なケースがあります。大きな違いは、ジョブ オブジェクトの制限がちょうど限界であるということです。一方、たとえばプロセスの優先度を設定すると、常にすぐに効果があります。プロセスの優先度を高く制限する (ジョブ オブジェクト) ことと、それを高く設定する ( ) ことは同じではありませんPriorityClass。特殊なケースは、プロセスがジョブ オブジェクトが許可するよりも大きな余裕を与えようとするときに発生します。この場合、関連する API 呼び出しは成功を返しますが、実際には何もしません。これは通常の動作ではありません。

于 2012-05-03T22:43:47.257 に答える