我想把一个进程设置为低优先级,但是在ProcessPriorityClass中没有选项可以把它设置为低优先级。但是如果我在任务管理器中手动将进程优先级设置为低,那么如何做呢?下面的代码是我用来将进程设置为低于正常优先级的。
Dim s As New Process
s.StartInfo.FileName = "D:\myapp.exe"
s.Start()
s.PriorityClass = ProcessPriorityClass.BelowNormal
我想把一个进程设置为低优先级,但是在ProcessPriorityClass中没有选项可以把它设置为低优先级。但是如果我在任务管理器中手动将进程优先级设置为低,那么如何做呢?下面的代码是我用来将进程设置为低于正常优先级的。
Dim s As New Process
s.StartInfo.FileName = "D:\myapp.exe"
s.Start()
s.PriorityClass = ProcessPriorityClass.BelowNormal
“Low”值不存在,尽管有一个被默认任务管理器称为“Low”的ProcessPriorityClass.Idle
(大多数其他任务管理器如ProcessHacker或ProcessExplorer将其称为“Idle”,如果你想要玩弄进程,你应该获取一个像ProcessHacker这样的体面任务管理器替代品,而不是针对非技术用户的内置应用程序)。
对我来说,将一个进程设置为ProcessPriorityClass.Idle
没有问题。
但请注意:更改进程的优先级类通常是一个坏主意,特别是更改到idle,并且是从进程外部进行操作(至少从内部你可以决定为某些任务提高优先级,然后再将其设置回来)。
将优先级设置得太低可能会导致恶心的死锁,如果进程以不可共享的方式获得任何资源,因为当任何较高优先级的进程需要时间片时,它将无法运行(特别是在具有少量核心的机器上,因为同时可用的时间片较少),因此如果较高优先级的进程也需要一个资源,就会一直等待它,因为较低优先级的进程没有机会运行。
最终,Windows(虽然不是某些早期版本)将通过临时提高等待运行的较低优先级进程中的所有线程,使它们高于ProcessPriorityClass.High
进程中的ThreadPriority.Highest
线程,并逐渐让它们降低到较低的优先级,在那时问题再次发生。
这可能与你想要发生的相反。
而且,因为它对少量核心的机器特别残酷,如果你的开发装备很强大,你可能会出现在你的机器上一切正常的情况下,然后用户在机器性能较弱的情况下会发现一切都变得非常缓慢。
默认情况下,只有一些中断和“System Idle Process”(它是一个特殊情况)在空闲时运行,这是有很好的理由的。
但是,如果你确定自己知道自己在做什么(或者确实在进行实验),那么s.PriorityClass = ProcessPriorityClass.Idle
就是你想要的。
编辑:关于优先级的更多信息:
给定线程具有相对于进程中其他线程的优先级,给定进程相对于系统上其他进程的优先级。
线程相对于系统上所有其他线程的优先级,取决于这两者,如下表所示:
Thread: | Idle | Lowest | Below | Normal | Above | Highest | Time-Critical
| | | Normal | | Normal | |
---------------+------+--------+--------+--------+--------+---------+--------------
Idle Process | 1 | 2 | 3 | 4 | 5 | 6 | 15
Below-Normal | 1 | 4 | 5 | 6 | 7 | 8 | 15
Normal Process | 1 | 6 | 7 | 8 | 9 | 10 | 15
Above-Normal | 1 | 8 | 9 | 10 | 11 | 12 | 15
High Process | 1 | 11 | 12 | 13 | 14 | 15 | 15
Realtime | 16 | 22 | 23 | 24 | 25 | 26 | 31
现在,任何一台计算机都将拥有X个核心,今天常见的值为1、2、4、8或16。每个核心每次只能运行一个线程。系统空闲进程
在空闲状态下运行一个特殊的进程有两个目的。第一个是由于始终有一个在空闲中运行的线程,每个核心都有一个相应的线程,因此调度程序不需要处理没有可运行线程的情况,因为总是有这样的一个线程,上述逻辑将在没有其他线程时运行其中之一。
第二个目的是这些线程可以调用核心具备的任何省电或低频能力,因为如果它们运行一段时间,则按定义CPU不需要,并且应处于低功耗状态。
重要的是,该进程永远不会获得任何其他进程可能需要的非共享资源,因此它永远不会引起优先级反转问题。
在这里,我们可以看到该进程的目的就是尽可能不让其运行,只要有任何其他线程有任务要执行。
(它还为我们提供了一个很好的低优先级衡量标准。如果它与存在仅仅用于将CPU置于低功耗状态的线程竞争时,则不应具有低优先级。)