调度算法

1、先来先服务(FCFS、FIFO)

    这个算法优点是简单,容易实现,并且似乎公平;缺点在于短的任务有可能变得非常慢,因为其前面的任务占用很长的时间,造成了平均响应时间非常慢。

2、时间片轮转法(Round-Robin)

  这是对FIFO算法的改进,目的是改善短程序(运行时间短)的响应时间,其方法是周期性地进行进程切换。这个算法的关键点在于时间片的选择,时间片过大,那么轮选就越接近于FIFO;如果太小,进程切换的开销大于执行程序的开销,从而降低系统效率,因此选择合适的时间片就非常重要。选择时间片的两个需要考虑的因素:一次进程切换所使用的系统消耗,以及我们能接受的整个系统消耗、系统运行的进程数。

  时间片轮选法看上去十分公平,并且响应时间非常好,然而时间片轮转并不能保证系统的响应时间比FIFO短,这很大程度上取决于时间片大小的选择,以及这个大小,与进程运行时间的相互关系。

3、短任务优先法(Short Time to Complete First)

  这种算法的核心是所有的程序都有一个优先级,短任务的优先级比长任务的高,而OS总是安排优先级高的进程运行。

  STCF又分为非抢占式和抢占式两类。非抢占式就是让已经运行的程序执行到结束或者阻塞,然后在所有的就绪进程中选择执行时间最短的来执行;而抢占式就不是这样,在每一个新的进程时,就对所有进程(包括正在CPU上执行的进程)进行检查,谁的执行时间短,就运行谁。

  STCF总是能提供最优的响应时间,然而它也有缺点:第一,可能造成长任务的程序无法得到CPU时间而饥饿,因为OS总是优先执行短任务;其次,关键问题在于我们怎么知道程序的运行时间,通常有两个方法,使用启发式方法估算(如根据程序大小估算),或者将程序执行一遍后记录其所用的CPU时间,在以后的执行过程中就可以根据这个测量数据来进行STFC调度。

4、高优先级优先

  STCF遇到的问题是长任务的程序可能饥饿,那么优先级调度算法可以通过给长任务的进程更高的优先级来解决这个问题;优先级调度遇到的问题可能是短任务的进程饥饿,这个可以通过动态调整优先级来解决。实际上动态调整优先级(权值)+时间片轮转的策略正是Linux的进程调度策略之一的SCHED_OTHER分时调度策略,它的调度过程如下。

(1)创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。

(2)将根据每个任务的nice 值确定在CPU上的执行时间(counter)。

(3)如果没有等待资源,则将该任务加到就绪队列中。

(4)调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算结果,选择计算结果最大的一个去运行。当这个时间片用完后或者主动放弃CPU时,该任务将被放在就绪队列末尾或等待队列中。

(5)此时调度程序重复上面计算过程,转到第(4)步。

(6)当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第(2)步。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值