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

相关推荐
xiao-xiang7 分钟前
Jenkins-pipeline Jenkinsfile说明
运维·jenkins
里音日黑7 分钟前
Elasticsearch 和arkime 安装
linux·运维·服务器·elasticsearch·arkime
我是苹果,不是香蕉33 分钟前
vim将一行行尾倒数第三个字符替换成1
linux·编辑器·vim
冰淇淋百宝箱36 分钟前
GraphRAG: Auto Prompt Tuning 实践
java·服务器·前端
Kasen's experience1 小时前
Ubuntu 24.04 LTS 安装 tailscale 并访问 SMB共享文件夹
linux·ubuntu·tailscale
Mr.Lee jack2 小时前
【SSH端口转发:实现安全的远程端口映射】
运维·安全·ssh
宅博士小陈2 小时前
实施工程师:面试基础宝典
运维
李歘歘2 小时前
Golang——常用库reflect和unsafe
android·服务器·golang
珀佑勒2 小时前
ubuntu24部署openwrt编译环境
linux·运维·服务器
黑客老陈2 小时前
漏洞挖掘 | Swagger UI 目录枚举小总结
运维·服务器·网络·学习·ui·php