今天,我们分享的内容主要是物联网操作系统中的任务管理。
在开始正式的阅读分享帖之前,按惯例,我们需要思考几个问题:
1.进程和线程,你是否了解其区别与联系?
2.什么是任务?
3.物联网操作系统中的任务管理主要包含那几个方面?
如果你认真的思考了上面的问题,那么请你阅读下面的分享,也希望你能Get到属于自己的盲点知识!
一、任务管理基本概念
进程:正在运行程序的一个实例
线程:进程中的一个实体,是被系**立调度和分派的基本单位
进程与线程的区别
线程是程序执行的最小单位,进程是操作系统分配资源的最小单位
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
进程之间相互独立,同一进程下的各个线程共享程序的内存空间
任务概念
从系统的角度看,任务是竞争系统资源的最小运行单元;任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行
Huawei LiteOS的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理业务程序流程
Huawei LiteOS是一个支持多任务的操作系统,在LiteOS中一个任务表示一个线程
Huawei LiteOS中的任务是抢占式调度机制,同时支持时间片轮转调度方式
二、任务管理原理
任务:由一组元素组成的实体
元素(用于管理每一个任务)
标识符:和任务相关的唯一标识符
任务名:任务名称
任务状态:用于表示当前任务正在执行或等待
优先级:代表任务执行的优先顺序
上下文栈指针:任务即将被执行的下一条指令地址
任务控制块(TCB:Task Control Block)
任务状态
用于描述任务所表现出的行为
就绪态(Ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态
运行态(Running):该状态表明任务正在执行,此时它占用处理器,LiteOS调度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的一刻,它的任务状态就变成了运行态
阻塞态(Blocked):如果任务当前正在等待某个时序或外部中断,我们就说这个任务处于阻塞状态,该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等
退出态(Dead):该任务运行结束,等待系统回收资源
任务状态间的迁移
就绪—>运行态
任务创建后进入就绪态,发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态,但此刻该任务依旧在就绪列表中
运行—>阻塞态
正在运行的任务发生阻塞(挂起、延时、获取互斥锁、读消息、读信号量等待等)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中剩余最高优先级任务
阻塞—>就绪态
阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态;如果被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务由就绪态变成运行态
就绪—>阻塞态
任务也有可能在就绪态时被阻塞(挂起),此时任务状态会由就绪态转变为阻塞态,该任务从就绪列表中删除,不会参与任务调度,直到该任务被恢复
运行—>就绪态
有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,依然在就绪列表中
运行—>退出态
运行中的任务运行结束,内核自动将此任务删除,任务状态由运行态变为退出态
阻塞—>退出态
阻塞的任务调用删除接口,任务状态由阻塞态变为退出态
任务栈
任务栈的大小按8字节对齐
作用
任务切断或响应中断时,任务栈用于保存CPU寄存器的内容
任务运行时,任务栈用于保存一些局部变量、函数参数等
任务优先级
优先级表示任务执行的优先顺序
任务的优先级决定了在发生任务切换时即将要执行的任务
在就绪列表中的最高优先级的任务将得到执行
高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度
Huawei LiteOS的任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31
三、任务调度
任务上下文
Huawei LiteOS在任务挂起的时候会将本任务的任务上下文信息,保存在自己的任务栈里面,以便任务恢复后,从栈空间中恢复挂起时的上下文信息,从而继续执行被挂起时被打断的代码
任务切换
任务切换包含获取就绪列表中最高优先级任务、切出任务上下文保存、切入任务上下文恢复等动作
调度算法
抢占式调度机制
时间片轮转调度机制
四、任务运行
创建任务
LOS_TaskCreateOnly:创建任务进入suspend态,不进行任务调度
LOS_TaskCreate:创建任务进入就绪态,进行任务调度
终止任务
LOS_TaskDelete:删除指定的任务
五、任务间通信
任务之间通过消息队列进行信息传输,实现任务间的通信
消息队列
用于任务间通信的数据结构
用于接收来自任务或中断的非固定长度消息
可根据不同的接口选择消息是否存放在自己的空间中