Linux15 进程二

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

目录

一.进程优先级

[1.1 基本概念](#1.1 基本概念)

[1.2 查看系统进程](#1.2 查看系统进程)

[1.3 PRI and NI](#1.3 PRI and NI)

[1.4 补充概念-竞争、独⽴、并⾏、并发](#1.4 补充概念-竞争、独⽴、并⾏、并发)

二.进程切换

[三 .Linux2.6内核进程O(1)调度队列](#三 .Linux2.6内核进程O(1)调度队列)

[3.1 真实的调度算法的时间复炸度为O(1)](#3.1 真实的调度算法的时间复炸度为O(1))

[3.2 分时操作系统](#3.2 分时操作系统)

[3.3 位图与nr_active提升效率](#3.3 位图与nr_active提升效率)

[3.3.1 nr_active](#3.3.1 nr_active)

[3..3.2 位图bitmap[5]](#3..3.2 位图bitmap[5])

[3.3.3 活跃进程 过期进程 active(活跃) expired(过期) 帮助解决进程饥饿](#3.3.3 活跃进程 过期进程 active(活跃) expired(过期) 帮助解决进程饥饿)


一.进程优先级

1.1 基本概念

cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能。
还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤ 改善
系统整体性能。

1.2 查看系统进程

在linux或者unix系统中,⽤ps ‒l命令则会类似输出以下⼏个内容:

bash 复制代码
[lcb@hcss-ecs-1cde test]$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S  1000 22156 22155  0  80   0 - 28920 do_wai pts/0    00:00:00 bash
0 R  1000 24645 22156  0  80   0 - 38332 -      pts/0    00:00:00 ps

UID : 代表执⾏者的⾝份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍⽣⽽来的,亦即⽗进程的代号
PRI :代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏
NI :代表这个进程的nice值

1.3 PRI and NI

PRI值越⼩进程的优先级别越⾼

NI我们所要说的nice值了,其表⽰进程可被执⾏的优先级的修正数值

PRI值越⼩越快被执⾏,那么加⼊nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变⼩,即其优先级会变⾼,则其越快被执⾏
所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20⾄19(为了公平性,变化不大),⼀共40个级别。

为什么会有优先级?

原因在于资源短缺

同时又是因为是基于时间片的操作系统,为了公平,哪怕有NI进行修改,变化也不能很大

重点
进程的nice值不是进程的优先级,是进程优先级的修正数据
PRI默认值为80

我们如果先对一个进程的PRI进行NI==10,最后修正为PRI为90
那么我们如果然后再让NI==-10,PRI修正为多少?
不是80,每次NI对PRI修改都是基于PRI的默认值进行修正(使用nice renice top
等命令)
这是为了让优先级调整更灵活、更贴合进程实际运行状态(防止优先级低的进程迟迟得不到执行,导致饥饿),且不让优先级失控,越界(后面会讲)

所以PRI的范围[60,99]

1.4 补充概念-竞争、独⽴、并⾏、并发

竞争性: 系统进程数⽬众多,⽽CPU资源只有少量,甚⾄1个,所以进程之间是具有竞争属性的。为 了⾼效完成任务,更合理竞争相关资源,便具有了优先级
独⽴性: 多进程运⾏,需要独享各种资源,多进程运⾏期间互不⼲扰
并⾏: 多个进程在多个CPU下分别,同时进⾏运⾏,这称之为并⾏
并发(重点): 多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称之为并发

二.进程切换


CPU上下⽂切换:其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运⾏另外的任务时, 它保存正在运⾏任务的当前状态, 也就是CPU寄存器中的全部内容

这些内容被保存在任务⾃⼰的堆栈中, ⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器,并开始下⼀个任务的运⾏, 这⼀过程就是context switch。

说个故事加强理解

大学生小明进行了参加入伍,为了防止他入伍期间因为缺课,而学校又不知道原因,将其开除,小明因此需要向辅导员说明情况,保留学籍,辅导员了解后,将你的档案信息交给你(为了讲故事而特殊处理).

当你退伍后,需带着你的档案信息前往学校恢复学籍

小知识

时间⽚:当代计算机都是分时操作系统,没有进程都有它合适的时间⽚(其实就是⼀个计数
器)。时间⽚到达,进程就被操作系统从CPU中剥离下来。

三 .Linux2.6内核进程O(1)调度队列

3.1 真实的调度算法的时间复炸度为O(1)

此处观察发现,我们前面说的优先级范围只有[60,99],此处却有140个,原因

分为实时操作系统和分时操作系统

前100个都为实时操作系统

我们细讲分时操作系统

3.2 分时操作系统

先明白,值越小,越优先

计算:x(PRI)-60+(140-40)

因为queue中存储的是指针数组,存储的指针为task_struct*

每个下标对应的数组位置,后面跟着相同优先级的进程,我们发现这不就是哈希桶吗?

而哈希桶的查找与插入(头插) 删除 修改都为O(1),那么时间效率就自然为O(1)了

3.3 位图与nr_active提升效率

上面的哈希桶效率固然为O(1),但最坏的情况是O(140),还是不够理想,此时引入 位图与nr_aractive

3.3.1 nr_active

记录活跃进程的个数,当值为0时,也就没有必要查找执行了

3..3.2 位图bitmap[5]

为什么选5,二进制下 32*5=160 32*6=192 32*4=128

选5是为了在节省空间的情况下进行高效查找

位图将调度队列分为了5组(我们已经知道位图的查找效率为O(1))

当nr_active>0时,说明有运行进程,那么就再查找位图,查找位图几对应的下标不为0,即该下标对应的调度下标范围有进程,这样效率大大提高

3.3.3 活跃进程 过期进程 active(活跃) expired(过期) 帮助解决进程饥饿

当我们PRI为60的进程队列有死循环进程时,每次时间片单位结束后,该循环进程就被调到了该PRI60的进程队列的最后一个,如此循环,一直不会停止,那么这让后面PRI==62始终得不到运行,导致饥饿

解决,引入活跃进程 过期进程 等

将正在执行的调度队列称为活跃进程,每次执行完一个进程,将该进程映射到过期进程的位置,

那么就不会出现死循环的进程了

当活跃进程再无运行进程时,就将活跃进程与过期进程进行交换

而active则存储活跃进程的第一个数据地址,expired存储过期几次呢的第一个数据地址,方便后续交换

相关推荐
lly2024062 小时前
网站主机提供商:如何选择最适合您的服务
开发语言
HAPPY酷2 小时前
构建即自由:一份为创造者设计的 Windows C++ 自动化构建指南
开发语言·c++·ide·windows·python·策略模式·visual studio
工一木子2 小时前
Java 的前世今生:从 Oak 到现代企业级语言
java·开发语言
xiaoye-duck2 小时前
C++ string 底层原理深度解析 + 模拟实现(上)——面试 / 开发都适用
c++·面试·stl
啟明起鸣2 小时前
【C++20新特性】概念约束特性与 “模板线程池”,概念约束是为了 “把握未知对象”
开发语言·c++·c++20·模板线程池
H Journey2 小时前
Linux su 命令核心用法总结
java·linux·服务器·su
老蒋每日coding2 小时前
LangGraph:从入门到Multi-Agent超级智能体系统进阶开发
开发语言·python
CTO Plus技术服务中2 小时前
Flink运维与开发教程
大数据·运维·flink
你好!蒋韦杰-(烟雨平生)2 小时前
OpenGL
c++·数学·游戏·3d