---- 整理自狄泰软件唐佐林老师课程
文章目录
- 1. 问题
- 2. 进程状态设计
- 2.1 任务生命周期
- 2.2 任务的状态
- 2.3 任务的生命周期与状态切换
- 2.4 状态切换概要设计
- 2.4.1 核心数据结构==>内核队列
- 2.4.2 KillTask() 实现思路
- 2.4.3 整体实现规划
- 2.4.4 编程实验:任务生命周期状态实现
- 2.5 思考
- 3. 问题与方案
- 3.1 当前问题
- 3.2 解决方案
- 3.3 新增任务数据结构成员
- 3.4 新增应用数据结构成员
- 3.5 调度流程设计
- 3.6 编程实验:基于优先级的任务调度
- 3.7关于优先级的一些扩展
1. 问题
- 如何实现 KillTask() 函数?
- KillTask:回收任务所占用的 系统资源,一个是占用 内存资源,另一个是占用 处理器资源。
2. 进程状态设计
2.1 任务生命周期
任务从开始执行到结束执行经过的时间
2.2 任务的状态
任务在生命周期中会经历不同状态
2.3 任务的生命周期与状态切换
2.4 状态切换概要设计
- 为 每种状态准备内核队列( 就绪队列,执行队列,等待队列 )
- 任务创建后立即进入就绪队列
- 调度器根据当前执行的任务数量决定 调度策略
- 执行时间结束的任务进入就绪队列
- 等待外部事件的任务进入等待队列
- 等待队列中的任务必须先进入就绪队列才能继续执行
2.4.1 核心数据结构==>内核队列
- 本质上:TaskNode变量的迁移(在不同的队列之间迁移)
2.4.2 KillTask() 实现思路
- 当KillTask() 被调用时,意味着当前执行的任务结束
- 因此:
- 将当前任务从执行队列移除,并移入空闲TaskNode队列
- 调度就绪队列中的任务进入执行队列(如果就绪队列存在任务)
- 执行队列中的队首任务被调度执行(调度下一个任务执行)
2.4.3 整体实现规划
- 实现空闲TaskNode队列(填充预定义数量的TaskNode)
- 初始化预定义任务(调度进入就绪队列)
- 启动第一个任务(调度进入执行队列)
- 实现KillTask()
- ……
2.4.4 编程实验:任务生命周期状态实现
【参看链接】:51-52 - 进程状态设计 / 51
2.5 思考
- 如果先被调度执行的任务不会结束,那么会发生什么?
3. 问题与方案
3.1 当前问题
- 在任务结束后才从就绪队列调度其它任务执行
- 当执行队列中的任务都不会结束时,其它等待的任务永远无机会执行
3.2 解决方案
- 为每个任务提供 优先级,使得每个任务均有机会执行
- 优先级的高低决定任务执行时间的长短
3.3 新增任务数据结构成员
3.4 新增应用数据结构成员
通过优先级priority计算任务每次调度执行的总时间数
3.5 调度流程设计
即:优先级越高,priority越小,total越大,能够执行的时间也就越长
3.6 编程实验:基于优先级的任务调度
【参看链接】:51-52 - 进程状态设计 / 52
3.7关于优先级的一些扩展
- 决定任务是否被调度执行的因素可能不止一个
- 需要将各个因素综合考虑后计算任务优先级
- 优先级的高低只能决定获取处理器资源的多少
- 任何设计方案都需要保证每个任务有机会执行