Matrix653 实现

更新时间:
2023-12-21
下载文档

Matrix653 实现

本节介绍 Matrix653 分时分区操作系统中进程管理的实现原理。

进程简介

在 Matrix653 中,一个分区包含一个或多个进程,它们互相配合来实现分区的功能。分区内的进程共享相同的地址空间。

应用程序利用操作系统的调度能力,来控制其内部进程的精确执行。进程可以被设计为周期性的(周期性的被设置为被就绪状态以被调度)或非周期性的(进程的启动、停止、阻塞和释放完全在应用程序控制之下)执行。故障的发生可能会导致进程被重新初始化或终止。访问需要互斥访问的资源,需要使用进程间同步的方法:MUTEX,EVENT,SEMAPHORE 等。

应用程序的每个进程被绑定在固定的处理器核上运行。默认的,新创建进程被绑定在分区配置的首个处理器核上。

进程是包含在分区内的调度单元,它与同一分区的其他进程同时执行。它包括可执行程序、数据和栈区域、程序计数器、堆栈指针以及其他属性,如优先级和截止时间。

通过使用 APEX 服务来使用进程管理功能。应用程序创建的进程代码仅在用户模式下执行(即不允许特权指令)。

分区应该对其定义的进程的行为负责。进程在分区之外不直接可见。

进程属性

为了执行进程,需要为每个进程定义一组唯一的属性。这些属性区分了每个进程的独特特征,并定义了资源分配要求。

进程属性描述如下。固定属性是静态定义的,一旦分区初始化,就不能更改。变量属性是用初始值定义的,但是一旦分区转换到正常分区运行模式,就可以通过使用服务请求进行更改。

固定属性:

  • Name:名字。定义分区中每个进程的唯一值;
  • Entry point:入口点。表示进程的起始地址;
  • Stack size:堆栈大小。可配置相同或不同大小;
  • Base Priority: 基本优先级。进程启动时使用的优先级;
  • Period :周期。周期性进程活动周期;特定的值指定进程为非周期性进程;
  • Time Capacity:时间量。定义流逝(消耗)的时间,进程应当在这段时间内执行完毕;
  • Deadline:截止期(类型)。指定与进程相关的截止期的类型,可能是 “HARD” 或 “SOFT”。当一个进程未满足截止期限时,操作系统的反应在 “HARD” 和 “SOFT” 截止期之间没有区别。操作系统都将采取HM表中预定义的未满足截止期的动作。如果定义了进程级错误处理程序,则进程级错误处理程序可以使用 GET_PROCESS_STATUS 服务来获取截止期类型,并根据 “HARD” 与 “SOFT” 截止期采取特定于应用程序的操作。

注: 对硬时间类型的截止期来说,若进程不能在指定的截止时间内完成,操作系统将采取补救措施;对软时间类型的截止期来说,若进程不能在指定的截止时间内完成,操作系统会记录这个错误并且允许进程继续执行。

可变属性:

  • Current Priority:当前优先级。进程创建时设置为 Base Priority,运行时动态更改;
  • Deadline Time:截止时间。操作系统计算用来检查在进程分配的时间内是否完成进程的处理;当进程休眠时 (stopped),GET_PROCESS_STATUS 返回的 deadline 是未定义的;
  • Process State:运行状态。可以是 DORMANT,READY,RUNNING,FAULTED 或者 WAITING;
  • Processor Core Affinity:标识进程绑定的处理器核。在进程调度过程中,将一个进程分配给一个特定的处理器核使其具有亲和力,从而将该进程限制为只能在分配的处理器核上进行调度。如果在初始化期间没有绑核操作,则进程将绑定在分区的默认处理器核。

进程核绑定

当多个处理器核被分配到一个分区时,应用程序可能需要控制每个进程运行在哪个处理器核上。应用程序通过为每个进程分配处理器核心关联来执行此控制。进程只能绑定到所属分区分配的处理器核其中的一个。

如果在初始化期间未显式设置进程的核,则进程将绑定到默认的处理器核。初始化阶段,主线程使用的处理器核也是该默认核。

进程调度

操作系统的一个主要职责是仲裁同时运行的多个进程对多个 CPU 核的竞争使用,操作系统管理每个分区的运行环境,基于进程的CPU亲核性、各自优先级和当前状态来分配和抢占 CPU 资源。

进程调度模型的主要原则如下:

  • 调度单位是 APEX 进程。
  • 每个进程都有当前优先级。
  • 符合运行条件的进程集,仅限于活动分区处于 READY 或 RUNNING 状态的那些进程。
  • 错误处理进程具有最高优先级,即使一个进程拥有抢占锁。当错误处理进程运行时,分区配置控制其它无错误进程能否并行执行。
  • 拥有抢占锁的进程只能被错误处理进程抢占。
  • 进程调度算法是优先级抢占式的,如果正在运行的进程优先级高于所有 READY 状态的进程,那么正在运行的进程就不会被抢占。
  • 在任何进程重新调度(由正在运行的进程的直接请求或任何分区内部事件引起)时,操作系统将同时选择 “N” 个进程,其中 “N” 是分配给分区的处理器核数。其亲和性是特定处理器核心的任何进程都被限制为仅在该处理器核上运行。当前优先级较高的进程将在处理器核上调度。
  • 由于所有进程都和处理器核绑定,所以这就预示着,每个分区的处理器核都有一个固定的进程组,这些进程在其上进行调度。
  • 当一个分区被分配了一个处理器核(例如,单核处理器)时,操作系统选择分区内处于就绪状态的当前优先级最高的进程来获得处理器资源。
  • 如果多个 READY 状态的进程具有相同的当前优先级,操作系统选择连续等待最长的那个进程运行。
  • 如果进程 A 正在运行,被更高优先级的B抢占了,进程 A (假设优先级未被改变)将在和其优先级相同的进程中首先得到调度。
  • 如果进程 A 将优先级降为和 C 相同(进程 A 未占有抢占锁),进程A将成为C进程优先级队列中的新加入的进程,并且被 C 抢占。
  • 当前正在运行的进程控制处理器资源直到其它进程调度事件发生。
  • 同时支持周期和非周期进程。

注: 对进程进行周期性和非周期性调度的要求并不意味着操作系统必须区分两种类型的进程。这意味着 APEX 接口为应用软件提供了请求在周期性或非周期性(例如事件驱动)进程调度的能力。

  • 一个分区内的进程共享分区资源。

当周期进程开始时,它们实际开始的时间基于分区配置的周期处理开始指定。每个分区分配的分区时间窗口被单独指定为它们是否是分区的周期性处理开始释放点(Release Point)。对于周期性进程,进程的第一个释放点相对于配置为周期性处理开始释放点的分区的下一个分区时间窗口的开始。对于周期进程,后续进程释放点将出现在进程的定义期间。

注: 当一个分区中的两个或多个周期进程具有相同的优先级和延迟时,进程在释放点的启动顺序取决于创建进程顺序,越早创建越早启动。当两个或多个进程具有相同的延迟但绑定在不同的处理器核心时,进程在释放点启动的顺序取决于核间中断的触发时间。

非周期性进程只有一个初始释放点。当非周期进程启动时,它们的启动时间是相对于当前时间的。

进程优先级

在 Matrix653 系统中,支持的进程优先级范围是 0 ~ 255,数字越大,优先级越高。需要注意的是,根据 ARINC 653 规范,采用 APEX 服务创建的进程优先级应该在 1 ~ 239 范围之内,即规范定义的 MIN_PRIORITY_VALUE(1)和MAX_PRIORITY_VALUE(239)宏之内。

操作系统会记录进程的三种优先级:当前、基本和保留。当前优先级是操作系统用来调度和排队进程的。基本优先级是进程创建时赋予的优先级,改变进程优先级的 APEX 服务或者获取一个互斥量不会影响基础优先级。保留优先级是当进程释放一个拥有的互斥量时,恢复到的优先级;如果在进程拥有互斥量时,调用了 SET_PRIORITY() 服务,那么保留优先级被更新为新值。

GET_PROCESS_STATUS() 服务可以获取基本优先级和当前优先级。

进程等待队列

当一个进程由于执行某个服务导致阻塞时,进程状态被设置为 WAITING,并且进程被放入一个进程队列中。每一个潜在的阻塞资源(队列端口、缓冲器、信号量、事件、互斥量)都有一个进程等待队列。进程按照先进先出(FIFO)或者优先级的队列原则被放在该队列中,队列原则在创建该资源时指定;当使用优先级排队原则时,使用当前优先级排队。

进程抢占锁

操作系统提供进程抢占锁的支持。进程抢占锁服务(LOCK_PREEMPTION 和 UNLOCK_PREEMPTION)允许正在运行的进程获得抢占锁,从而避免被其它进程抢占 CPU 资源。

拥有进程可能正在执行临界区或访问由同一分区的多个进程共享的资源。临界区可能用于访问特定的内存区域、某些物理设备,或者只是特定进程的正常计算和活动。抢占锁定服务管理由操作系统为分区预定义的单个抢占锁互斥锁。当一个进程拥有抢占锁互斥锁时,通过任意进程调度阻止其他进程拥有抢占锁(例如,分区只有一个处理器核或所有使用抢占锁互斥锁的进程都与同一个处理器核有亲缘关系)或通过阻塞(例如,当其他处理器内核上运行的进程调用 LOCK_PREEMPTION 时)。一组互斥服务提供了额外的互斥访问服务,可以被多个进程(即多个进程访问不同的互斥)同时使用。

LOCK_PREEMPTION 和 UNLOCK_PREEMPTION 服务用于管理抢占锁定互斥锁和分区的锁定级别。当分区的锁级别值大于 0 时,锁定抢占的正在运行的进程不能被同一分区中的另一个进程抢占。当锁级别值为0时,一个正在运行的进程可以被另一个就绪进程抢占。

抢占锁对其他分区的调度没有影响。它只影响分区内进程的调度。

当进程拥有抢占锁(或互斥量)时,不允许该进程在调用 Matrix653 服务时阻塞(将返回错误代码)。

注: 抢占锁虽然影响了操作系统的正常调度,但这并不意味着应用程序直接控制操作系统。由于锁抢占是由操作系统提供的,并且所有操作结果和效果都是事先知道的,所以操作系统的完整性保持不变,不受服务请求的影响。

进程控制

分区用于管理进程的系统资源是在配置时和系统初始化时静态定义的。

分区初始化期间创建进程(资源分配)并初始化。这意味着分区的所有进程的定义方式应确保每个进程的必要资源可以在系统构建时确定。每个进程在分区初始化期间只创建一次(在分区重启时,将重新创建进程)。

当分区进入 NORMAL 模式时,开始进程调度。

注: 当为一个分区分配了多个处理器核,并且为两个或多个等待进程分配了不同处理器核的亲和性时,这些进程开始时间受核间中断处理的影响。

应用程序应该能够随时重新启动(即重新初始化)其任何进程,并且还应该能够阻止进程获得处理器资源。某些故障和失败条件可能需要分区重新启动或终止其任何进程。这些情况可能是由于硬件或软件故障引起的,也可能是由于应用程序的不同操作阶段引起的。

每个进程都有一个优先级,它的行为可能是同步的(周期性的)也可能是异步的(非周期性的)。两种类型的进程可以共存于同一个分区中。当前优先级较高的就绪进程可以随时抢占正在运行的进程。当一个分区被分配了单个处理器核时,当前优先级最高的处于就绪状态的进程优先于其他就绪进程被选择,以便在该分区活动时执行。当一个分区被分配多个逻辑处理器核时,可以基于当前优先级和亲和性来选择一组处于就绪状态的进程,在所分配的逻辑处理器核上并发运行。

文档内容是否对您有所帮助?
有帮助
没帮助