与任务调度的执行顺序相关的问题总结
进程调度执行顺序
进程调度是指操作系统在不同程序之间的切换,
调度的依据主要是:CPU利用率、系统吞吐量、周转时间、等待时间、相应时间等几个指标,目的是使得进程调度高效。
基于这些指标,提出了一些进程调度的相关算法:
- 先来先服务调度
- 最短作业优先调度
- 高响应比优先调度
- 时间片轮转调度
- 最高优先级调度
- 多级反馈队列调度
基于这些调度算法,基本可以确定进程的执行顺序(进一步还需考虑阻塞挂起等问题)
线程调度执行顺序
线程的调度不像进程一样可确定,虽然线程调度也可分抢占式和非抢占式两种,但多线程程序的执行有随机性,即多个线程会抢夺CPU的使用权。
具体来说,当线程start之后,线程被纳入到线程调度器中统一管理,它无权索取时间片,只能被动分配,不过我们可以通过为线程设置优先级,优先级高的线程获取时间片的概率会高一点。
优先级反转
-
概念
优先级反转概念一般在嵌入式领域提及,举例说明如下:
三个任务H、M、L,优先级依次降低;
L任务持有资源A,正在运行,H任务想运行,但是它在等待资源A(被L任务用互斥量、信号量等锁住了),因此挂起等待该资源
恰巧此时M任务被调度,它无需等待,因此打断了L任务,
但此时注意到它竟然比H任务还要先执行了,这就是任务优先级反转。
-
危害
优先级反转会造成任务执行时间的不确定性,进而破坏了实时系统的实时性,严重可能导致系统崩溃
导致任务错误,逻辑错乱。
-
解决方式
-
优先级继承
当H任务等待时,L任务的优先级临时调整为H的优先级
FreeRTOS使用的方式,该方式不能解决优先级反转,只能将其影响降低到最小,硬实时系统一开始设计师就要避免优先级反转发生
-
最高优先级
直接给临界区赋予最高优先级,这样它就不会被任何中断打断了
-
禁止所有中断
禁止中断了自然不会发生优先级反转了
-