![操作系统是否定期重新计算进程优先级?](https://linux22.com/image/1500584/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%98%AF%E5%90%A6%E5%AE%9A%E6%9C%9F%E9%87%8D%E6%96%B0%E8%AE%A1%E7%AE%97%E8%BF%9B%E7%A8%8B%E4%BC%98%E5%85%88%E7%BA%A7%EF%BC%9F.png)
我有一个关于 win-7 计划和进程优先级的问题。
场景是:我有一个正在运行的进程,最初的优先级是“正常”
我发现此过程经常被降级为后台(低 I/O)。我最终将优先级重新设置为“正常”或“高于正常”,但几分钟后优先级又会降低。
我曾尝试使用标准 Windows 任务管理器或 procexp 设置优先级(我猜应该没有区别)。
因此,问题是:是否重新计算进程优先级以覆盖其 I/O 使用量?这种情况下的进程是 Visual Studio 2015,它使用了相当多的 HDD,这可能是这里的瓶颈。
答案1
据我所知,除非得到指示,否则 Windows 操作系统不会更改进程的优先级。但是,这并不意味着正在运行的程序无法更改优先级。有一个名为 Process.PriorityClass 的 .NET 属性可以更改优先级。也许,VS 正在确定它可以减少其 CPU 使用率,以便为其他线程提供更多的 CPU 时间?
答案2
答案3
据我所知,Windows 不会自动调整过程优先事项。
更改进程的优先级会设置进程中所有线程以及随后在进程中创建的所有线程的“基本优先级”。 (见我的回答这里了解这种关系的描述。)
Windows 会调整线程根据其最近的活动。例如,在完成 I/O 后,线程的优先级将提升至高于其基准的水平,提升量由设备的功能设备驱动程序确定。在每个时间片结束时,如果线程以提升的优先级运行,其优先级将“衰减”1,直到降至基准优先级。它不会衰减至基准以下。
这在线程调度章节中有记录Windows 内部原理作者:所罗门·鲁西诺维奇·伊内斯库等人。
但这与您报告的情况不符,因为 1)所有这些线程优先级的提升和衰减的结果根本没有显示在任务管理器中(因为任务管理器报告的是进程优先级,而不是线程优先级);2:这种机制绝不将线程的优先级降低到其基本优先级以下。基本优先级是更改进程优先级时设置的。
这可能是 Visual Studio (deveng.exe) 自身发生的情况。您是否发现其他进程也发生这种情况?
可以使用 Windows 性能工具包来调查此事。
答案4
在您描述的情况下调整进程优先级并不罕见。
为了简化问题,我们这样来思考一下:优先级越高通常意味着进程“唤醒”的频率比优先级越低的进程高(以执行某些工作)。考虑到您的进程正在执行大量(随机)磁盘 IO,将其保持在高优先级意味着它会经常“唤醒”,结果发现自己正在等待磁盘返回数据。由于进程切换可能是一项昂贵/耗时的操作,因此降低磁盘密集型进程的优先级可以提高处理器利用率。换句话说,通过调整进程优先级,处理器可以花更多时间执行工作,而不是花时间在进程之间切换。
我认为 VS 或流程本身更有可能正在重新调整优先级。