欢迎来到我的频道 【点击跳转专栏】
码云链接 【点此转跳】
文章目录
- [1. 进程优先级的基本概念](#1. 进程优先级的基本概念)
- [2. 查看系统进程](#2. 查看系统进程)
- [3. PRI and NI](#3. PRI and NI)
- [3.1 PRI](#3.1 PRI)
- [3.2 NI&&用top修改NI](#3.2 NI&&用top修改NI)
- [4 .与优先级有关的几个问题](#4 .与优先级有关的几个问题)
- [4.1 优先级无法更改问题?](#4.1 优先级无法更改问题?)
- [4.2 old pri是什么?](#4.2 old pri是什么?)
- [4.3 优先级范围是多少?](#4.3 优先级范围是多少?)
- [4.4 为什么是这个范围?](#4.4 为什么是这个范围?)
- [5. nice&&renice命令修改优先级](#5. nice&&renice命令修改优先级)
- [6. 函数方式修改优先级](#6. 函数方式修改优先级)
- [7. 补充概念-竞争、独⽴、并⾏、并发](#7. 补充概念-竞争、独⽴、并⾏、并发)
1. 进程优先级的基本概念
优先级vs权限
在权限 里,我们回答的是能不能的问题,在优先级 中,在进程已经能得到某种资源的前提下,优先级就是得到资源的先后顺序。
为什么要有优先级?
本质还是因为资源不足,分配资源的时候,就要合理分配,决定进程获得某种资源的顺序。
- 优先级就是cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能;同时还可以把进程运行到指定的CPU上,这样一来,把重要的进程安排到某个特定的CPU,可以大大改善系统整体性能。
2. 查看系统进程
在linux或者unix系统中,⽤ps ‒l命令则会类似输出以下⼏个内容:
-l :以长格式显示进程详细信息(包括 F、S、UID、PID、PPID、C、PRI、NI、ADDR、SZ、WCHAN、TTY、TIME、CMD 等)

- UID: 代表执行者的身份
我们通过
ls -ln可以 长格式列出文件和目录的详细信息,并以数字形式 显示用户 ID(UID)和组 ID(GID),而不是用户名和组名
上面的
UID就是进程执行这个的用户ID
- PID: 代表这个进程的代号
- PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
- PRI:代表这个进程可被执行的优先级,其值越小越早被执行。
- NI:代表这个进程的nice值。
PRI和NI与进程的优先级有关,都属于struct_task的一个属性。
3. PRI and NI
3.1 PRI
PRI也还是比较好理解的,即进程的优先级 ,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高 ;系统不允许 你直接修改 PRI 的数值。
3.2 NI&&用top修改NI
NI,就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值。
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice- 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行; 所以,调整进程优先级 ,
在Linux下,就是调整进程nice值。 - nice其取值范围 是
-20至19,一共40个级别。
⽤top命令更改已存在进程的nice:
- top
- 进⼊
top后按"r"‒>输⼊进程PID‒>输⼊nice值修改前:
修改时:
修改后:
4 .与优先级有关的几个问题
4.1 优先级无法更改问题?
更改优先级是无法高频更改的 当我们短时间内多次更改优先级,系统会拒绝你更改,可以用超级用户进行修改,同时也可能和权限有关
- 普通用户:只能降低自己进程的优先级;
- root 用户 :可以任意设置 NI 值(包括负值)。
4.2 old pri是什么?
old pri默认永久都是80跟你此时的pri无关。
4.3 优先级范围是多少?
因为
old pri永久都是80nice值的范围是-20 ~ 19所以优先级范围是60 ~ 99。
4.4 为什么是这个范围?
我们目前主流系统都是 分时操作系统 ,在40左右的范围波动,在给进程分配时间片的时候,相对公平,而公平的调度策略,能较为均衡的让不同的进程能在一段时间内,都能得到CPU资源。所以改变优先级,就不能改的太狠,这么设计可以尽量避免优先级饥饿问题 ;而在工业控制领域,类似单片机 那种必须强制跑完全进程的 就叫 实时操作系统。
5. nice&&renice命令修改优先级
nice 命令 ------ 启动时设置优先级
用于以指定 Nice 值启动一个新进程。
语法:
bash
nice -n <NI值> <命令>
-
以较低优先级运行备份脚本(不干扰前台任务)
bashnice -n 10 tar -czf backup.tar.gz /home -
以较高优先级运行关键任务(需 root)
bashsudo nice -n -5 ./realtime_app -
不指定
-n,默认加 10bashnice ./my_script # 等价于 nice -n 10 ./my_script
💡 注意:
nice不能启动负值 (除非用sudo),因为普通用户无权提升优先级。
renice 命令 ------ 修改运行中进程的优先级
用于动态调整已有进程的 Nice 值。
语法:
bash
renice <NI值> -p <PID> # 按进程 ID
renice <NI值> -u <用户名> # 修改某用户所有进程
renice <NI值> -g <组ID> # 修改某组所有进程
-
降低正在运行的压缩进程的优先级(让它"让路")
bashps aux | grep zip # 先查 PID,比如 1234 renice 15 -p 1234 -
提升某个服务的优先级(需 root)
bashsudo renice -10 -p 5678 -
将用户
fcy的所有进程设为低优先级bashsudo renice 19 -u fcy
6. 函数方式修改优先级
c
/*
* 以下两个函数用于获取和设置进程(或进程组、用户)的调度优先级(Nice 值)。
*
* 所需头文件:
* #include <sys/time.h>
* #include <sys/resource.h>
*/
/*
* int getpriority(int which, int who);
*
* 功能:获取指定目标的当前 Nice 值。
*
* 参数:
* - which: 目标类型,取值为:
* PRIO_PROCESS ------ 目标是一个进程(who = PID)
* PRIO_PGRP ------ 目标是一个进程组(who = PGID)
* PRIO_USER ------ 目标是一个用户的所有进程(who = UID)
* - who: 根据 which 的不同,表示 PID / PGID / UID;
* 若 who == 0,则表示当前进程 / 当前进程组 / 当前用户。
*
* 返回值:
* - 成功:返回 Nice 值(范围 -20 ~ +19)
* - 失败:返回 -1,并设置 errno(注意:Nice 值可能为 -1,需结合 errno 判断是否出错)
*/
int getpriority(int which, int who);
/*
* int setpriority(int which, int who, int prio);
*
* 功能:设置指定目标的 Nice 值(即调整 CPU 调度优先级)。
*
* 参数:
* - which: 同 getpriority(),指定目标类型(PRIO_PROCESS / PRIO_PGRP / PRIO_USER)
* - who: 对应的目标 ID(PID / PGID / UID),0 表示当前
* - prio: 要设置的 Nice 值,必须在 [-20, 19] 范围内
*
* 返回值:
* - 成功:返回 0
* - 失败:返回 -1,并设置 errno(常见错误:EPERM 权限不足,ESRCH 进程不存在)
*
* 权限说明:
* - 普通用户只能将 prio 设为 ≥ 当前 Nice 值(即只能降低优先级);
* - root 用户可任意设置 [-20, 19] 范围内的值。
*/
int setpriority(int which, int who, int prio);
7. 补充概念-竞争、独⽴、并⾏、并发
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰(你其中一个进程挂了不会影响另一个)。
因为任何一个 进程都有自己独立的 内核数据结构 和进程自己的代码和数据 ,所以一个进程挂掉,不会影响另一个,所以进程有独立性 。
⚠️:父子关系也有独立性,所以子进程僵尸了,父进程依然不影响;即便是父进程挂了,子进程依然可以跑(父子之间
pid不同,说明内核数据结构不同 ;代码只读,所以不影响独立性 ;数据相同时候只读 ,不同的时候发生写时拷贝 ,所以也不影响独立性)
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。

(上半部分是并发 ,下半部分是并行)




