进程调度的方式分为:抢占式和非抢占式
采用非抢占式时,一旦把处理机分配给某进程后,就让他一直运行下去,决不会因为时钟中断或其他任何原因去抢占当前正在运行进程的处理机。直至该进程完成或因为某件事情堵塞,才把处理机分配给其他进程。
采用抢占式时,根据某种规则将某个正在执行的进程暂停然后把处理机分配给另一进程。这样的方式称为抢占式。抢占不是任意的是需要遵守某些规则的。
时间片轮转算法是主要应用在分时系统当中,在这种算法当中,系统将所有就绪进程按照FCFS策略排成一个就绪队列,调度进程总是选择就绪队列当中的第一个进程执行,但仅能运行一个时间片。在使用完一个时间片之后即使进程并未完成,它也必须被剥夺处理机让下一个进程运行。当然被剥夺之后他会处在这个队列的末尾重新排队。
时间片太长那么每一个进程都可以运行完这样就是先来先服务了,若是时间片太短那么就会频繁进行切换就会使处理机的开销很大。因此时间片应该选择恰当。
多级反馈调度队列是融合了时间片轮转调度算法和优先级调度算法。
多级反馈调度队列实现思想:
1.设置多个反馈队列,并为每个队列赋予不同的优先级。第一个队列优先级最高,第二个其次,其余队列逐次减少。
2.赋予各个队列的进程的运行时间片的大小各不相同。优先级越高的队列时间片越小。
3.每个队列中都是采用先进先出算法
4.按队列的优先级进行调度
基于公平原则的调度算法:1.保证调度算法:如果在系统中有n个相同类型的进程同时进行,为公平起见,须保证每个进程都获得相同的处理机时间1/n。
实时调度
实现实时调度的基本条件
1.提供必要的信息 就绪时间 开始截止时间和完成截止时间 处理时间 资源要求 优先级
2.系统处理能力强
3.采用抢占式调度机制
4.具有快速切换机制
实时调度算法分类也是分为抢占式和非抢占式
这里分为最早截止时间(EDF)优先和最低松弛度(LLF)优先算法
最早截止时间(EDF)优先是根据任务的截至时间确定任务的优先级,任务的截至时间越早,优先级越高。具有最早截止时间的任务排在队列的队首。
非抢占式调度方式用于非周期实时任务
- 任务1最先到达最先开始执行
- 任务1执行过程中任务2、任务3到达,由于任务3截止时间更早,其优先级愈高,所以执行完任务1后执行任务3
- 任务3执行过程中任务4到达,由于任务4截止时间更早优先级愈高,任务3执行完后执行任务4,
- 最后执行任务2
抢占式调度方式用于周期实时任务
第二行中
固定A,B优先级,且优先级A>B;
先执行A1,A1执行完后执行B1;
B1执行了10ms后被A2抢占;
A2执行完后继续执行B2;
B2执行10ms后被A3抢占;
A3执行完后已经到达B2的截止时间了,但B2总共执行了20ms,很明显低于所需处理时间25ms。
第三行中
固定A,B优先级,且优先级B>A;
先执行B1,B1执行完后已经过了A1的截止时间,可知A1根本就没能执行到。
第四行中
A1截止时间早于B1截止时间,先执行A1;
A1执行完执行B1,B1执行10ms后A2到达;
A2截止时间早于B1截止时间,先执行A2;
A2执行完执行B1,B1执行10ms后A3到达;
B1截止时间早于A3截止时间,继续执行B3;
以此类推,每个任务有序无错过进行,能满足系统的要求。
最低松弛度(LLF)优先
该算法在确定任务优先级的时候,根据的是任务的紧急(或松弛)程度。任务紧急程度越高,优先级越高。
主要用于可抢占式调度方式中。
任务松弛度计算公式:任务的松弛度=必须完成时间-其本身的运行时间-当前时间
周期性任务A,要求每20ms执行一次,执行时间为10ms;
周期性任务B,要求每50ms执行一次,执行时间为25ms;
t=0s时,A1的松弛度=20ms-10ms-0ms=10ms,B1的松弛度=50ms-25ms-0=25ms,先执行A1;
A1执行完后,B1的松弛度=50ms-25ms-10ms=15ms,A2的松弛度=40ms-10ms-10ms=20ms,执行B1;
B1执行10ms后,B1的松弛度=50ms-25ms-20ms=5ms,A2的松弛度=40ms-10ms-20ms=10ms,继续执行B1;