ARMV8上实现一个OS ---(6)调度(RR、FIFO)

        上一章节我们为OS添加了一个中断,实现了任务的自动切换,本章节我们将为OS添加调度,并增加两种调度策略。

任务的状态

        在我们的OS中我们将任务分成了以下几种状态:

  • 就绪状态(HF_TASK_READY),处于就绪态的任务随时可以被调度,任务在被创建之后处于就绪状态,会被加入到就绪队列中,等待被调度。
  • 挂起状态(HF_TASK_SUSPEND)。处于挂起状态的任务在等待一种资源(互斥量、信号量等),会在等待资源的等待队列中,当任务等到了资源时转为就绪状态。
  • 休眠状态(HF_TASK_SLEEP)。处于休眠状态的任务表示该任务无事可做,要休眠一段时间,待休眠时间结束后,将转变为就绪状态。
  • 删除状态(HF_TASK_DELETED)。处于删除状态的任务表示已经被停止了,等待被回收。

任务状态的转换

调度策略

FIFO

        先进先出的调度策略(First In, First Out),这种策略是按照加入就绪队列的顺序进行调度。同优先级的认任务不可以进行抢占,除非该任务自己让出CPU(等待资源或者休眠)。

特点:

        根据优先级进行调度,支持高优先级抢占。同等优先级的任务执行时间由任务自主决定。

任务的切换时机:
  • 高优先级抢占
  • 主动让出CPU(等待资源或休眠)

RR

        时间片轮转调度策略(Round-Robin,RR),这种调度策略能够保证同优先级的任务在CPU上的执行时间保持在一个公平的状态。当任务的时间片耗尽时,切换到下一就绪任务。

特点:

        根据优先级决定调度顺序,支持高优先级抢占。同等优先级的任务执行时间由时间片来决定。

任务的切换时机:
  • 高优先级抢占
  • 时间片用完(在定时中断进行处理)
  • 主动让出CPU(休眠或者等待资源)

就绪队列

        位于就绪队列中的任务随时可以被调度器调度。

        为了支持优先级,我们给每个优先级设计了一个链表,同一优先级的任务挂在就绪队列的同一个链表上。

        为了快速找到最高优先级,定义了一个bitmap,当该优先级上有task时,会将对应的位设置为1,当删除任务时,方便快速查找下一个最高优先级的任务队列。同时定义了prio_max记录当前最高优先级的任务,在调度器工作时可以直接使用。

/* bitmp的长度 */
#define PRIO_BITMAP_COUNT   ((HF_CONFIG_RT_PRIO_MAX + BITS_PER_LONG - 1) / BITS_PER_LONG)

/* 就绪队列 */
typedef struct hf_ready_queue
{
    hf_list_t *task_list[HF_CONFIG_RT_PRIO_MAX];               //每个优先级的队列
    unsigned long priority_bitmp[PRIO_BITMAP_COUNT];    //用于标记那个优先级上有任务
    int prio_max;                                       //当前就绪队列上最大优先级的任务
} hf_rq_t;

调试问题:

first任务退出后,不能正常切换到,创建的新任务上。

原因分析:在first task推出后没有调用delete接口将任务删除,中断中会选定first task运行,而first task退出了,所以产生了异常。应该在测试程序退出时,将first task删除,才能保证调度正常运行。

代码编译和运行:

代码下载和编译

//本次有三个运行的用例,修改main.c中的TEST_CASE
//数值,进行不同的场景测试。

git clone https://gitee.com/genglufei/hfos.git
cd hfos/day5_scheduler/hfOS/vendor
./build_hfos.sh qemu_a57
./run_hfos.sh

1)创建了20个优先级不同的测试任务,只运行最高优先级的那个。

2)创建20个优先级相同的任务,task会根据时间片进行切换

 3)创建20个比first优先级更高的任务,测试抢占。由于我们的函数相当于while(1),所以最终只能创建出一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值