1. 前期回顾
前面的实验中,每个优先级下面只有一个线程,系统调度是根据优先级来切换线程,当同一优先级下有多个线程时,系统又是如何进行调度的呢?
同一个优先级下有两个或两个以上线程的时候,线程支持时间片功能,即我们可以指定线程持续运行一次的时间,单位为 tick。 假如有两个线程分别为线程 2 和线程 3,他们的优先级都为 3,线程 2 的时间片为 2,线程 3 的时间片为 3。当执行到优先级为 3 的线程时,会先执行线程 2,直到线程 2 的时间片耗完,然后再执行线程 3 。
2. 核心知识点
- 线程控制块中添加两个32位无符时间片相关变量init_tick和remaining_tick,init_tick表示初始时间片,remaining_tick表示剩余时间片。线程初始化时,init_tick和remaining_tick会被设置为用户传入的线程时间片值。
- 周期性进入的系统时基(SysTick)中断处理函数会将当前线程的remaining_tick递减1,如果判断当前线程的remaining_tick已减为0,则将remaining_tick重置为init_tick,将当前线程从就绪列表移除,并插入到该优先级下的链表的尾部,然后执行系统调度。这一过程表明当前线程时间片已经用完,需要让出处理器。