目录
- 前言
- 一、竞争性
- 1、什么是进程的竞争性?
- 2、为什么进程间存在竞争性?
- 二、独立性
- #这里先简单了解
- 三、并行
- 四、并发
- 五、优先级队列
- 六、进程切换
- 寄存器
- 1. 函数返回值
- 2. 进程上下文数据
- 总结
前言
在不同的进程在处理机上切换的过程中,我们需要学习一些相关概念以便我们更好地理解进程间的切换,这些概念包括:进程的竞争性,独立性,并行性,并发性,时间片,抢占式调度算法,进程的上下文数据
一、竞争性
1、什么是进程的竞争性?
进程的竞争性指进程间为抢夺某种资源而出现的现象
2、为什么进程间存在竞争性?
一般情况下,进程的数量是非常多的,而系统中的资源总是有限的,所以就会出现资源供不应求的现象,因此,为了获得资源,进程间就必须进行竞争
二、独立性
#这里先简单了解
进程的独立性指进程之间在运行的时候互不干扰,相互独立,一个进程挂掉或者异常不会影响其他进程
比如:QQ和微信是两个不同的进程,这两个进程在运行的时候是互不干扰的,QQ 挂掉的话不会影响微信的正常运行
三、并行
并行指的是在多个CPU中,不同的进程同时运行的一种现象,一般情况指的是不同的CPU中同时运行多个进程的现象,在多CPU中任何时候都有可能出现同时在运行,这里以一个两个CPU的图进行理解
四、并发
并发指的是在一个CPU中多个,多个进程在CPU的运行队列中相继上CPU运行的现象,不会出现多个CPU同时运行的情况,因为一个CPU在同一时间内只能处理一个进程,但是由于CPU的运行速度过快,给我们宏观的感觉就是多个进程在同时运行
比如现在在我的电脑上看好像是四个进程在同时运行,其实实际上并不是的,这四个进程是相继以很快的速度上CPU不断轮流运行的,只是因为CPU的运行速度太快所以给我们的感觉是几个进程在同时运行
- 那么问题来了,多个进程在CPU上到底是如何进行切换的呢??CPU是死板地将一个进程处理完再运行下一个进程吗??
显然不是的,现在的大部分操作系统都是分时操作系统,也就是说,操作系统会给每一个进程在每一次调度周期内赋予一个时间片,在一个时间段内,多个进程都会通过切换交叉的方式让多个进程在一段时间内得到推进,这种现象叫做并发
时间片:指操作系统指定的一个进程在一次上CPU运行的时间间隔,通常是毫秒级别的
调度器:存在于CPU中,负责调度进程上CPU上运行
五、优先级队列
在系统中会存在很多的进程,那么通过上面我们已经知道,CPU并不是运行完一个进程之后才会运行下一个进程,而是操作系统会设置一个时间片,让每个上CPU运行的进程每次以该时间片的时间在CPU上运行之后才下CPU,那么此时如果一个在CPU上运行的进程如果还没达到运行的时间片,此时系统中又来了一个优先级比该进程还要高的进程,此时咋整?
显然,操作系统会强制性让原先在CPU上运行的进程下处理机,回到运行队列,让优先级高的进程上CPU上运行,这种现象叫抢占式算法
-
抢占式内核:当一个更高优先级的进程来的时候,会将一个正在CPU上运行的低优先级进程从CPU上剥离,放上更高优先级的进程上CPU运行
-
进程的优先级很多,那么此时操作系统如何处理呢??
操作系统会维护一个叫优先级队列的东西,其思想是:将不同优先级的进程分别放在一个哈希表中进程存储,这个哈希表是一个数组,数组中存放的是指向进程PCB的指针,比如说:有优先级为1、2、3、4、5、6的进程,那么哈希表中就必须存放指向优先级为1、2、3、4、5、6的进程控制块的指针,相同的优先级采取先到先得的方式排成一个队列,如图
需要知道的是,在操作系统中,允许不同优先级进程的存在,相同的优先级可能存在多个,因此,操作系统只需要维护一个task_struct* priority_queue[6];
的哈希表就行了 -
但是在系统中,我们知道可能会有不同的进程源源不断地加入队列,此时应该怎么办呢?
操作系统会维护两个一模一样的哈希表来存储相应优先级的进程
这两个哈希表的作用: -
active:是用来运行当前队列中存在的进程
-
old:用于存储新加入的进程
当active中的进程运行完的时候,我们只需要调用swap函数将两个哈希表的地址交换一下就可以了,swap(active,old);
那么原先的old就变成active,原先的active就变成old
六、进程切换
寄存器
CPU中存在很多的寄存器,这些寄存器可以存储很多临时数据,存储的量比较少,但是很重要
1. 函数返回值
函数中的返回值在函数调用结束时会将返回值先写到CPU中的某个寄存器中,然后再move到对应的变量中,比如下面一个简单的例子
在Add函数调用结束之前会先将x+y的值写到CPU中的某个寄存器,然后再将这个值move给c
2. 进程上下文数据
进程被执行的过程中会产生很多临时数据,这些临时数据会被暂存到CPU中的某些寄存器中,我们把进程在运行的过程中产生的各种寄存器数据叫做进程的上下文数据,当进程从处理机被剥离时,要保存好上下文数据,当进程重新上处理机运行的时候,需要将上下文数据恢复到寄存器,这些数据在进程下处理机后会保存在进程的PCB中(Linux中叫task_struct)
注意:在进程离开CPU时保存进程的上下文数据,就是为了在进程重新上CPU运行的时候能够很好地告诉CPU上次执行到哪个地方,恢复回下CPU时的情况
总结
本文我们学习了进程中的一些概念,包括:竞争性,独立性,并行性,并发性,时间片,抢占式调度算法,还有进程间切换的上下文数据