OSEK任务管理

2024-05-07 05:44
文章标签 管理 任务 osek

本文主要是介绍OSEK任务管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 前言

        RTOS通过任务(task)来组织应用层程序框架(framework),支持任务的并发和同步执行(concurrent and asynchronous execution of tasks),并通过调度器(scheduler)来管理任务的执行,OSEK也概莫能外。

        OSEK将任务划分为基础任务(basic tasks)和拓展任务(extended tasks)两类。对于基础任务来说,它们会一直占有CPU,直至其主动终止(terminate)任务运行,或被高优先级的任务/中断抢占,才会释放CPU资源;而拓展任务的特殊性在于多了一个可阻塞的等待状态,即任务阻塞在那里等待一个事件的触发(WaitEvent,如等待一个队列的入队操作等),这一状态被称为等待状态(waiting state)

        拓展任务的等待状态的好处显而易见,即可以让出CPU资源给优先级较低的任务,但从OS的角度来看,相对于基础任务,其消耗的资源必然也更大,毕竟进入阻塞的等待状态前,需要对该拓展任务进行现场保护,这存在着时间和空间上的开销。

2 任务状态机模型

2.1 状态模型

        如图1所示,基础任务和拓展任务的区别主要在于waiting状态(等待态/阻塞态),而running(运行态),suspended(挂起态)和ready状态(就绪态)的定义完全相同。显然,由于基础任务没有等待状态,因此只包含任务开始和结束时这两个同步点(synchronisation point);对于有内部同步点的作业,还是拓展任务更能胜任。

3245792fd52e442ea77859620ede9868.jpeg

图1(a) 状态模型示意图

e7c3cf642dab41c48898730ac3206101.png

图1(b) 状态模型示意图

        此外,为了降低系统复杂度,OSEK规定只有任务本身可以终止自己(self-termination),如果一个任务调用ChainTask来链式激活自己,则会将自己加到对应优先级的就绪态队列尾部,等待调度执行;同时,没有从挂起态到等待态的直接转换路径,在挂起状态下,任务处于被动状态,即可以被激活。

        调度器(scheduler)根据调度策略(scheduling policy)来决定各任务的状态,选择当前得以运行的任务(使之从ready状态进入running状态),并为其统筹所有系统资源。从某种意义上,调度器本身也可以看作一种资源,在单核环境下,在同一时刻最多只能被一个任务占有,其本质是对应着CPU的计算资源。

2.2 任务优先级

        OSEK完全摒弃了动态设置任务优先级的方式,采用静态方式配置任务优先级,即不可再运行时更改任务优先级。0是最低任务优先级,数值越大,则代表优先级越高,这点与freeRTOS相同,与ARM中断优先级定义方式相反。

        此外,在BCC2或ECC2下,支持多个任务配置相同优先级。

2.3 调度策略

2.3.1 完全抢占式调度(Full preemptive scheduling)

        简单来说,完全抢占式调度只有一个规则,就是完全按照优先级来进行调度,谁的优先级高,谁就执行。正在运行的任务必须做好随时被拉下神坛的觉悟,一旦有优先级更高的任务出现,则必须退位让贤(保存上下文,退回就绪态,让出CPU)。这种随时随地可能发生的重调度也就意味着,任务间的共享数据必须做好同步,否则必有惊喜出现。

        总的来说,重调度点(触发系统调度)主要包括以下几种情形:

        ① 通过系统服务TerminateTask成功终止一个任务时,或通过系统服务ChainTask成功终止当前任务并激活下一个任务时;

        ② 任务级别的任务激活(Activating a task at task level),包括通过系统服务ActivateTask
激活任务、通过消息通知机制(message notification mechanism)激活任务、或定时器溢出(alarm expiration)来激活任务等;

        ③ 在拓展任务中调用系统服务WaitEvent时,任务进入等待状态;

        ④ 设置一个事件(event)以唤醒等待该事件的任务,事件的设置可以通过系统服务SetEvent或通过消息通知机制或在定时器溢出处理中来实现;

        ⑤ 任务级别的资源释放(通过系统服务ReleaseResource);

        ⑥ 从中断返回任务时(Return from interrupt level to task level);

        ⑦ 显式调用系统服务函数Schedule时,触发调度。

2.3.2 非抢占式调度

         该调度策略完全依赖于基于系统服务的显示调用来触发调度。在此策略下,任务的优先级显然也没多大意义了,高优先级的任务无法抢占低优先级的任务,只能等待低优先级任务主动让出CPU,这对于实时系统来说,显然时不利的。

        非抢占式调度的重调度点主要包括以下几种情形:

       ① 通过系统服务TerminateTask成功终止一个任务时,或通过系统服务ChainTask成功终止当前任务并激活下一个任务时;

       ② 显式调用系统服务函数Schedule时,触发调度;

      ③ 任务陷入等待状态,通常都是等待一个事件导致的(WaitEvent),其本质是任务被迫让出CPU的使用权。

2.3.3 任务组(Groups of tasks)

        OSEK支持对任务进行分组,以分别执行抢占式调度策略和非抢占式调度策略。具体来说,对于那些优先级小于等于组内最高优先级(the highest priority within a group)的任务,执行非抢占式调度策略(non preemptable tasks);对于那些优先级大于组内最高优先级的任务,执行抢占式调度策略。

        这么做有什么好处呢?一个典型的例子,可以将共享同一资源的任务分在一组内,而当任何组内占有这一共享资源时,都会通过优先级提升将任务优先级临时设置为资源的上限优先级(天花板优先级,ceiling priority of the resource),这会避免不必要的任务抢占和调度,毕竟共享资源本事就是临界资源。另一方面,对于那些优先级高于上限优先级且不需要该资源的任务,仍以抢占式调度策略来执行。

2.3.4 混合式抢占调度策略(Mixed preemptive scheduling)

         当系统上同时存在可抢占和不可抢占任务时,就需要应用混合式抢占调度策略。在这种情况下,会为任务添加上是否可抢占的属性标签,并在运行时执行对应的调度策略。这也就意味着,系统中的任务存在两种不同调度类型,即可抢占和不可抢占(preemptable or non preemptable),这与任务类型(task type,基础任务和拓展任务)是相互独立的、不同维度的概念。

        在完全抢占式调度策略里混合点不可抢占的刺头的意义在哪呢?首先,如果一个任务的执行时间很短,短到同切换上下文(任务切换)的耗时接近,甚至更短,那就没必要抢占这个任务,让它执行结束好了;其次,不抢占意味着不用做上下文切换,也就省去了现场保护的内存开销,这对于RAM的节约相当友好;最后,也有可能存在一些这样那样的任务,人家本身就是不希望被抢占的。

 

这篇关于OSEK任务管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966484

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed