进程调度的任务有三:
1.保护处理机的现场信息;
2.按某种算法调度进程;
3.将处理机分配给进程。
这里我谈谈进程的调度算法
早期采用的调度方式是基于非抢占式的,也就是说当cpu被分配给一个进程后,它就会一直运行下去,直到该进程完成,或者发生某件事情而导致阻塞时,cpu才会被分派给其他进程。所以它不适用于分时系统和大多数实时系统;
所以现在基本都是采用抢占方式,就是说可以根据一些原则,来中断正在运行的进程,将cpu的使用权交给其他进程,抢占的主要原则有:
1.优先权原则;
2.短进程优先原则;
3.时间片原则。
进程调度机制
再说调度算法之前我们应该了解进程调度机制中的几个基本部分
1.排队器,为了提高调度效率,应该事先将系统中所有的就绪进程按照一定的策略排成一个或多个队列,每当有一个进程变为就绪状态时,排队器就将它放入某个就绪队列。
2.分派器,分派器根据进程调度所选定的进程,将其从就绪队列中取出,然后进行从分派器选出进程间的上下文切换,将cpu分派给新选出的进程。
3.上下文切换器,在对处理机(cpu)进行切换时,会发生两对上下文的切换操作;
1>.第一对上下文切换时,os将保存当前进程的上下文,也就是进程的现场保护,就是把当前进程的cpu寄存器内容保存到该进程的pcb的相应单元,再装入分派程序的上下文,以便分派程序的运行
2>.第二对上下文切换,将分派程序的上下文移出,把新选进程的现场信息装入各个相应的寄存器。
目前最主要的几种进程调度算法有以下的几种:
1.先来先服务(FCFS)
先来先服务调度指的是每次取就绪队列中的队首进程,将cpu的使用权交给它
2.短进程优先(SJF)
从就绪队列出选出最短的进程,这种算法也可以说是一种高优先权的算法,这里所说的短,是说它的要求服务时间的长短,要求服务的时间越短那么它的优先权就越高,也就是选出要求执行时间最短的进程来运行,所以我们必须实现知道进程的运行时间。
3.优先级调度算法
按照进程的优先级来调度进程,在进程创建的时候给根据每个进程的紧迫程度赋予每个进程一个优先级,每次调度只需要在就绪队列中选出优先级最高的进程。
4.高响应比优先
结合FCFS和SJF而提出的一种调度算法,因为FCFS算法只是考虑了作业的等待时间而忽视了运行时间,SJF只是考虑了运行时间而忽视了运行时间,两种算法都会导致有些进程等待时间过长,出现饥饿现象。高响应比优先能很好的解决这个问题,它是这样来计算优先权的:
优先权=(等待时间+要求服务时间)/要求服务时间
而等待时间+要求服务时间=响应时间,所以该优先权又可以成为响应比
响应比=响应时间/要求服务时间
可以看出随着等待时间的增加它的优先级会越高。
5.时间片轮转算法
时间片轮转算法是将系统中的所有进程安FCFS排成一个就绪队列,系统设定一个时间间隔产生一次中断,让这个队列的所有进程都执行一个时间间隔,如此循环便可以执行完所有的进程。
1>.多级队列调度
将进程的就绪队列拆分成若干个队列,将不同类型或性质的进程固定分配到不同的就就绪队列,不同的就绪队列采用不同的调度算法。
2>.多级反馈队列调度
1).设置多个就绪队列。第一个优先级最高,后面的次之,每个队列的时间片设置也不同,第一个最长,后面次之
2).每个队列都采用FCFS算法。首先一个进程到来,先将他放入第一个就绪队列,如果在该时间片内执行完成,则撤离系统,如果没有完成,则放到第二个就绪队列,依次往后。
3).按照优先级调度。就是说只有当第一个就绪队列为空的时候才能执行第二个就绪队列中的进程。