进程的优先级与切换

1.进程的概念

1.1进程的优先级是什么

cpu资源分配的先后顺序,就是进程的优先级。
1.2为什么要有优先级

cpu资源是有限的,要分配资源

优先级高的进程可以优先执行,配置优先级对于多任务环境的linux系统很有用,可以有效的提高效率。
1.3linux靠什么设计进程的优先级

PRI:代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏

NI:代表这个进程的nice值
nice值:进程优先级的修改数据

1.2.nice值

1.概念

PRI值越⼩越快被执⾏,那么加⼊nice值后,

将会使得PRI变为:PRI(new)=PRI(old)+nice

这样,当nice值为负值的时候,那么该程序将会优先级值将变⼩,即其优先级会变⾼,则其越快

被执⾏所以,调整进程优先级,在Linux下,就是调整进程nice值
2.nice值的范围

nice其取值范围是-20⾄19,⼀共40个级别。

并且优先级不能频繁修改,会影响系统整体的进程执行安排
3.nice值为什么有范围

系统默认PRI为80,那么有了nice值后其范围为60 - 99。

设置范围是因为如果优先级如果差距过大,低优先级进程可能永远无法得到执行机会,无法满足在一段时间内所有的进程都分配到cpu的资源,这样是不公平的

例如,你要同时听歌,打游戏,如果优先级设置的差距过大会导致音乐进程每几秒才能获得几毫秒的CPU时间,导致

音乐节奏混乱,完全无法正常听歌

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

• 竞争性:系统进程数⽬众多,⽽CPU资源只有少量,甚⾄1个,所以进程之间是具有竞争属性的。为

了⾼效完成任务,更合理竞争相关资源,便具有了优先级

• 独⽴性:多进程运⾏,需要独享各种资源,多进程运⾏期间互不⼲扰

• 并⾏:多个进程在多个CPU下分别,同时进⾏运⾏,这称之为并⾏

• 并发:多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称

之为并发

2.进程的切换

1.进程的上下文

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

⼀个CPU拥有⼀个runqueue(调度队列)

补充:

• 普通优先级:100〜139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)

• 实时优先级:0〜99(暂时不关⼼)

*我们主要关注*active,expired,nr_active,bitmap5,qunue140

调度队列里有分别有活动队列和过期队列

• active指针永远指向活动队列

• expired指针永远指向过期队列

先来说活动队列

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

2.nr_active:总共有多少个运⾏状态的进程

3.queue140:⼀个元素就是⼀个进程队列,相同优先级的进程按照FIFO规则进⾏排队调度,所以,

数组下标就是优先级!
系统是如何按顺序选择进程的?

1.在qunue数组中从0开始遍历

2.找到第⼀个⾮空队列,该队列必定为优先级最⾼的队列

3.拿到选中队列的第⼀个进程,开始运⾏,调度完成!

4.遍历queue140时间复杂度是常数!但还是太低效了!

• bitmap5:⼀共140个优先级,⼀共140个进程队列,为了提⾼查找⾮空队列的效率,就可以⽤

5*32个⽐特位表⽰队列是否为空,这样,便可以⼤⼤提⾼查找效率

过期队列同理,当进程从活动对列跑完后进入过期队列,当活动对列的进程都结束后交换active指针与expired指针所指的队列

就相当于有具有了⼀批新的活动进程!

相关推荐
未济2 天前
linux 配置环境变量
linux
傲世仙尊2 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.2 天前
进程间通信
linux
Liuqy-053 天前
Linux IO编程——静态库、动态库
linux
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
我爱cope3 天前
【操作系统 | 计算机硬件:CPU、内存与 I/O 如何支撑操作系统?】
学习·操作系统
-梅3 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog3 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发
AIgorithmGEEK3 天前
[Linux]线程三部曲(上):一个执行流的诞生——从操作系统一路拆到 pthread_create
linux·线程·pid