Unix操作系统里的优先级
在《Unix传奇》中有这样一句话,用户态的进程/线程是三等公民、root线程是二等公民、硬件中断是一等公民。
在操作系统中,"用户态"和"内核态"是两种不同的执行级别或模式。进程和线程是用户态下的执行实体,而硬件中断处理则通常在内核态进行。这里的“三等公民”、“二等公民”和“一等公民”是形象地描述它们在资源访问权限和优先级上的不同。
嵌入式系统里的优先级
在嵌入式系统的所有线程中,app_task掌握其他任务的生杀大权,它的时间流程是确定的。
因此,在嵌入式框架中,我们往往也会采用 执行具体任务的线程是三等公民、app_task是二等公民、硬件中断是一等公民。
下面我们以一个嵌入式的语音助手为例,分别探讨其内部的组成。首先先展示下它的整体框图。
-
硬件中断
-
app_task
在app_task中,我们使用switch语句确保每个时刻都只处于一个状态。
static void app_task(void *arg) {
while (true) {
switch (state) {
//等待唤醒
case WAKEUP_WAITING: {
} break;
//开始录音和上传
case RECORDING: {
} break;
//等待服务器返回音频
case PLAY_WAITTING: {
} break;
//等待播放完成
case PLAY_DONE_WAITING: {
} break;
//连续对话
case VOICE_DETECT: {
} break;
//结束本次唤醒
case END: {
} break;
}
}
- 执行具体任务的线程
app_task给其他任务发送任务通知,
并且,其他每个任务都有事件组负责监控任务状态。
任务与任务之间一般使用队列进行通讯。
任务间的优先级 与 个人生活
通常任务存在两种任务调度策略:
-
抢占式调度:在这种模式下,高优先级的任务拥有随时中断低优先级任务的权限。这可以类比于那些目标明确、行动果断的人,他们总是能够迅速抓住机会,优先处理最重要的事务。 优点是重要的事会保证执行,缺点是当下看起来不重要、需要长期坚持的事可能会被忽视。
-
轮转调度:所有任务被赋予相同的优先级,它们将按照既定的时间片轮流执行。这种方式类似于那些遵循计划、按部就班的人,他们坚持均衡原则,确保每项任务都能得到均衡的处理时间。 优点是每件事都有足够时间来执行,但是重要的事被分配的时间就会变少。