首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

CBS算法的RTAI内核调度器设计方案 03

CBS算法的RTAI内核调度器设计方案 03

CBS服务器核的主要功能是根据传入的相关调度信息维护底层实时小内核中的可用CBS服务器队列,在任务开始、挂起、终止等调度时执行相应的事件处理函数来调整CBS服务器的属性参数,实现CBS算法。
  EDF调度器扩展如图1所示。


  图1 EDF调度器扩展


  在服务器接口中,由于硬实时任务工作在RTAI实时内核下,而软实时任务一般工作在Linux内核下,因此服务器维护的虚拟任务为了与实际的实时任务建立对应,就需要一个接口来实现它们的映射关系。本文通过这个接口层来为Linux内核中的实时任务和RTAI内核下的虚拟任务提供映射实现。
  1.2.2 EDF调度器扩展后调度主要算法步骤
  ① 不同类型的新应用程序到达时,通过服务器接口层中的系统调用对其进行判别控制检查,主要通过式(2)来进行。如果通过检查,则说明调度新到达的应用程序不会影响硬实时任务的截止期。
  ② 通过判别检查之后,CBS服务器为其创建一个与新应用程序对应的虚拟任务,并根据新应用程序传入的调度参数和自己的调度策略,计算得到虚拟任务的任务截止期。如果此时服务器是活动的,将此新虚拟任务挂入服务器维护的先进先出队列。取出服务器的先进先出队列队首虚拟任务,并根据任务截止期大小进入RTAI实时内核的EDF就绪队列;同时,新应用程序也加入到Linux内核下相应的调度对象集合中,调度对象集合是一个由与新任务相匹配的具体调度器调度的集合,这个调度器基于某种调度算法,不是本文的讨论重点,但是如果从整个系统的实现来说,这些都是必不可少的部分。本文重点实现的是RTAI内核下对软硬实时混合调度的支持。
  ③ 虚拟任务与RATI下的硬实时周期任务一起由EDF调度器统一调度分配。
  1.3 EDF调度器的扩展实现
  根据扩展设计方案,下面讨论在对EDF调度器进行扩展时所涉及的关键问题及解决途径。
  1.3.1 EDF调度层扩展的关键问题
  首先是实时内核的虚拟任务和Linux用户空间中的软实时任务的映射问题。软实时任务是运行在用户空间的Linux进程中。它通过CBS服务器接口层中的新增系统调用rt_schedule_test()进入准入测试后,调用CBS服务器接口层的新增系统调用rt_create_virtual_task()创建虚拟任务,并且传入软实时应用的进程ID,应用调度器ID在虚拟任务结构体中保存下来。当虚拟任务被EDF算法调度执行时,它通过实时内核中的软中断模拟机制保存对应的进程ID,应用调度器ID到中断暂存表,然后调用rt_switch_to_linux切换到Linux内核。Linux内核通过应用调度器ID找到调度器,将要调度执行的进程ID传给此调度器,由调度器调度此进程执行,这就实现了虚拟任务与软实时应用的对应。
  1.3.2 服务器核实现的关键问题
  ① 为减少系统中的全局数据结构种类,虚拟任务与实时任务使用同样的数据结构定义。为此,修改了RTAI的实时任务的rt_task_struct结构定义:添加了与虚拟任务相关的属性,如对应的具体软实时任务的ID、软实时任务调度器ID、任务截止期和指向CBS服务器的指针;定义了服务器数据结构体rt_CBSServer,属性参数有服务器的预留执行能力计算值、已使用的服务器预留的计算值、周期、开始时间、截止时间以及服务器先进先出队列VTQueue。
  ② CBS服务器算法的实现。CBS服务器算法需要在虚拟任务到达事件、虚拟任务完成事件以及服务器预留执行能力耗尽事件发生时刻,及时对服务器的相关属性和虚拟任务属性进行调整,特别是虚拟任务的截止期和服务器的截止期。
  下面介绍基于服务策略的CBS算法的伪代码实现。
  虚拟任务到达事件发生时的处理:
  if(虚拟任务到达事件发生) {
  把该虚拟任务加入到服务器的先进先出队列;
  N=N+1;//服务器的先进先出队列任务数加1
  if(此时服务器空闲&&N==1) {
  if(c>=(dk-rj)Us) {
  ak=rj;
  dk=ak+Ts;
  c=Qs;//计算服务器预留执行能力和截止期
  }
  else{
  ak=rj;
  dk=dk-1;//设置截止期
  }
  }
  }
  虚拟任务完成事件发生时的处理:
  if(任务完成事件发生) {
  从EDF调度器就绪任务队列和服务器先进先出队列中删除该虚拟任务;
  N=N-1;
  if(N!=0){
  利用当前的服务器截止期dk调度服务器先进先出任务队列中的下一个任务到EDF调度器就绪队列中;
  }
  if(任务执行了一个时间片) {
  c=c-1;//服务器预留执行能力减1
  }
  }
  服务器预留执行能力耗尽事件发生时的处理:
  if(服务器执行能力==0) {
  dk=dk-1+Ts;
  c=Qs;//计算截止期,并补充预留执行能力
  }
  其中,dk为服务器的截止期;ak表示服务器下次执行的起始时刻;rj表示任务到达时刻;c表示服务器剩余执行能力。Qs和Ts分别为CBS的最大容量预算补充值和周期;Us是这个服务器的利用率。
  1.3.3 服务器接口实现的关键技术
  该层主要在RTAI内核下增加一些新的系统调用供Linux内核使用。
  rt_create_virtual_task(): 创建虚拟任务。首先在系统内存中为服务器分配所需的内存空间;然后根据传入参数填写rt_task_struct{}结构,特别是与服务器相关的几种变量值;最后将其放入系统任务队列中。
  rt_schedule_test(): 对新到来的应用进行准入测试。主要是通过CBS算法进行测试,如果不能通过准入测试,则失败退出;否则调度rt_create_virtual_task()创建虚拟任务,将任务挂入相应的服务器队列中,等待调度。
  rt_delete_VTtask(): 在Linux内核下可调度这个函数来实现对RTAI内核下的虚拟任务的删除。
返回列表