进程优先级

发布于:2025-07-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

1.进程优先级

1.进程优先级是什么?

进程优先级是进程得到某种资源的先后顺序(CPU资源和外设资源),优先级和权限还是不一样的,优先级是能拥有只不过是先后顺序不一样,权限是你能不能得问题。

2.为什么要有优先级?

本质就是资源少,进程多,曾多肉少啊。还是那句话,如果每人都拥有自己的私人食堂,那去食堂还用排队啊!!!


3.Linux的优先级是怎么做的

Linux的优先级是进程竞争CPU打字员,PRI就是在Linux中代表优先级的高低,PRI越小执行越早,优先级越高,跟那个班级排名一样吗,数字越小排名越考前,越牛逼。

那Linux下进程优先级PRI储存在哪里?就是放在PCB里,它在PCB里就是一个整数。

PRI=PRI+NICE.nice可以调整PRI的优先级,它等号邮编的PRI固定为80.nice的取值范围是-20到19。一共40个级别。

固定值是80,nice范围是-20到19,那么PRI的整体范围就是60到99,共40个级别。

我们的进程修改是覆盖式修改,不是渐进式修改,每次修改都是以80为基本进行修改。

这样的设计模式也决定了我们的进程优先级就有了范围。

那么问题又来了。

4.进程优先级为什么要有范围?

因为我们的操作系统是分时操作系统,尽可能的保证公平公正。

优先级就算要变也要在可控的范围内进行变化。

还有一个问题就是为什么是-20到19,这个数值的设计为什么是这样的,这是因为这是由具体的调度算法决定的。

2.概念扩充

我们的概念有竞争性:竞争性就是系统进程数目众多,而CPU资源只有少量,甚至一个,所以进程之间是具有竞争属性的。为了高校的完成任务,更合理的竞争相关的资源,便有了优先级。

独立性:虽然我们的子进程会继承父进程的代码和数据但是它们的数据是相互独立得,子进程的数据改变不会去影响父进程。父进程的数据改变也不会去影响子进程。

并行:并行吗,一块吗,就是我们的多个进程在多个CPU下同时运行,重点就是同时运行。

并发:就是我们多个进程在一个CPU下采用的进程切换模式,在一段时间之内,多个进程都得以推进,称之为并发,重点就是一个CPU干多个进程。

还是那句话我们为什么感受不到CPU在进程间进行切换呢?CPU太快了,快死了,你像我们知道我们的计算机我们一般就是一颗CPU去运行,他肯定是并发运行的,所以当我们打开多个软件的时候它就需要去创建进程,多个进程都要执行保证用户的使用,我们的CPU就会高频切换进程,每个进程都不是执行完再去搞另一个进程,那我们还开个毛的后台,所以我们这个计算机想知道每个进程在上次被切出去的时候是执行到什么程度就会在PCB里搞一个tss结构体来记录下来,方便下次再次进行调度。聪明!

所以得出结论物理上我们认为CPU只有一个,但是逻辑上我们可以认为有几个进程就有几个CPU,只不过效率低一点罢了。

3.进程切换

这个进程切换就和我们说的一样,它这个CPU是同时干多个进程,多个进程在CPU的调度队列是时刻准备着,就和军队一样,时刻准备保护人民群众一样。酷酷酷就进行进程的执行。我们的CPU调度队列里多个进程,每个进程都是执行一部分就切出去了,我们就需要记录CPU执行它的上下文信息,方便下次CPU对它进行处理。它保存的信息就是CPU寄存器里的内容。

这个时间片就是CPU调度每个进程的时间罢了,时间一到,切到,换下一个。

返回值问题的讲解:

我们在语言阶段学习过,我们这个语言传值传参返回的是拷贝的值,那么我问,这个拷贝是什么玩意呢?数字返回到哪里呢?谁来保存的,答案是返回到寄存器中的,寄存器进行保存。

4.大O(1)调度队列

一个CPU具有一个调度队列。

优先级:普通优先级:100-139,实时优先级0-99这个我们不关心。我们分时操作系统主要是100-139.

下面这张图是CPU的调度队列的数据结构。

其中一个是活跃的队列指针,一个是过期的队列指针。

我们的队列里每一个对应的数字的调度队列都会连一个链表,优先级小的在前面,优先级大的在后面这个大小是指数字的大小。

我们CPU执行的时候是执行活跃的队列里的进程,执行过后就把它弄到过期的调度队列里去了,如果我们在进程在活跃的调度队列里还未执行,这个时候我们调整它的优先级,这个时候不会立即对它进行调整,而是这一次活跃的调度队列完成时,把它切到过期的调度队列里再按新的调度优先级进行插入。

调度完所有的活跃的调度队列,我们干什么呢?直接交换指针的指向,过期变活跃,活跃变过期,再次执行。

我们的调度队列就张这个样子,每个数字后连个链表,CPU对各个进程进行依次的调度,链表里PCB属性,到它的时候我们就能通过PCB找到它对应的代码数据,时间片到了之后我们就把它的寄存器里的信息保存到PCB里,然后把它从CPU剥离,根据新的优先级入过期队列,直到CPU把活跃队列的进程执行完,这个时候过期队列和活跃队列直接进行指针指向的交换,完成一次完整的CPU调度过程,至此,我们就把CPU的调度的具体过程具象化了,我们现在可以切实认识到在具体的场景下,我们的运行队列到底是怎么执行的!!!

bitmap是位图,为啥是5个元素,因为1个整型32个字节,我们的优先级是0-139,4个不够,6个过多,当然是5个,这个方便我们遍历队列,将时间复杂度降低到O(1).遍历链表感觉就是查看这个调度队列是否为空。

总结:

在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成
本增加,我们称之为进程调度O(1)算法!

5.为什么要有0-99的优先级呢?

虽然我们的Linux操作系统是分时操作系统尽量公平公正,但是也有一些时候我们的场景是需要根据优先级进行调度的,比如我们造汽车的厂商需要给汽车搭载操作系统,比如我们的刹车系统,这个时候我们如果依然根据公平公正进行调度的话,我们车放着歌,开着导航,这个时候我要刹车呢,你说不行,得一个一个来,公平公正,这不扯呢吗?人都快没了,还一个一个来,所以这个时候必须让系统立即调度刹车,来挽救人的生命!!!

我们有的场景可以公平公正,但在一些特殊情况下也要优先,现实生活中也有这样的例子,人受伤了,马上都要嘎了,去医院还要挂号看病,这不害人吗??所以我们的Linux操作系统想要在相应的根据优先级调度的领域分一杯羹,就需要做出对应的调整!!!


网站公告

今日签到

点亮在社区的每一天
去签到