进程的调度和切换
1.进程的调度和切换的基本概念
进程在CPU上运行的时候,CPU并不会一直运行一个进程,直到进程结束。现代操作系统的进程之间都是根据时间片进行轮转的。
时间片:一个进程最多只能占据CPU资源一定的时间(一般设置为1ms),如果在这个时间内进程还没有运行完,进程会被轮换。
2. 其他概念
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发(我们在使用我们自己的电脑时,其实上感觉不到各个进程之间的切换,我们就以为,我们开得很多程序都是并行的,其实那是因为CPU切换的太快了,我们根本感觉不到)
3.进程切换的时候,CPU和进程的操作
3.1CPU基本概念
我们要先知道CPU内部会有很多的寄存器,用于实现CPU的计算功能。
PCB在CPU运行队列里排队,当PCB被CPU调度的时候,可执行程序在CPU内部执行。
进程在CPU里运行的时候,会产生大量的临时数据(我们将这些临时数据称之为进程的硬件的上下文),如果,这个程序在时间片内运行完了,那就直接从CPU里带出结果就行了,但是,如果这个程序没有在时间片内在CPU内部运行结束,需要等待CPU的二次调度,那么这些临时数据就显得格外重要(总不能直接删掉,让CPU重新计算,那不就一直无法结束了吗)
为了让CPU二次调用进程的时候,能够接上上一次的计算结果,所以就把硬件上下文交给进程保存,当他下次被调用的时候直接赋值给CPU。
当每个PCB被CPU运算的时候,都会被判断一下是否是二次调度,如果是,那就把之前的临时数据赋值给CPU上的寄存器,继续之前未进行完的计算。如果是第一次,那就别啥赋值的了,直接开始吧。
CPU中的寄存器从物理上是被所有进程共享,在任意时刻,CPU的寄存器由当前正在执行的进程独占使用,而寄存器内部保存的数据,是被该进程私有的。即:CPU中的寄存器只能有一套,寄存器内部保存的数据可以有多套。
4.Linux2.6内核进程调度队列
Linux实现进程调度的算法:考虑优先级,进程饥饿问题,效率问题
我们看到这里就发现好像,如果一直往运行队列中加入优先级高的进程,那么那些优先级低的进程还是依旧无法被分配到cpu资源。这样好像进程饥饿的问题没有被解决,所以接着将过期进程,这就是过期进程的作用。
这里有两个进程,一开始CPU都是从活跃进程里面拿进程进行运算,然后此时即使有新的进程进来也不会被加到活跃进程上,而是会全部被加到过期进程上。当活跃进程里的进程全部被加载完了。此时进行进程互换,活跃进程变成过期进程,过期进程变成活跃进程。
交换的时候,只交换指针变量的值。
在这种调度模式下,只有内存和CPU之间进行交互,也打打提升了效率。
- 点赞
- 收藏
- 关注作者
评论(0)