🌏博客主页:PH_modest的博客主页
🚩当前专栏:Linux跬步积累
💌其他专栏:
🔴 每日一题
🟡 C++跬步积累
🟢 C语言跬步积累
🌈座右铭:广积粮,缓称王!
文章目录
进程优先级
基本概念
什么是优先级?
优先级实际上就是获取某种资源的先后顺序,进程要访问某种资源,进程通过一定的方式(排队),确认享受资源的先后顺序。换句话说,进程优先级就是进程获取CPU资源分配的先后顺序,就是指进程的优先权(priority),优先权高的进程有优先执行的权利。
优先级存在的原因?
优先级存在的主要原因就是资源是相对有限的,而存在进程优先级的主要原因就是CPU资源是有限的,一个CPU一次只能跑一个进程,而进程是可以有多个的,所以需要存在进程优先级,来确定进程获取CPU资源的先后顺序。
如何实现进程优先级?
struct task_struct
{
//优先级
int PRI;
int nice;
}
查看系统进程
如何查看?
在Linux或则Unix操作系统中,用 ps -l 命令会类似输出一下几个内容:
[hph@hecs-345360 demo-8-8]$ ps -l
列出的信息当中有几个重要的信息,如下:
- UID:代表执行者的身份。
- PID:代表这个进程的代号。
- PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号。
- PRI:代表这个进程可以被执行的优先级,其值越小越早被执行。
- NI:代表这个进程的nice值。
PRI 与 NI
- PRI代表进程的优先级(priority),通俗点说就是进程被CPU执行的先后顺序,该值越小进程的优先级别越高。
- NI代表的是nice值,其表示进程可被执行的优先级的修正数值。
- PRI值越小,越快被执行,当加入nice值后,将会使得PRI变为:PRI(new) = PRI(old) + NI。
- 若NI值为负值,那么该进程的PRI将变小,即其优先级会变高。
- 调整进程优先级,在Linux下,就是调整进程的nice值。
- NI的取值范围是-20~19,一共40个级别。
注意: 在Linux操作系统中,PRI(old)默认为80,即PRI = 80 + NI。
PRI vs NI
- 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
- 可以理解nice值是进程优先级的修正数据。
查看优先级的命令
查看进程优先级信息
当我们创建了一个进程后,我们可以使用 ps -al 命令查看该进程优先级的信息。
[hph@hecs-345360 demo-8-8]$ ps -al
注意: 在Linux操作系统中,初始进程一般优先级PRI默认为80,NI默认为0。
通过top命令更改进程的nice值
top命令就相当于Windows操作系统中的任务管理器,它能够动态实时的显示系统当中进程的资源占用情况。
使用top命令后按“r”键,会要求你输入待调整的nice值的进程的PID。
输入进程PID并回车后,会要求你输入调整后的nice值。
输入nice值后“q”即可退出,如果我们这里输入的nice值为10,那么此时我们再用ps命令查看进程的优先级信息,即可发现进程的NI变成了10,PRI变成了90(80+NI)。
注意: 若是想将NI值调为负值,也就是将进程的优先级提高,需要使用sudo命令提升权限。
通过renice命令更改进程的nice值
使用renice命令,后面跟上更改后的nice值和进程的PID即可。
这里我将PID为18990的nice值改为10,它的PRI相应的变成了90。
但是PID为19175的进程的PRI和NI值也变了,这是为什么呢?
不难看出,19175进程的父进程是18990,在某些系统中,当父进程的 nice 值被更改时,子进程的 nice 值也会被自动更新以匹配父进程的 nice 值。这是一种确保进程组内所有进程具有相同优先级的行为。
四个重要概念
- 竞争性:系统进程数量众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便有了优先级。
- 独立性(重要):多进程运行时,需要独享各种资源,多进程运行期间互不干扰。
- 并行:多个进程在多个CPU下分别同时进行运行,这称之为并行。
- 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进,称之为并发。
其他知识点
(1)优先级是决定执行的顺序;权限是决定能不能执行。
(2)进程在运行的时候,放在CPU上,必须把进程代码跑完才行吗?
答:不对。现代操作系统,都是基于时间片轮转执行的。
(3)什么是硬件上下文?
答:硬件上下文(Hardware Context)通常指的是在计算机系统中,CPU 需要处理的指令和数据的物理状态和配置。当 CPU 执行程序时,它需要访问和操作内存、寄存器、输入/输出设备等硬件资源。硬件上下文切换(Hardware Context Switch)发生在操作系统调度程序从一个进程或线程切换到另一个进程或线程时。
在进行上下文切换时,操作系统需要保存当前进程的硬件状态(如寄存器值、程序计数器等),并恢复下一个要执行的进程的硬件状态。这个过程包括以下几个步骤:
-
保存当前状态:操作系统将当前进程的寄存器、程序计数器等状态保存到它的进程控制块(PCB)或其他内存区域。
-
更新内存映射:如果新进程需要不同的内存页面或段,操作系统将更新内存映射。
-
加载新状态:操作系统从下一个要执行的进程的 PCB 加载寄存器值、程序计数器等信息。
-
更新控制寄存器:操作系统可能需要更新控制寄存器,如堆栈指针、程序状态寄存器等。
-
恢复执行:CPU 恢复执行新的进程,从它上次停止的地方继续。
硬件上下文切换是操作系统正常运行的关键部分,但这个过程是相对昂贵的,因为它涉及到大量的数据移动和可能的内存访问。频繁的上下文切换可能会降低系统性能,因为它减少了 CPU 用于实际执行指令的时间。
在多任务操作系统中,硬件上下文切换是常见的,它允许多个进程或线程看似同时运行,尽管在任何给定时刻,只有一个进程或线程在 CPU 上执行。
(4)CPU内寄存器只有一套,寄存器内部保存的数据可以有多套。
(5)寄存器!=寄存器内容