Linux进程理解( 九 )


进程调度
我们刚在谈了并发和并行,这里看看操作系统是如何进行进程的调度的.首先我要说一下抢占式式执行,对于进程 来说,资源就这么多,CPU的个数也是有限的,那么如果出现了一个优先级高的进程,操作系统就会把原本正在执行的进程给拉来下,换成这个优先级高的进程执行,这就是抢占式执行的含义.
进程调度
这里我们需要好分析一下进程是如何调度的,里面可能涉及到哈希表的内容,这里我们先来看看是不是存在不按优先级的进程的存在?这里是的,我们知道运行队列也是队列,它支持先进先出的特性,如果一个进程进入运行队列,那么他也严格按照这种特性来走.
我们在想如果一些进程的优先级一样该怎么办?这里就需要用到哈希表的特性了,我们把进程的优先级分成若干部分,遇到优先级和他相匹配的就把他挂在相应的的地方.
到这里我我们就可以知道了进程是如何存在的,当OS觉得要调用进程的时候,他就会去这个哈希表里面遍历,但是我们知道这里遍历一个哈希表还是有点慢的,所以我们又想出了一个位图,这里的位图就比较简单了.我们先来解释一下.我们都知道int是四个字节,也就是三十二位.我们是不是可以这么干:如果存在了一个进程要执行,就把这个进程放在这个哈希表,又把进程的优先级对应的位改成1,到时候我们只需要遍历这个位图,看看哪一位是1就可以了.
我们先去看看内核是如何是实现的,看一下逻辑.我们会发现进程的哈希表存储140种优先级的进程,位图是5个int类型的数组,总共32*5 = 160个二进制位,够表示哈希表了.最为关键的是这里面存在两个一摸一样的结构,其中结构1可以作为正在执行的进程,结构2看作后面出现新进程先加入到结构2中,等着结构1执行完了,它们两个一交换就可以了.
进程切换
这里谈一下进程切换,算是这篇博客最后的内容了.在谈着这个问题之前,我们先来看看CPU里面的寄存器.在CPU中存在两种不同类型的寄存器,这里我们先不解释.
我们看一下下面的代码,我们都知道a是一个存在栈区的局部变量,那么我们为何可以得到a里面的数据.
int func(){int a = 10;return a;}
【Linux进程理解】这个我们在函数栈帧的博客里面已经谈过了,造作系统会把这个值放在寄存器中,这种寄存器就是可见寄存器.同样还存在一个不可见寄存器,这种寄存器是保存进程的信息的.我们知道进程在执行一段时间后就会脱离CPU,那么这个脱离寄存器的的进程肯定需要保存进程的信息,这里面的信息就叫做上下文,上下文是保存在不可见寄存器当中.等着下一次该进程再次被执行,里面的上下文在被释放出来.这里我要提一下,寄存器的数量是不多的,但是不是一个寄存器只能保存一个上下文.