饥饿现象演示(Starvation)
饥饿现象是调度系统在缺乏公平性机制时产生的典型行为: 高优先级任务长期占用CPU,导致低优先级任务无法获得执行机会。
机制定义
Starvation = 高优先级持续运行 + Ready队列长期被覆盖 + 低优先级无法调度
相关API(API_V2): os_switch · os_dispatch_id · os_task_yield · os_delay
调度器模型
Scheduler = Ready队列选择 + 优先级决策 + 抢占机制 + 时间片策略(若启用)
饥饿现象不是错误,而是调度策略在“无公平补偿机制”条件下的自然结果。
触发条件
高优先级任务持续运行
任务进入循环执行且频繁占用CPU。
缺乏时间片轮转机制
调度器始终优先选择高优先级任务。
低优先级任务长期Ready
任务被唤醒但无法获得执行窗口。
无公平调度补偿
系统未引入RR或aging机制。
执行流程
1. 创建任务
初始化高优先级与低优先级任务。
2. 高优先级占用CPU
任务持续运行,形成调度主导。
3. 低优先级进入Ready
任务等待调度器分配CPU时间。
4. 调度长期偏置
Ready队列不断被高优先级任务抢占。
5. 饥饿现象出现
低优先级任务执行机会极低或消失。
演示代码
#include <hrtos.h>
sbit LED_HIGH = P1^0;
sbit LED_LOW = P1^1;
void task_high(void)
{
while(1)
{
LED_HIGH = ~LED_HIGH;
os_task_yield();
u16 i = 20000;
while(i--);
}
}
void task_low(void)
{
while(1)
{
LED_LOW = 1;
os_delay(10);
LED_LOW = 0;
os_delay(10);
}
}
void hrtos_main(void)
{
os_task_create((unsigned int)task_high, 1, 4, 5);
os_task_create((unsigned int)task_low, 2, 1, 5);
}
系统意义
饥饿现象揭示了调度公平性与实时性之间的冲突。 工程中通常通过时间片轮转(RR)、优先级继承或aging机制进行缓解。