文章目录
- 交互系统中的调度
- 轮询调度
- 优先级调度
- 静态分配
- 动态分配
- 彩票调度
- 多级反馈队列MLFQ
- 公平分享调度
- 实时调度
- 线程调度
先来先服务
用于非抢占式调度算法。
基于时间片 -> 抢占式 -> 绝对非抢占
磁盘任务放到内存 -> 作业调度
内存任务放到CPU -> 进程调度
缺陷:某任务耗时非常长,整个任务队列的任务的周转时间非常长,整个系统的体验很差。
短作业优先(SJF)
评估作业的时间,短的优先。
缺陷:你怎么知道哪个作业运行多少时间?
周转时间任务结束时间 - 任务进入队列的时间
最短剩余时间优先(SRTN)
现实中,不会那么多任务一起到达,如果B执行了99%,来了个A任务,作业时间比B短,那就又跑过去执行B了。所以动态优化,优先调度剩余时间最短的任务。
交互系统中的调度
响应时间:被CPU揪出来的时间 - 进入就绪队列的时间
轮询调度
轮询算法(RR):每个进程分配一个时间片,轮着来。
关键:时间片的长度不能太长,会让其他进程等待过长;时间片也不能太短,导致每个任务执行的太少了,还花费大量时间在调度上。
运行态转换成就绪态只有两种情况:
1.时间片到了 -> 回到就绪态队列
2.高优先级的进程来了(基于抢占式OS)
OS系统初始化会初始化一个中断向量表,里面记录着异常、中断的处理函数首地址,里面就有定时器中断(CPU提供的);
Q:定时器中断发生了,是否代表时间片到了?
A:不是,定时器可能是1ms一次,而时间片是100ms,当累加到100时,时间片到了,去执行调度算法。
Q:定时器中断为什么设置那么小?
A:因为一些中断可能比较微小(比如超时服务,5ms),那么时间片太大了,不足以描述中断,那么时钟中断就来帮忙。
所以说时钟中断有两个作用:
1.累加到时间片长度,启动调度程序;
2.处理中断。
优先级调度
静态分配
轮询调度的每个进程的优先级是相同的;
优化分配方式就引入了优先级;
优先级高的先执行。
动态分配
如果这个进程运行快,那么就优先让他运行。
所以在动态调整中I/O密集型优先级高一点,CPU密集型优先级低一些。
Q:你怎么知道是I/O密集型还是CPU密集型?
A:系统通过查看时间片是否用完来判断:如果时间片到了你还没工作完,一直占用CPU,那就是CPU密集型;如果你主动放弃了CPU,那你就是I/O密集型。
-然而这么做有一个缺点:如果有一个黑客程序,在即将用完时间片时主动放弃CPU,那么就会被系统判定为I/O密集型而保持/提高优先级,此时他就会一直抢占CPU,其他进程饿死了。
彩票调度
ABCD四个进程,100张彩票,优先级高的彩票拿的多,比如A40,其他都20,系统随机摇号码,那么即可保证A运行的多,而且其他进程也不会饿死。
弥补了动态分配的缺陷。
多级反馈队列MLFQ
1、若A优先级>B优先级,运行A
2、若A优先级 == B优先级,RR(轮询)
3、刚进入系统时,放在最高优先级
(原)4、工作用完了整个时间片,降级;如果主动放弃CPU,优先级不变
(新)4、每层分配一个时间配额,达到自动降级
5、经过一段时间,将系统所有任务重新加入最高优先级
越下层时间片越长
公平分享调度
在多用户系统下,如果用户任务多,分配反而少,所以需要一个调度算法来保证公平,也就是大家都一样,无论多少任务,分到的时间片都一样。
实时调度
关注时间
软实时:如果你的截止时间不满足,依然会调。
硬实时:如果你的截止时间不满足,坚决不调。
线程调度
1、用户级线程中有一个程序,负责调度用户线程,而非内核在调度
2、用户级线程没有在内核中注册,由用户自己写的调度程序调度,而这个调度程序被内核捕获
用户进程抢到了时间片后,只回执行进程内的线程任务,在切换时间片之前不会被其他进程任务打断;
而在内核中,线程被调度程序塞到各种队列中去,CPU不管你是哪个进程的线程,只要在就绪队列中,抓来就要,可能交替运行。