方便回顾篇进程

来源:互联网 发布:linux timekeeper 编辑:程序博客网 时间:2024/05/16 18:53

进程篇

进程的创建:分配进程控制块,初始化寄存器,初始化页表,将程序代码从磁盘读到内存,处理器设置为用户态,跳转到程序起始地址开始执行。

 

 

PCB

 

进程是资源分配的基本单位,线程是调度的单位

线程有独立的寄存器,程序计数器,栈,和状态。

 

线程控制块

 

根据线程的管理者分为内核态线程和用户级线程。用户级线程是有进程自己进行对自己的线程的管理,而内核级线程是让操作系统来进行管理的。

 

内核态线程的优缺点:优点就是给编程带来了便利,缺点就是消耗内核的资源,

线程的调度效率低,因为要从用户态切换到内核态。

用户态线程的调度,创建销毁,管理,都是有用户进行管理的,内核并不知道存在线程。

 

现代通常采用的线程模型是结合二者,通过多对一来使多个用户线程对应内核线程。

通常会产生阻塞的线程由内核接管,而不产生阻塞的就由用户接管,

 

当发生中断或者异常时会由用户态转换成内核态。系统调用。也会由用户态转换成内核态。

 

 

进程调度算法

先来先服务调度,

根据程序的先后顺序,先启动的程序先服务,直到这个进程结束或者阻塞,才会去调度下一个进程。

 

 

时间片轮转,

按照一定的时间间隔来轮流调度进程,似的每个进程都会被调度。

 

短作业优先,其中又出现了两个变种,一个是抢占的一个是非抢占的。

抢占式,每个进程都具有优先级,其中短任务的优先级较高,长任务的优先级低,

优先执行优先级高的程序,如果在执行过程中有其他优先级高的任务,那么就抢占当前任务。

 

优先级调度。

完全根据优先级进行调度,为了避免长任务被饿死,会动态的调整进程的优先级。

使得每个进程都会有机会执行。

混合调度算法,时间片轮转加上优先级

    将进程根据优先级分成组别,其中相同的优先级按照时间片轮转调度进行进程调度,而不同优先级组的按照优先级高的进程先调度。

 

 

 

 

实时调度算法:动态优先级调度和静态优先级调度

 

根据操作系统的类型:批处理,交互,实时操作系统来进行选择调度策略。

 

以上是操作系统的调度策略。具体的操作系统会有在根据某种具体的策略来实现某一进程调度算法。。

 

 

比如Linux进程的调度算法:完全公平调度,还提供了两种实时调度算法(FIFORR)。

实时调度器类要比普通调度器类优先级高。

 

linux调度器是以模块的方式提供的,不同类型的进程可以有针对性的选择不同的调度算法

基础调度是通过遍历调度器类(调度器类也具有优先级),选择优先级高的可执行队列不为空的调度类。

 

完全公平调度算法:CFS针对普通进程的调度类

这个调度算法是一种全新的调度算法,不再单纯的使用时间片,优先级。系统有一个虚拟时钟,每个进程也有个虚拟时钟,但是二者时钟并不是同步的,进程的虚拟时钟是根据它的进程优先级向前增长。虚拟时钟也就是vruntime

 

调度器总是选择跑得最慢的那个进程进行调度。

 

新进程的加入,它的vruntime是以当前可运行队列中最小的vruntime为基础进行设置的。

 

vruntime就是运行时间,每个进程根据优先级所映射的权值不同分得的处理器的事件占比不同,每个进程的运行时间累加到vruntime中,每次调度时选择运行队列中vruntime最小的那个进程,进行执行。优先级高vruntime会比较低,增长速度慢。

 

新进程的vruntime并不是0,而是根据当前的可运行队列中的最小vruntime为基础进行设置。

关于子进程一般都会优先于父进程执行 ,实现起来可以这样,比较父子进程的vruntime让子进程的vruntime是二者中的较小者,这样就能保证子进程先于父进程执行。

子进程的执行可能要进行延时,就是将子进程的vruntime略微提高一点,来推迟它的执行。

 

休眠中的进程它的vruntime将不再增长,唤醒的时候也会重新设置它的vruntime,以minvruntime(队列中最小的vruntime为基础)并进行适当的弥补。

 

每个进程都会有一个最小的执行时间,以免造成频繁进程切换。

 

执行队列是用红黑树来进行存储的,另外将进程插入到红黑树时用到的key是用vruntime减去min_vruntime的值作为key。这是为了解决溢出问题,因为vruntime是一个无符号的long而且是不断递增的那么就会出现溢出问题。

 

这棵红黑树就是绪队列,存放等待获取cpu的进程。,,,,其中正在运行和睡眠的进程都不在树上。

 

 

总结上面的进程调度过程,调度器首先遍历下所有的调度类,从高优先级调度类开始,如果这个调度器类中有待执行的进程,那么就使用该调度器类调度其中的进程,比如CFS调度器类中的可执行队列中有进程等待着调度,那么就使用该调度器类,调度普通进程。

0 0
原创粉丝点击