51-52 - 进程状态设计

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

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 整体实现规划

  1. 实现空闲TaskNode队列(填充预定义数量的TaskNode)
  2. 初始化预定义任务(调度进入就绪队列)
  3. 启动第一个任务(调度进入执行队列)
  4. 实现KillTask()
  5. ……

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关于优先级的一些扩展

  • 决定任务是否被调度执行的因素可能不止一个
  • 需要将各个因素综合考虑后计算任务优先级
  • 优先级的高低只能决定获取处理器资源的多少
  • 任何设计方案都需要保证每个任务有机会执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值