以前做过一项关于Windows7下的进程、线程优先级的研究工作,现在回过头来进行梳理一下。
跑到Stack Overflow网站上搜索相关标题“Does changing process priority have any effect?”。
16年前几个老外就已经开始讨论这些问题了,大概是说进程优先级别是否影响到当前进程占用CPU的时间。举个例子,他正在看一个视屏或者玩游戏,因为卡顿,把游戏或者视频软件的优先级提高,却没有显著效果。
在《windows核心编程》书籍中查看到有关进程优先级调度算法的资料:
优点:可以精确定义每个进程的相对重要性。
缺点:如果高优先级进程占用大量CPU的时间,低优先级的进程可能会饿死并无期限推迟,从而导致饥饿。
此外,个人在公司的破机子上进行测试:
写个死循环加法程序,开启10个这样的死循环进程(优先级都是Normal,营造一种cpu被100%使用的环境)。打开我司的程序(优先级为Normal)跑一个刀路,相比cpu充裕的情况下,从加工轨迹界面上看,仿真雕刻每隔一段字就会卡一下。将程序进程优先级设置为High,跑刀路时加工轨迹界面就不卡了。
在《windows核心编程》中还提到:
线程分两部分:
一、线程的内核对象,操作系统用它管理线程。系统还用内核对象来存放线程统计信息的地方。
二、线程栈,用于维护线程执行时所需的所有函数参数和局部变量。
三、windows下的每个线程都被赋予0(最低)~31(最高)的优先级数。
饥饿:在可调度线程组中,只要有高优先级的,系统就会把时间片给搞优先级线程,低优先级线程无法运行。
其实线程也有优先级的区分,进程的优先级最终作用在线程身上,进程优先级 X与线程优先级组合成了每个线程的优先级数。
这里我列一下进程优先级及其描述:
| 级别名 | 描述 |
| AboveNormal | 指定进程的优先级在Normal之上,但在High之下。 |
| BelowNormal | 指定进程的优先级在Idle之上,但在Normal之下。 |
| High | 指定进程执行必须立即执行的时间关键任务,如Task List对话框,不管操作系统的负荷如何,用户调用该对话框后均必须迅速响应。该进程的线程优先于普通或空闲优先级类进程的线程。指定时使用格外小心High有关进程的优先级类,因为高优先级类应用程序可以使用几乎所有可用的处理器时间。 |
| Normal | 指定进程没有特殊的安排需求。 |
| RealTime | 指定进程拥有可能的最高优先级。与进程的线程RealTime优先级的线程优先于所有其他进程,包括执行重要任务的操作系统进程。因此,RealTime执行有关的详细信息不是非常简短的时间间隔可能导致磁盘缓存不刷新,或导致鼠标无法响应的优先级进程。 |
| Idle | 指定此进程的线程只能在系统空闲时运行,如屏幕保护程序。更高优先级类中运行的任何进程的线程都优先于此进程的线程。 |
就进程而言,优先抢占CPU资源的能力大小是:RealTime>High>AboveNormal>Normal>BelowNormal>Idle。
既然进程最终影响到的是线程,后续工作又调查了一下软件中各个线程及其优先级。
这里介绍一下windows下如何查看某个进程的当前运行时有几个线程:
解压后把pslists.exe复制到C:\windows\System32目录下,dos窗口输入pslist,会弹出窗口提示同意并安装,安装后立马会列举出所有的进程列表。
cmd执行pslist -dmx <pid>即可。
第二种方法是找个叫做ConcurrentVisualizer工具,安装后通过vs的分析->并发可视化工具(需要将公司的破杀毒软件、360软件关闭),虽然能定位到线程,但是抓取的数据不能定位线程在哪个地方。
本文探讨了Windows环境下进程与线程优先级的影响,包括不同优先级的定义及对CPU资源分配的作用,通过实验验证了优先级对程序性能的影响,并介绍了查看线程数量的方法。
2478

被折叠的 条评论
为什么被折叠?



