调度:一个系统会同时处理多个请求,但资源是有限的,调度就是用来协调每个请求对资源的使用方法。
优先级:优先级高的请求优先使用资源。
时间片:每个请求一次可以占用多长时间的资源。
任务(线程)调度
一般调度器会通过维护运行队列的方式来管理任务。linux中用红黑树来实现运行队列。任务在执行时若触发一定条件,则会停止执行,如任务还需被执行,则会被加入运行队列等待再次被调度。
- 执行完指定时间片后,将cpu让出
- 发起I/O请求,I/O返回前不会继续执行
- 主动停止执行或进入睡眠
- 被系统中断打断,系统优先处理中断
调度器的作用是做出调度决策,决策包括:
- 从运行队列中选出下一个运行的任务
- 决定执行该任务的cpu
- 决定该任务的时间片
调度指标
调度器应该做出什么样的调度决策?
批处理任务
01 吞吐量:单位时间内完成的任务数,尽可能高
02 周转时间:任务从被发起到执行结束所需时间,尽可能短
交互式任务
03 响应时间:任务从被发起到第一次向用户返回输出以响应用户所需时间,足够短
实时任务
04 实时性
共有指标:
05 能耗
06 资源利用率:保证系统资源被充分利用。
07 公平性:保证每个任务都有执行的可能。
08 调度开销:尽可能降低调度开销,缩短调度器做出决策的时延。
调度机制
进程调度机制负责进程在不同状态之间的转换。
概念 | 触发频率 | ||
长期调度 | 从批处理队列选取任务,为其创建进程并将其设置为预备状态,并放入运行队列; | 增加当前可被调度进程的数量 | 低 |
中期调度 | 避免内存使用过多;会根据某些策略选择被挂起的进程(换页机制会将该进程的内存换入磁盘),监控当前内存的使用情况,并在适当时机激活进程。 | 限制当前可被调度进程的数量,辅助换页机制 | 中 |
短期调度 | 主要负责进程在预备、运行、阻塞状态之间的转换。尽可能满足系统的调度指标。 | 高 |
进程分为:计算密集型,I/O密集型,长期调度可根据当前cpu、I/O利用率的情况,选取合适的进程交由短期调度管理。
(交互式/实时)任务不被长期调度管理,系统创建进程并将其直接放入运行队列。
单核调度策略
01 先到先得FCFS first come first served:每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
优点:保证任务执行顺序;不需要预知任务信息。
弊端:
- 在长短任务混合的场景下,导致短任务的周转时间与运行时间之比过大。
- 会导致I/O密集型任务长时间内无法执行,I/O资源利用率低。
02 最短任务优先SJF: 优先执行短任务,缩短平均周转时间。
弊端:
- 需要提前预知任务执行时间。
- 表现严重依赖任务到达的时间点,迟到的短任务无法受益。
03 最短完成时间任务优先STCF,短任务抢占:shortest time-to-complete first
弊端:长任务饥饿,对公平性不利
04 时间片轮转Round Robin:可定时响应用户,限定任务执行时间,时间到后切换到下一个任务。
优点:响应时间短;无需预知任务运行时间;不会出现长任务饥饿;
时间片长度的选择上需要考虑:响应时间;调度器调度开销;任务上下文切换的开销;
弊端:在任务运行时间相近的情况下,平均周转时间长。
05 优先级调度:为每个任务设置优先级,调度器可以确定任务执行的先后顺序。实时任务>交互式任务>批处理任务
- 多级队列:每个任务会被预先分配好设置的优先级,每个优先级对应一个队列,一个任务必须等到所有优先级更高的任务调度完后才可以被调度。相同优先级队列内部的调度顺序没有统一标准。
- 需提前预知任务信息:运行时间,资源使用情况等
- 需将I/O密集型任务优先级提高,提高资源利用率。
弊端:低优先级任务饥饿,需要监控任务等待时间,为等待时间较长的任务提高优先级。
优先级反转:高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。
优先级继承:是为了解决优先级反转问题。低优先级线程在获得同步资源的时候(如果有高优先级的线程也需要使用该同步资源时),临时提升其优先级。以前其能更快的执行并释放同步资源。释放同步资源后再恢复其原来的优先级。
- 多级反馈队列:维护多个优先级队列,相同优先级队列使用RR策略执行,动态设置任务优先级。
- 场景:无法预知任务信息,任务类型动态变化(计算密集/IO密集)。
- 目标:缩短周转时间,降低任务响应时间。
- 短任务优先级更高:降低平均周转时间;提高IO利用率;提高交互式任务响应时间。
- 低优先级的任务采用更长的时间片:减少任务调度次数。
- 定时将所有任务的优先级提至最高:避免低优先级任务饥饿。
06 公平共享调度:以份额量化任务对系统资源的占有比例,实现资源的公平调度。
- 彩票调度:每个任务持有一定比例的份额,份额越大越有可能被调度。(通过随机数来选择任务)
- 步幅调度:确定性方式。
07 实时调度:指标是任务是否能在截止时间之前完成。
多核调度策略
应该调度哪个任务;任务应该在哪个cpu执行;每个任务应执行多久。
01 负载分担:当一个cpu核需要调度任务时,根据全局策略选出下一个任务执行。
优点:设计和实现简单;不会出现cpu资源浪费的情况;
缺点:任务在多核之间的切换会导致大量调度开销,包括载入缓存、TLB刷新等。
02 协同调度:尽量让一组任务并行执行,避免同时调度有依赖关系的任务,避免关联任务(需要互相通信的)执行效率低的问题。
- 群组调度:将关联任务设为一组,以组为单位调度任务再多个cpu核心运行,使它们有几乎相同的开始结束时间。
可提升特定应用场景下任务执行的性能,如果场景不匹配则不是最优。
- 两级调度:每个任务尽可能在一个cpu核上运行,每个cpu核心都引入一个本地调度器。全局调度器和本地调度器构成层级化结构。
提高缓存的局部性,减少数据竞争的冲突。解耦多核及单核调度。可能导致多核之间的负载不均衡。
02 负载追踪与负载均衡:追踪每个cpu核心当前的负载,进行任务迁移以均衡负载。
- 调度实体粒度负载追踪:以单个任务为粒度。
- 负载均衡