【Linux】进程优先级与进程切换

🔥个人主页🔥:孤寂大仙V

🌈收录专栏🌈:Linux

🌹往期回顾🌹:【Linux】进程状态

🔖流水不争,争的是滔滔不


一、进程优先级是什么

进程优先级是操作系统用来确定进程获取 CPU 资源顺序的属性。它体现进程在资源分配中的重要性,优先级高的进程更易先获得 CPU 处理时间。

优先级分为静态和动态两种。静态优先级在进程创建时确定,基本不变,如系统进程的优先级通常较高。动态优先级在进程运行中可根据进程行为和系统状态改变,像长时间占用 CPU 的进程优先级可能会被降低,等待后重新就绪的进程优先级可能会提高。它有助于合理分配资源、优化系统性能。

简而言之是进程得到CPU资源的先后顺序。

进程优先级的值越低优先级越高,反之优先级优先级越低。

二、查看系统进程

cpp 复制代码
ps-l //输入此指令查看进程 

对图中的值进程解释:

UID:代表执行者的身份。系统想知道访问文件的是拥有者或所属组或者other就需要通过UID来获取,在Linux系统中,访问任何资源,都是进程访问,进程就代表了用户。

PID和PPID:是进程代号和父进程代号,前面文章聊过。

PRI:是进程的优先级,默认值是80。

NI:是进程优先级的修正数据,Nice值

PRI and NI

PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此

值越小进程的优先级别越高。

nice值表示进程可被执行的优先级的修正数值。
进程的真实优先级 =PRI+NI。


调整进程的优先级,在Linux下就是调整进程的nice值。
nice其取值范围是-20至19,⼀共40个级别。所以Linux进程的优先级范围是60到99。

cpp 复制代码
renice -n nice值 -p pid //通过这一指令修改nice值

当我们nice值是-100,按照进程的真实优先级 =PRI+NI应该是-20啊,但是如图优先级为60。所以Linux的优先级是有范围的,最低的60。

当我们的nice值为100,优先级为99。Linux的优先级最高是99。

优先级设立不合理,会导致优先级最低的进程,长时间得不到CPU资源进而导致,进程饥饿。

三、竞争、独立、并行、并发

  1. 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
  2. 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
  3. 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。
  4. 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

四、进程切换

死循环进程,不会一直占有CPU。

寄存器是CPU内部的临时空间。寄存器!=寄存器里面的数据。寄存器就是一块空间,和往寄存器里面写的数据不要混淆。

PU 上下文切换,其实际含义为任务切换,或者说是 CPU 寄存器切换。当多任务内核决定运行另外的任务时,它会保存正在运行任务的当前状态,即 CPU 寄存器中的全部内容。这些内容被保存在任务自身的堆栈中,入栈工作完成后,便将下一个将要运行的任务的当前状况从该任务的栈中重新装入 CPU 寄存器,然后开始下一个任务的运行 ,这一过程即为 context switch。

进程切换最核心的,就是保存和恢复当前进程的硬件上下文的数据,即CPU寄存器里面的内容


Linux真实调度算法

一个CPU一个运行队列

下图为进程队列的数据结构

queue

时间片还没有结束的所有进程都按照优先级放在该队列

queue中存放task_struct*,优先级分为实时优先级和分时优先级。queue[140]: ⼀个元素就是⼀个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!

普通优先级:100〜139 所以这里就和我们上面讲的PRI和nice值就对上了

实时优先级:0〜99 我们这里不关心

实时优先级:通常采用抢占式调度策略,高优先级的实时任务可以抢占低优先级任务的 CPU 资源,确保关键的实时任务能够及时获得执行机会。如在实时操作系统中,对于硬实时任务,必须在规定的时间内完成操作,一旦高优先级的实时任务就绪,就会立即抢占正在运行的低优先级任务的 CPU。

分时优先级:一般采用时间片轮转调度算法,系统将时间划分为固定大小的时间片,每个任务轮流在各自的时间片内执行,任务不会被其他任务抢占,直到其时间片用完。如在常见的分时操作系统中,多个用户进程或任务按照时间片轮流使用CPU 资源,每个任务都能在一定时间内得到执行机会。

bitmap

bitmap[5]:⼀共140个优先级,⼀共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!

过期队列

过期队列和活动队列结构⼀模⼀样

过期队列上放置的进程,都是时间片耗尽的进程

当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

active指针和expired指针

在进程调度管理机制中,存在两个关键指针:active指针与expired指针 。active指针始终指向活动队列,而expired指针则一直指向过期队列。

随着进程的运行,会出现这样一种情况:活动队列上的进程数量逐渐减少,而过期队列上的进程数量却不断增多。这是因为进程的时间片到期后,这些进程会持续被转移到过期队列中。不过,这种情况并不会影响系统的正常调度。在恰当的时机,通过交换active指针和expired指针所指向的内容,就如同产生了一批新的活动进程。如此一来,系统便能够继续高效地进行进程调度,确保各个进程都能得到合理的执行机会。

相关推荐
vortex55 小时前
Debian 包管理全指南:从底层 dpkg 到高层 apt 及其日志追踪
linux·运维·debian
偶尔上线经常挺尸5 小时前
《每日一命令08:scp——安全的远程复制》
linux·安全·scp·文件传输·运维基础·远程复制
计算机安禾6 小时前
【Linux从入门到精通】第17篇:日志系统——系统运行的黑匣子
linux·运维·服务器
l1t6 小时前
DeepSeek辅助解决windows 11 wsl2中Linux版Dbeaver显示中文
linux·运维·windows
pengyi8710157 小时前
独享IP+动态IP结合核心逻辑,破解稳定与灵活的矛盾
linux·运维·网络
阿祖zu8 小时前
本地到生产,解决 AI 全栈最后一公里——构建&部署&运维
运维·架构·aigc
拍客圈11 小时前
内容页底部 采集的同时 隐瞒封面图
服务器·php
MAVER1CK12 小时前
Install VNC in Docker container
运维·docker·容器
SECS/GEM12 小时前
SECS/GEM如何实现越南现场自定义消息
java·服务器·数据库
橘颂TA12 小时前
【Linux】读写锁
大数据·linux·开发语言·c++·读写锁