18 Star 39 Fork 83

openEuler / UniProton

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
task.md 4.21 KB
一键复制 编辑 原始数据 按行查看 历史

任务介绍

什么是任务

任务是代码运行的一个映象。从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、内存空间等系统资源,并独立于其它任务一起并发运行。

UniProton是一个单进程支持多线程的操作系统。在UniProton中,一个任务表示一个线程。

为什么需要任务

用户在编写大型程序时,往往会包含多个模块或多个功能,这些代码之间需要一些切换、同步等动作。如果切换、同步这些功能完全由用户自己去实现,会花费很大的精力。UniProton的任务模块可以给用户提供多个任务,实现了任务之间的切换和通讯,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。

概念解释

名称 解释说明
任务优先级 任务优先级表示任务执行的优先顺序,用数字表示。数字越小,优先级越高。就绪列表中高优先级的任务先得到执行,同优先级任务按照就绪列表顺序执行,新创建的任务位于就绪列表尾部。多个任务可以具有相同的优先级。
任务原始优先级 UniProton在处理任务优先级反转时,任务优先级为当前运行优先级,而创建时的优先级和动态调整的优先级由任务原始优先级表示。处理完毕优先级反转后,任务当前优先级会回到该原始优先级。
任务状态 UniProton 系统中的每个任务都有多种运行状态,包括就绪、运行、阻塞、挂起。
任务PID 任务ID作为任务的重要标识,在任务创建时通过参数返回给用户。用户可以通过任务ID对指定任务进行任务挂起、任务恢复、查询任务信息等操作。
任务入口函数 任务创建发生调度后将首次执行的函数。该函数由用户实现,在任务创建时通过任务创建结构体指定。
任务上下文 任务在运行过程中使用到的一些资源如寄存器、栈指针等,我们称为任务上下文。
任务栈 系统给每一个分配的一块内存空间,任务切换时会将本任务的上下文保存在任务栈中,以便任务恢复时从任务栈中提取任务上下文从而继续执行。
任务栈区间 系统中的一块内存空间,专门用来保存任务的任务栈。
任务自删除 当一个任务(任务A)的所有操作都已结束,下一个任务创建时系统会删除任务A占用的相关资源。详细请参见SRE_TaskDelete 的注意事项。
IDLE任务 若系统未裁剪任务模块,则系统在初始化时默认会创建一个最低优先级的IDLE任务,作为背景任务,以确保系统在没有其它运行态的任务时正常运行。

运作机制

UniProton中的任务是抢占式调度机制,而非时间片轮转调度方式。高优先级的任务可打断低优先级任务的执行。低优先级任务必须在高优先级任务挂起或阻塞后才能得到调度。

AMP调度方式

任务调度会使系统切换到当前就绪列表中最高优先级的任务。任务调度是否一定会发生任务切换,还需要看系统整体运行状态。任务调度流程如下:

  1. 获取就绪列表中最高优先级任务。
  2. 判断最高优先级任务是否为当前任务、判断是否锁任务调度。
  3. 判断是否在中断中,如果在中断中,则不需要保存当前任务上下文。
  4. 保存当前任务上下文。
  5. 将当前任务切换到最高优先级任务。并恢复最高优先级任务上下文。
说明: 
· 触发任务调度动作包括:创建任务(OS初始化中创建任务不会发生任务调度)、任务挂起、任务恢复、任务延时、解锁任务调度、信号量操作等。
· 阻塞的任务不在就绪列表中。
· 当前任务为最高优先级任务或锁任务调度时,任务调度会退出,不会进行任务切换。
· 如果在中断中发生任务调度,那么将记录下切换标志位,在用户ISR退出后进行任务切换。由于中断响应是已经将保存过当前任务上下文,所以中断退出后切换任务只需要恢复最高优先级任务上下文即可。
1
https://gitee.com/openeuler/UniProton.git
git@gitee.com:openeuler/UniProton.git
openeuler
UniProton
UniProton
master

搜索帮助