【Linux系统编程】进程的优先级

简介: 【Linux系统编程】进程的优先级

介绍


      进程访问系统资源要排队等待,而cpu资源分配和执行的先后顺序,就是指进程的优先级。进程的优先级,保证了必要进程的执行。


系统进程的查看


       Linux中,ps -l 命令会把当前用户启动的所有进程全部显示出来。其中,对应的消息有下:


               UID : 代表用户的ID,即启动这些进程的用户


               PID : 进程的编号


               PPID :父进程的编号


               PRI :代表此进程可被执行的优先级,它对应的是一个整型数字,其值越小越早被执行


               NI :代表这个进程的nice值


       这里重点说明一下PRI和NI。Linux默认的优先级是80。这个数据可以被更改,但优先级的范围是[60,99],也就是说最大为99,最小为60,数字越小,优先级越高。


       上面的NI是用来修改进程的优先级。进程的优先级不能直接修改,必须通过修改NI的数值来间接修改优先级,它表示进程可被执行的优先级的修正数值,具体修改如下。


进程优先级的修改


       修改优先级的命令是top。在Linux中,top指令是一个常用的性能分析工具,可以实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器,提供了实时的对系统处理器的状态监视。


       当我们使用 top 后,输入 “ r ” 将会更改指定PID进程的优先级,具体实现如下。


[zhu@zhujunhao day]$ ps -la
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  1228  1200  0  80   0 - 47970 do_wai pts/0    00:00:00 su
4 S  1001  1229  1228  0  80   0 - 29156 do_wai pts/0    00:00:00 bash
4 S     0  1395  1372  0  80   0 - 47970 do_wai pts/1    00:00:00 su
4 S  1001  1396  1395  0  80   0 - 29156 do_wai pts/1    00:00:00 bash
0 S  1001  2302  1396  0  80   0 -  3307 hrtime pts/1    00:00:00 code.exe
1 S  1001  2303  2302  0  80   0 -  3307 hrtime pts/1    00:00:00 code.exe
0 R  1001  2304  1229  0  80   0 - 38332 -      pts/0    00:00:00 ps
//可观察到2302的PRI为80
[zhu@zhujunhao day]$ top
.........
//输入“ r ”后出现以下框架,这里我们修改PID为2302的进程
PID to renice [default pid = 965] 2302
//然后回车确定,将会出现以下框架,这里我们将优先级的数值增加10
Renice PID 2302 to value 10
.........
[zhu@zhujunhao day]$ ps -la  //再次查看
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  1228  1200  0  80   0 - 47970 do_wai pts/0    00:00:00 su
4 S  1001  1229  1228  0  80   0 - 29156 do_wai pts/0    00:00:00 bash
4 S     0  1395  1372  0  80   0 - 47970 do_wai pts/1    00:00:00 su
4 S  1001  1396  1395  0  80   0 - 29156 do_wai pts/1    00:00:00 bash
0 S  1001  2302  1396  0  90   10 -  3307 hrtime pts/1    00:00:00 code.exe  //NI变为10
1 S  1001  2303  2302  0  80   0 -  3307 hrtime pts/1    00:00:00 code.exe
0 R  1001  2304  1229  0  80   0 - 38332 -      pts/0    00:00:00 ps
//可观察到2302的PRI为90

      总的来说,修改步骤:进入top后按“r”–>输入进程PID–>输入nice值


       注意:Linux允许用户修改优先级,但这里的修改优先级的数值不是让我们直接修改的,而是通过修改NI的数值来修改。这里的NI不是优先级,而是进程优先级修正的数据,即优先级:PRI = PRI + NI(这里PRI + NI的PRI是系统默认的优先级数值,即80)。前面输入的10就是NI的数值。这里设置NI的数值可以为负数,如在刚才的基础上再次修改为-10,此时的PRI = 70,NI = -10,设为0时即将PRI值还原。也就是说当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行;当nice值为正值的时候相反。


       这里修改优先级的数值不是随心所欲的修改,系统会自动根据优先级范围进行判断,若修改后的优先级数值小于60,那么系统赋予优先级的数值为60;若修改后的优先级数值大于99,那么系统赋予优先级的数值为99。因此,可知,NI的范围是[-20,19],一共40个级别。


       系统的这种设置完美地解决了个别进程优先级过高或过低,避免了进程饥饿的问题。


进程的调度与切换


       当进程放在CUP上运行时,并不是把进程代码跑完才结束此进程。这样做是为了防止进程代码凌乱而导致其它进程不能被及时执行。因此,现代操作系统,都是基于时间片进行轮转执行的。在时间片轮转调度中,每个进程被分配一个固定长度的时间片,用于执行其任务。


       进程的时间片是操作系统中用于实现时间片轮转调度的一个核心概念。当时间片用完时,操作系统会保存该进程的状态,然后切换到下一个进程,给予它一个时间片来执行。这个过程会不断循环,使得每个进程都有机会得到执行,从而实现并发执行的效果。


系统优先级之间的性质


       进程之间既然存在优先级,那么它们之间在被CPU执行的时候必然存在各种性质,保证进程之间正常进行。


       竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间具有竞争属性很正常。竞争性跟优先级有关,优先级越高,进程的竞争性越大,竞争性可以说是优先级的体现。


       独立性:独立性指多进程运行时,各种进程独享各种资源,多进程运行期间互不干扰


       并行:表示多个进程在多个CPU下分别,同时进行运行。这种状态在普通计算机中很少见,因为普通计算机一般只有一个CPU。


       并发:表示多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进。


       这里重点说一下并发。并发情况是很常见的情况,如同我们平常启动多个程序时进入的情况。当多个进程启动时,系统内部形成运行队列后就会根据优先级进行运转,进程在运行的过程中会产生大量的临时数据放在CPU的寄存器中,而这些临时数据叫做进程的硬件上下文。硬件上下文将进程的数据保存,当 CPU 再次调度进程时,硬件上下文会被恢复到该进程上一次离开时的状态。这样,进程就可以从它之前离开的地方继续执行,而不会丢失其执行上下文。


       这里要注意,CPU内的寄存器只有一套,但寄存器内部保存的数据可以有多套,每套保存的数据都是私有的。


目录
打赏
0
0
0
0
1
分享
相关文章
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
137 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
121 13
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
357 1
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
4月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
520 2
|
4月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第5天】麒麟系统mate-indicators进程占用内存过高问题解决
331 0
MacOS环境-手写操作系统-34-进程优先级
MacOS环境-手写操作系统-34-进程优先级
48 0
深入理解操作系统:进程调度与优先级反转问题
【9月更文挑战第36天】操作系统是计算机科学中的核心概念,它管理着计算机的硬件资源和软件进程。在多任务处理环境中,进程调度是保证系统高效运行的关键机制之一。本文将探讨进程调度的基本概念、调度算法以及它们如何影响系统性能。同时,我们还将讨论优先级反转问题,这是一个在实时系统中常见的问题,它可能导致系统响应时间不可预测。通过分析优先级反转的原因和解决方案,我们可以更好地理解操作系统的设计和优化策略。
【原创】用Delphi编写系统进程监控程序
【原创】用Delphi编写系统进程监控程序

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等