多任务操作系统
多任务操作系统就是能同时并发地执行多个进程的操作系统。多任务系统可以分为两类:非抢占式多任务和抢占式多任务,抢占式多任务是由调度程序来决定什么时候停止一个进程的运行,进程在被抢占之前能够运行的时间是预先设置好的,这个时间就叫进程的时间片。非抢占式多任务则只能通过进程自己主动停止运行。
常用调度算法
1.先来先服务算法(FCFS)
FCFS是最简单的调度算法,每次调度是从就绪队列中选择一个最先进入该队列的进程,一直运行直到其阻塞或完成。有利于长进程作业,适用于计算密集型,不适用与io密集型。
2.短作业进程优先调度算法 S(J)PF
优先选择预估运行时间短的进程,能有效降低作业的平均等待时间,提高系统吞吐率。
3.优先权调度算法
优先级高的进程先执行。分为静态优先权和动态优先权,静态优先权下进程优先级不变,动态优先权下,进程优先级会改变,例如就绪等待时,优先级随等待时间增加,运行时,优先级随运行时间降低。
4.基于时间片的轮转调度算法
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度,把cpu分给队首进程,并令其执行一个时间片,当时间片用完之后就将该进程送往对尾。
linux的进程调度——完全公平调度算法(CFS)
进程可以分为IO密集型和计算密集型,IO密集型只需要占用很少的cpu时间,但是一般要求立即响应,例如你在键盘上打字时一定不想按下键盘后系统过很久再响应吧,而对于计算密集型则希望尽可能获得多的CPU时间。
linux的进程调度是基于优先级的调度,优先级高的进程能优先运行并拥有更多的CPU使用时间。linux采用了两种不同的优先级范围:nice值和实时优先级。两种优先级范围不会交叉,因为拥有实时优先级的进程优先级永远普通进程。实时优先级越高进程优先级越高,nice值越高进程优先级越低。
linux的CFS算法与其它进程调度算法不同的地方在于CFS没有时间片的概念,而是通过一个运行时间比例来控制进程的运行时间,linux调度程序会在所有可运行进程的总数的基础上算出进程应该运行多久。通过一个虚拟实时的结构来存放进程运行了多久以及还需要运行多久。并通过红黑树来存储进程,这样在挑选出vruntime值最小的进程的效率比较高。
需要注意的是,完全公平调度算法并不是完全公平的,因为要是当可运行任务数量趋近于无限的时候,每个进程获得的处理器使用比就趋近于0,运行的时间也就趋近于0,这样无疑造成了不可接受的切换消耗。因此CFS引入了一个最小粒度的概念,让每个进程最少运行一个最小粒度的时间,默认情况下这个值是1ms。