OSEK:资源管理

本文探讨了资源管理在多任务环境中的关键作用,如何通过调度器、优先级上限协议和中断管理来确保并发访问的正确性,避免优先级反转和死锁问题。重点介绍了OSEK操作系统中的资源规则,以及如何通过信号量等同步机制实现高效协作。
摘要由CSDN通过智能技术生成

资源管理用于协调多个任务对共享资源的不同优先级的并发访问,例如管理实体(scheduler)、程序序列、内存或硬件区域。资源管理对于所有一致性类都是强制性的。资源管理可以有选择地扩展为协调任务和中断服务例程的并发访问。

资源管理确保:

  • 两个任务不能同时占用同一资源。
  • 不能发生优先级反转。
  • 使用这些资源不会发生死锁。
  • 对资源的访问永远不会导致waiting状态。

如果资源管理扩展到中断级别,它还保证:两个任务或中断程序不能同时占用相同的资源。

资源管理的功能在以下情况下很有用:

  • 可抢占任务
  • 非抢占任务,如果用户希望应用程序代码也在其他调度策略下执行
  • 在任务和中断服务例程之间共享资源
  • 中断服务例程之间的资源共享

如果用户不仅需要防止任务造成的中断,而且需要防止中断造成的中断,还可以使用操作系统服务来启用/禁用不会导致重新调度的中断。

1、访问被占用资源时的行为

OSEK操作系统规定了OSEK优先级上限协议(参见5),因此,不会发生任务或中断试图访问被占用的资源的情况。如果使用资源的概念来协调任务和中断,那么OSEK操作系统也确保只有在中断服务例程执行期间可能被占用的所有资源都被释放后,该中断服务例程才会被处理。OSEK严格禁止对同一资源的嵌套访问。在极少数需要嵌套访问的情况下,建议使用第二个与第一个资源具有相同行为的资源。OIL语言支持具有相同行为的资源(所谓的“Linked resources <链接资源>”)的定义。

2、使用资源时的限制

当资源被占用时,terminattask, ChainTask, Schedule, WaitEvent不能被调用。中断服务程序不能在资源被占用的情况下完成。当一个任务占用多个资源时,用户需要遵循后进先出原则(stack like)请求和释放资源。

3、调度器(Scheduler)作为一种资源

如果一个任务需要保护自己不被其他任务抢占,它可以锁定调度器。调度程序被视为所有任务都可以访问的资源。因此,将自动生成具有预定义名称RES_SCHEDULER的资源。接收和处理中断独立于资源RES_SCHEDULER的状态。但是,它阻止了任务的重新调度。

4、同步机制<例如使用信号量>的一般问题

优先级翻转

常见同步机制的一个典型问题——例如信号量的使用——是与优先级反转有关的问题。这意味着低优先级任务会延迟高优先级任务的执行。OSEK规定了OSEK优先级上限协议(参见5章)来避免优先级反转。图8-1说明了两个任务共同访问一个信号量的顺序(在完全抢占式系统中,任务T1优先级最高)优先级较低的任务T4占用信号量S1。T1抢占T4并请求相同的信号量。由于信号量S1已被占用,T1进入等待状态。此时低优先级的T4被中断,被优先级介于T1和T4之间的任务抢占。T1只能在所有低优先级任务都被终止并且S1信号量再次被释放后才可以执行。虽然T2和T3没有使用信号量S1,但它们的运行时延迟了T1。

死锁

常见同步机制(如使用信号量)的另一个典型问题是死锁问题。在这种情况下,死锁意味着由于无休止地等待相互锁定的资源,任务无法执行。

以下情况会导致死锁(如图8-2所示):任务T1占用信号量S1,随后无法继续运行,例如,因为它正在等待一个事件。因此,低优先级任务T2被转移到运行状态。它占用信号量S2。如果T1再次准备就绪并试图占用信号量S2,它将再次进入等待状态。如果现在T2试图占用信号量S1,这将导致死锁。

5、优先级上限协议

为了避免优先级反转和死锁的问题,OSEK操作系统需要以下行为:

  1. 在系统生成时,静态地为每个资源分配自己的最高优先级。最高优先级至少应设置为所有访问某个资源或与该资源相关的任何资源的任务的最高优先级。最高优先级低于所有不访问该资源的任务的最低优先级,高于所有访问该资源的任务的最高优先级
  2. 当任务需要某个资源时,如果当前任务的优先级低于该资源的上限优先级,任务的优先级将提升至该资源的上限优先级
  3. 如果该任务释放了该资源,该任务的优先级将重置为需要该资源前动态分配的优先级

优先级上限的原理如图8-3所示。任务T0的优先级最高,任务T4的优先级最低。任务T1和任务T4需要访问相同的资源。系统清楚地表明不存在无界的优先级反转。高优先级任务T1等待的时间小于T4占用资源的最长时间。

6、带中断级别扩展的OSEK优先级上限协议

资源管理扩展到中断级别是可选的。

为了确定在中断中使用的资源的最高优先级,将比所有任务优先级高的虚拟优先级分配给中断。对软件优先级和硬件中断级别的操作取决于实现。

  • 在系统生成时,静态地为每个资源分配自己的最高优先级。最高优先级应该设置为所有访问一个资源或任何链接到该资源的资源的任务和中断例程的最高优先级。最高优先级应(<)所有未访问该资源的任务或中断例程的最低优先级,同时(>)所有访问该资源的任务或中断例程的最高优先级。
  • 如果任务或中断例程需要资源,而其当前优先级低于资源的上限优先级,则任务或中断的优先级将上升到资源的上限优先级。
  • 如果任务或中断例程释放了资源,该任务或中断的优先级将重置为需要该资源之前动态分配的优先级。

可能与正在运行的任务或中断例程占用相同资源的任务或中断例程不会运行,因为它们的优先级(<=)正在运行的任务或中断例程。如果一个任务占用的资源被释放,另一个可能占用该资源的任务或中断例程就会运行。对于可抢占的任务,如果任务的新优先级不是一个中断的虚拟优先级,这是一个重新调度的点。

例如:

(1)可抢占任务T1正在运行,请求与中断服务共享资源。常规INT1。任务T1激活更高一级的优先任务T2和T3。由于OSEK优先级上限协议,任务T1仍在运行。中断INT1发生。由于OSEK优先级上限协议,任务T1仍在运行,中断INT1正在等待。中断INT2发生。中断服务例程INT2中断任务T1并开始运行。INT2完成后,继续T1任务。任务T1释放资源。中断业务例程INT1正在运行,任务T1中断。INT1完成后,Task3正在运行。任务T3结束后,任务T2正在运行。任务T2终止后,任务T1继续。

(2)抢占任务T1正在运行。中断INT1发生。任务T1中断,中断业务例程INT1正在执行。INT1请求与中断服务例程INT2共享的资源。更高的优先中断INT2发生。由于OSEK优先级上限协议INT1仍然在执行,INT2正在等待。发生中断INT3。由于INT1的优先级比INT1高,因此INT3中断此中断服务例程并执行。INT3激活任务T2。完成INT3后,继续INT1。当INT1释放请求的资源后,INT2因为优先级高于INT1而被执行。INT2完成后,继续INT1。当INT1完成任务后,任务T2因为优先级高于任务T1而正在运行,任务T1已准备就绪。任务T2结束后,任务TI继续。

7、内部资源

内部资源是用户不可见的资源,因此不能通过系统函数GetResource和ReleaseResource寻址。相反,它们在一组明确定义的系统功能中严格地进行内部管理。除此之外,内部资源的行为与标准资源完全相同(优先级上限协议等)。

内部资源仅限于任务。在系统生成过程中,最多只能为一个任务分配一个内部资源。如果任务分配了内部资源,则内部资源的管理方式如下:

  • 当任务进入运行状态时,该资源会自动被占用,除非它已经占用了该资源。任务的优先级会自动变为资源的上限优先级。
  • 资源被自动释放(当任务被抢占时,内部资源不会被释放)实施过程可能会进行优化,例如只在有需要重新调度的情况下,才会释放/占用系统服务Schedule内的资源。

不可抢占的任务是一个特殊的组,它的内部资源与分配给RES_SCHEDULER的优先级相同。当需要避免在一组任务中进行不必要的重新调度时,可以在所有情况下使用内部资源。一个系统中可以定义多个组(=多个内部资源)。

对某些系统调用的一般限制(即在资源被占用时不能调用)不适用于内部资源,因为内部资源是在这些调用中处理的。但是,在内部资源释放之前,必须先释放所有标准资源。分配相同内部资源的任务覆盖一定范围的优先级。在相同的优先级范围内,可能有不使用此内部资源的任务。应用程序将决定这是否合理。

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值