.net 以低优先级运行或设置进程

.net 以低优先级运行或设置进程,.net,vb.net,process,.net,Vb.net,Process,我正在尝试以低优先级运行进程。但我在ProcessPriorityClass中没有将其设置为低的选项。但如果我转到任务管理器,我可以手动将流程优先级设置为低。那么如何做到这一点呢?下面是我用来将进程设置为低于正常优先级的代码 Dim s As New Process s.StartInfo.FileName = "D:\myapp.exe" s.Start() s.PriorityClass = ProcessPriorityClass.BelowNormal 我猜ProcessPriorit

我正在尝试以低优先级运行进程。但我在ProcessPriorityClass中没有将其设置为低的选项。但如果我转到任务管理器,我可以手动将流程优先级设置为低。那么如何做到这一点呢?下面是我用来将进程设置为低于正常优先级的代码

Dim s As New Process
s.StartInfo.FileName = "D:\myapp.exe"
s.Start()
s.PriorityClass = ProcessPriorityClass.BelowNormal

我猜
ProcessPriorityClass.Idle
在taskmanager中表示“低”

另请参见:

没有“低”值,尽管有
ProcessPriorityClass.Idle
由于某种原因,默认taskmanager称之为“低”(大多数其他任务管理器,如ProcessHacker或ProcessExplorer称之为“空闲”,如果你在玩弄流程,你可能会得到一个像样的任务管理器替代品,比如,而不是针对技术含量较低的用户的内置应用程序)

将进程设置为
ProcessPriorityClass.Idle
对我来说很好

但需要注意的是:更改进程的优先级级别通常是一个坏主意,尤其是从进程外部更改为空闲(至少在进程内部,您可以决定将某些任务的优先级更改得更高,然后将其重新设置)

如果进程以不可共享的方式获得任何资源,那么设置如此低的优先级可能会导致严重的死锁,因为当任何高优先级进程需要时间片时,它不会运行(特别是在核数较少的机器上,因为同时可用的时间片较少),因此如果高优先级进程也需要资源,它将永远等待获得它,因为低优先级进程将没有机会运行

最终,Windows(虽然不是一些早期版本)将通过临时提升低优先级进程中等待运行的所有线程的优先级,使其高于
ThreadPriority.
ProcessPriorityClass.High
进程中的最高
线程来解决这一问题,然后逐渐降低优先级,问题再次出现

这可能与您希望发生的情况相反

而且因为它在核心数很少的机器上特别残忍,如果你的开发装备很结实,你的机器上的一切都可以正常工作,然后那些机器不够结实的用户会发现他们的一切都停止了

默认情况下,只有一些中断,“系统空闲进程”(这是一个特例)以空闲状态运行,这是有充分理由的

不过,如果您确信自己知道自己在做什么(或者确实知道自己在做实验),那么
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。一次只能运行一个核心线程

如果要运行的线程数多于内核数,则按如下方式进行调度:

  • 从现有的最高优先级线程开始。在它们之间共享内核
  • 如果线程多于内核,则在它们之间循环使用内核,这样所有具有该优先级的线程都会获得相等的份额
  • 如果有剩余的内核,则对下一个优先级最高的线程执行相同的操作,依此类推
  • 因此,如果有4个内核,我们有3个线程优先级为8(例如,正常进程中的正常线程)、2个优先级为10(例如,正常进程中的正常线程)和3个优先级为6(空闲进程中的最高优先级线程),并且它们都已准备好运行:

  • 2个优先级为10的线程总是在一个内核上获得一个时间片
  • 其余2个内核将在3个普通/普通线程之间共享时间
  • 3个优先级为6的线程将没有机会运行
  • 这对这3个线程来说是不好的,但它对整个系统来说应该是好的,因为这3个线程只适用于那些重要性很低的事情,我们完全可以不运行它们

    这些数字还可以通过以下方式增加:

  • 如果前台窗口为普通进程所有,则在前台窗口打开时(桌面为普通,服务器为非普通),前台窗口将被提升到普通进程之外
  • 当一个窗口接收到鼠标、键盘或计时器输入,或者来自另一个窗口的消息时,它的进程会得到临时提升
  • 如果一个线程正在等待某个东西,而该东西已经准备好,那么它会得到提升
  • 如果一个线程已经准备好很长时间而没有运行,它可能会随机得到一个很大的提升
  • 其中前三个应该是合理的常识,因为很明显,人们可能希望提升这些进程或线程

    第四个是引入一个轻微的问题来修复一个严重的问题:如果线程a需要低优先级线程B拥有的资源,并且只有一个可用的内核,那么它们将死锁,因为线程B不会获得时间片,所以它不会释放资源,所以线程A会继续尝试获取资源,所以它不会结束,所以线程B不会获取时间片

    因此,操作系统将线程B提升为临时超高优先级,而线程A一点也看不到,从这一点到死锁导致的初始减速,整个系统的速度要比它应该的慢得多(拥有多核系统的实际优势之一不是让许多繁忙的进程更好地协同工作,而是使这种情况不太可能发生)

    所有这些的结果是,99%的时间里,线程的最佳优先级是正常的,而线程的最佳优先级是正常的