【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指针所指向的内容,就如同产生了一批新的活动进程。如此一来,系统便能够继续高效地进行进程调度,确保各个进程都能得到合理的执行机会。

相关推荐
不良人天码星11 分钟前
Linux的基础指令和环境部署,项目部署实战(下)
linux·运维·服务器
火一线1 小时前
【ASP .NET Core】ASP .NET Core介绍
服务器·游戏·.netcore
EasyNVR2 小时前
基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案
运维·服务器·微信·小程序·webrtc·p2p·智能硬件
技术小齐2 小时前
网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战
运维·网络·学习
致奋斗的我们2 小时前
HAProxy介绍与编译安装
linux·汇编·数据库·mysql·青少年编程·haproxy·openeurler
Java潘老师2 小时前
Automa 浏览器自动化编排 实现自动化浏览器操作
运维·自动化
waves浪游2 小时前
Linux基本指令(上)
linux·运维·服务器
不确定性确定你我3 小时前
`sh` 与 `bash` 的区别详解
linux·bash·运维开发
是北欢吆3 小时前
QQ登录测试用例报告
运维·服务器·测试用例
9毫米的幻想4 小时前
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
linux·运维·服务器·c语言·c++