进程优先级切换调度-进程概念(6)
文章目录
- 进程的优先级
- 1. 先说结论
- 2. 修改进程的优先级
- 3. 优先级的极值问题
- 补充四个概念(竞争,独立...)
- 进程切换
- 1. 死循环进程如何运行
- 2. 聊聊CPU,寄存器
- 3. 如何切换进程
- 3.1 例子理解
- 3.2 具体理解
- 3.3 全新进程 VS 已经调度过的进程
- 实时操作系统与分时操作系统
- 实时操作系统的特点与应用场景
- 分时操作系统的特点与应用场景
- 两种操作系统的对比
进程的优先级
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{while(1){printf("我是一个父进程, pid: %d, ppid: %d\n", getpid(), getppid());sleep(1);}return 0;
}
1. 先说结论
PRI
:进程的优先级,默认为80NI
:进程优先级的修正数据,别称为nice
值- 进程真实的优先级 =
PRI
(默认)+NI
,就是PRI
- 进程优先级它就是一种数字,
task_struct
中的int
成员变量 - 值越低,优先级越高,反之优先级越低。
Linux
是基于时间片的分时操作系统,考虑到公平性,优先级可能变化,但是变化幅度不能太大
2. 修改进程的优先级
进程的优先级不建议去改,就用默认的。改太多的话,会影响到操作系统调度进程的平衡,就算要修改进程的优先级,也建议修改nice
值,而不是直接去修改PRI
先输入top
命令,再按键盘上的r
(意味着我要重新调整优先级),输入要重新调整进程的PID
,接下来输入你想将nice
值改为多少,这里我输入10,按回车键
此时PRI
的值就是最终优先级是,OS
对多次更改优先级会有一定的限制,可能你需要切换到root
超级用户(su -
),才能再次更改优先级
那此时再将nice
值改为-10时(再次更改,它不允许了,需要切换成超级用户),猜一下最终优先级PRI
是多少?之前是90,那减去10,最终优先级应该是80。实际上PRI
为70
这为是70呢?之前结论提到了,进程真实的优先级 = PRI
(默认)+ NI
,默认是80,加上NI
的值(-10)不就是70。所以进程优先级做调整,永远是从默认出发
这样初看咋感觉这么奇怪呢?为什么要这么设计呢,但仔细想想又有点道理,如果调整是从上次的最终优先级出发,那是不是还得查找上次的最终优先级?而规定死一个默认初始值,想调整最终优先级,只需要去修改nice
值即可
3. 优先级的极值问题
在探究优先级的极值问题之前,先来看一个调整nice
值的命令:renice -n nice值 -p 该进程的PID
观察上面的图片,可以看到将nice
值更改成100时,最高也只能到19。将nice
值更改成-100时,最高也只能到-20,因此nice
值的范围是:[-20, 19]
,由此便能得出Linux
进程的优先级范围是[60, 99]
在进程调度时要考虑公平性,幅度不能太大。如果进程优先级能随意修改的话,那用户就可能会恶意修改自己进程的优先级,来尽可能让自己进程优先得到资源
优先级设立不合理,会导致优先级低的进程,长时间得不到CPU资源,进而导致进程饥饿
补充四个概念(竞争,独立…)
-
竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
-
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
-
并行:多个进程在多个CPU下分别同时进行运行,这称之为并行
-
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,这称之为并发
这个并发概念,只要我切换进程的时间足够块,比如1秒内,这三个进程都运行了一会儿,三个进程运行的时间加起来就为1秒,它可能是1ms切换一次,关键CPU就算是1ms的时间也能运行很多很多的代码
此时用户就会感受到多个进程在同时运行,但实际上单CPU,只能支持让一个进程运行,无法让多个进程同时运行,进程运行其实是一卡一卡的,但是它切换太快了,我们感受不到而已
进程切换
1. 死循环进程如何运行
先提出一个问题:如果一个进程占有CPU,它会将自己的代码全部跑完,再让另外一个进程调度?按这样看来,如果这是一个死循环进程,那就会一直都占有CPU
实际上OS并不会让一个进程持续性占有CPU,否则遇到死循环进程,系统就直接卡死了,OS会通过时间片
这样的东西进行调度和切换进程
这个时间片可以这么理解:你这个进程我只给你1ms的时间占用CPU哦,1ms结束之后我就将你从CPU中拿下来,你的代码和数据没跑完就自己再重新到运行队列去排队。那这个1ms就是时间片
2. 聊聊CPU,寄存器
其实CPU执行进程时,就跟PCB关系不大了,重点是去执行进程的代码和数据,在CPU上会存在着一片寄存器,这个寄存器就是CPU内部的临时空间
当这个进程在跑的时候,CPU所有的寄存器都会被填上对应的临时值,有的寄存器是描述你这个进程数据结果有没有溢出,有的是描述数据计算有没有错误,有的是描述你的代码和数据是从哪里开始的等等
各个寄存器有各自的任务,保存正在运行进程的临时数据。但是要特别注意的是,寄存器它只是空间,不等同于寄存器里面的数据(内容),空间只有一份,内容可以是变化的,多份的,这一点非常重要
就比如int a = 10;
这里的a是一个左值,a = 20;
是将20这个数值放到a这个空间里,此时再赋值b = a;
而这里的a并不是空间,它是一个右值,是将a中的内容赋值给b
3. 如何切换进程
3.1 例子理解
这里可以用大学生入伍的例子进行类比说明,首先你得告诉导员,办理好征兵入伍的报名表,交给导员进行初步审查,再经导员交给学校办理保留学籍证明,此时你的身份从学生变成了义务兵。这是一次切换
当两年兵回来之后,不是马上就能上课的,你得恢复学籍,身份得从义务兵再次变成学生,并经由导员,学校批准审核办理恢复学籍证明。这是二次切换
在这个过程中,你是一个进程
,导员就是一个调度器
,而学校就是CPU
学籍
就是进程运行时的临时数据,CPU中寄存器里面的内容,称作当前进程的上下文数据
保留学籍
就是保存进程的上下文数据,将CPU寄存器里面的内容给保存起来
恢复学籍
就是恢复进程的上下文数据,将保存的内容重新恢复到CPU寄存器内
去当兵
就是将该进程从CPU上给剥离下来,当兵结束
就是CPU重新调度该进程
3.2 具体理解
在A进程的时间片到了之后,进程A切换走之前,会将寄存器中的内容拷贝一份到某个地方,这样寄存器中的值就对A进程没有任何意义了,所以到了进程B运行时,直接将进程B的上下文数据覆盖寄存器中的值即可,进程A被重新调度时,并不能直接跑,要将曾经保存的上下文数据逐一恢复到各寄存器上,这样进程A就能在历史的位置继续运行了
进程切换最为核心的工作就是,保存和恢复当前进程的硬件上下文数据,即CPU内寄存器中的内容,而OS会将这个内容保存到该进程的task_struct
中的TSS
(任务状态段),就是一个结构体成员变量,下面是Linux
源代码文件
3.3 全新进程 VS 已经调度过的进程
全新进程与已经调度过的进程要如何区分呢?其实在task_struct
里再去新增一个标志位int isrunning
,只要开始第一次调度,那isrunning
从今往后都是1,否则就是0。这样C调度器就很容易检测出来你这个进程是全新的,还是已经调度过的进程
实时操作系统与分时操作系统
调度器:进行调度和切换的工作,首先是将进程保存下来,再切换进程,选择另外一个进程放上去
分时操作系统:以时间片为单位,进行公平调度
实时操作系统:来了一个进程,就要将这个进程给处理完才能处理下一个进程,所以它的调度算法是一定要比分时操作系统的调度算法要简单的
实时操作系统的特点与应用场景
- 实时操作系统的核心特性:
- 能够在严格的时间约束内完成任务调度和响应。
- 适用于对时间敏感的场景,例如需要快速响应的控制任务。
- 主要应用领域:
- 汽车领域:
- 车载系统和行车电脑需要实时操作系统来实现关键功能,如主动刹车、车道保持等。
- 当传感器检测到危险(如与前车距离过近)时,实时操作系统会立即生成高优先级的刹车任务,确保在极短时间内完成刹车操作,保障行车安全。
- 这种场景下,分时操作系统无法满足快速响应的需求,因为分时操作系统会根据任务优先级和时间片分配资源,可能会导致刹车任务延迟执行。
- 工业和制造业领域:
- 在生产线上,实时操作系统用于监控和控制生产过程。
- 例如,当检测到产品质量问题导致良品率下降时,实时操作系统能够快速停止生产线,避免进一步生产不合格产品。
- 这种快速响应能力对于减少生产损失和提高生产效率至关重要。
- 汽车领域:
分时操作系统的特点与应用场景
- 分时操作系统的核心特性:
- 通过时间片轮转的方式分配系统资源,允许多个任务同时运行。
- 适合用户交互频繁的场景,例如日常办公、娱乐等。
- 主要应用领域:
- 互联网领域:
- 用户在使用电脑或手机时,通常需要同时运行多个任务,如听歌、浏览网页、编写代码等。
- 分时操作系统能够合理分配资源,让用户在不同任务之间切换时感觉流畅。
- 例如,用户不会因为某个任务(如代码编译)而无法立即播放音乐,这种灵活性和多任务处理能力是分时操作系统的优势。
- 日常使用场景:
- 对于普通用户来说,分时操作系统能够满足日常需求,提供良好的用户体验。
- 用户更倾向于使用能够灵活切换任务的系统,而不是实时操作系统这种严格按优先级调度任务的系统。
- 互联网领域:
两种操作系统的对比
- 实时操作系统:
- 优点:能够快速响应紧急任务,确保任务在规定时间内完成。
- 缺点:灵活性较差,任务调度较为严格,不适合多任务交互频繁的场景。
- 适用场景:对时间敏感的控制任务,如汽车安全系统、工业自动化控制等。
- 分时操作系统:
- 优点:能够同时处理多个任务,用户交互体验好。
- 缺点:无法保证任务在严格的时间约束内完成,不适合对时间要求极高的场景。
- 适用场景:日常办公、娱乐、互联网应用等。