概述PLMS (Process Launch and Monitor Service) 是一个安全认证 (safety-certified) 的进程启动器负责根据可配置的属性启动和停止进程。它使用有向无环图 (DAG) 解决组件间的相互依赖关系并可基于控制条件启动进程。核心功能功能描述多阶段系统启动支持分阶段启动系统组件进程监控通过看门狗和死亡检测监控进程状态崩溃恢复通过重启或通知外部健康监视器恢复崩溃的进程智能看门狗统一的监控责任捕捉进程死亡事件并行启动使用动作队列和工作线程并行启动依赖驱动的组件第一部分设计架构动作队列与工作线程PLMS 使用动作队列和工作线程来管理和优化进程执行支持自动化任务和用户触发的任务。初始化流程PLMS 以配置文件和可选标志启动标志在配置文件之前评估系统解析配置创建组件分析依赖关系构建对应的 DAG有向无环图条目创建资源管理器、动作队列、控制器和工作线程当必要依赖满足后组件的启动动作入队内存模型PLMS 使用固定大小分配器预分配内存仅在新配置文件启动或 API加载或新客户端连接分配 OCB时使用动态内存如果解析时分配失败PLMS 拒绝文件并继续运行看门狗监控使用匿名共享内存——模拟客户端写入硬件看门狗分离客户端和 PLMS 的执行组件状态状态描述Idle初始状态被none停止原因停止后也进入此状态Starting临界状态正在执行 start_sequence 任务Startedstart_sequence 任务列表成功完成后到达Stopping临界状态正在执行 stop_sequence 任务Session stopped因为依赖组件已停止而停止Fault组件已失败且无法恢复Defined Safe State (DSS)通过sysmgr_reboot()重启系统线程模型PLMS 是一个多线程应用程序可供多个客户端使用。第二部分组件PLMS 二进制文件 (plms)核心二进制文件管理和优化进程执行。使用动作队列和工作线程启动依赖驱动的组件支持自动化任务和用户触发的任务。PLMS 库 (libplms)为客户端应用程序提供与 PLMS 通信的接口。通过fsp_plms_LoadConfig()等函数进行运行时交互。PLMS 调试工具 (plmsctrl)使用libplms与 PLMS 通信支持发送和接收命令及状态。可用于调试或测试时加载额外配置。三种外部接口接口用途命令行接口配置 plms 实例配置文件定义管理进程的组件控制接口客户端库允许外部进程在运行时与 PLMS 交互第三部分配置文件参考文件结构配置文件包含以下顶层指令指令描述include引入另一个.cfg文件component定义一个组件内含 main、stop、recovery、monitor 任务块module将组件或子模块组合成逻辑分组组件component参数参数格式 / 说明depend依赖列表格式为comp:session|statelesscoptions组件选项如NOTIFY_ALLstart_sequence启动顺序如[main]stop_sequence停止顺序如[stop]on_fault故障时行为DSS|fault_taskmain 任务块参数参数格式 / 说明command可执行文件路径args命令行参数stype安全策略类型名称runmask整数值CPU 亲和性掩码prioritypolicy:priority:parameters优先级范围 1–253ability权限列表如[ABILITY1, ABILITY2]cwd进程工作目录groups组 ID 列表如[gid1, gid2]useruid或:gid或uid:gidaps自适应分区名称stdin/stdout/stderrfilename:modettyTTY 文件名aslron或offrlimits资源限制格式rlimit:cur[:max]optionsPATHNAME,CLEAR_ENV_LOGIN,CLEAR_ENV_ALL,CRITICALenv环境变量如[var1value1, var2value2]main 任务块中的操作函数操作说明pathmgr_symlink(path, symlink)创建路径管理器符号链接pathmgr_unlink(path)删除路径管理器链接exec()执行进程exec_waitfor_exit(timeout)执行并等待退出exec_expect_exit(expected_value, timeout)执行并检查退出值waitfor_pathname(path, poll_time, timeout)等待路径出现waitfor_attachname(path, timeout)等待 attach 名称waitfor_delay(delay)等待指定时间test_env(var, expected_value)检查环境变量load_config(filename)加载额外配置start_components(module/name)启动其他组件stop_components(module/name)停止其他组件stop 任务块参数参数说明signal信号编号term_timeouttime out格式optionsTERMINATE_CHILD,STOP_ON_CLIENT_TERMINATIONrecovery 任务块参数参数说明repairNONE,STOP,RESTART,FAULT,DSSmax_tries重试次数wait_time重启间等待时间monitor 任务块参数参数说明interval心跳时间间隔max_miss最大缺失次数start_delay启动延迟时间模块module将组件或子模块组合成逻辑分组module module_name { component_name1 component_name2 module_1 }数字与注释格式数字0x/0X前缀 十六进制0前缀 八进制其他 十进制。不支持负数。注释使用//。双引号内的//视为字符串内容。字符集ISO/IEC 8859-1:1998。第四部分完整配置示例includepath_to_include_filecomponentcomponent_name{depend[comp1:session|stateless,comp2:session|stateless]coptions[NOTIFY_ALL]taskmain{commandexecutable_pathargsexecutable argsstypesecurity policy type namerunmask1priorityrr:10:ability[ABILITY1,ABILITY2]cwd/working/dirgroups[100,200]user1000:100apspartition_namestdin/dev/null:rstdout/var/log/comp.log:wrlimits[NOFILE:1024:2048]options[PATHNAME,CLEAR_ENV_ALL]env[VAR1value1,VAR2value2]waitfor_pathname(/dev/ready,100,5000)exec()}taskstop{signal15term_timeout5000options[TERMINATE_CHILD]}taskrecovery{repairRESTARTmax_tries3wait_time1000}taskmonitor{interval500max_miss3start_delay2000}start_sequence[main]stop_sequence[stop]on_faultDSS}modulemodule_name{component_name1component_name2}第五部分版本差异 (QOS 2.2.x vs SDP 8.x)配置文件关键字关键字差异aps仅在 QOS 2.2.x 上工作SDP 8.x 不支持prioritySDP 8.x 范围 1–253。sporadic 调度时 priority 2–253low_priority 1–252rlimitsSDP 8.x 新增CHANNELS,MQUEUE_NUM,MQUEUE_SIZE,SHM_HANDLESrunmask仅 QOS 2.2.x 支持SDP 8.0 使用cluster代替cluster仅 SDP 8.x 支持QOS 2.2.x 使用runmask代替命令行参数参数差异-W指定工作线程 runmask仅 QOS 2.2.x-C指定工作线程 cluster仅 SDP 8.x-pSDP 8.x 优先级范围 1–253-USDP 8.x 中可使用用户名代替 UID需在/etc/passwd中定义QPLMS 2.0 新增变更描述spawn_priorityQPLMS 2.0 全新引入的关键字QPLMS 1.0 中不存在priority 范围sporadic 调度参数max_pending_replenishments最小值明确为 1rlimits 扩展CHANNELS, MQUEUE_NUM, MQUEUE_SIZE, SHM_HANDLES 仅 SDP 8.x第六部分线程模型PLMS 使用多线程架构管理进程的启动和监控。共 6 种线程协同工作1. Main Thread主线程创建 Controller 和 Client Handler 线程解析和验证命令行参数及初始配置文件如果解析失败中止 plms 执行成功创建初始动作后进入信号处理例程2. Controller Thread控制器线程核心协调线程“唯一从 action_queue 出队的线程”等待动作入队分配给可用工作线程防止同一组件同时分配给多个工作线程“避免不一致状态”如果组件正被工作线程处理跳过当前动作并标记等忙碌工作线程返回后恢复处理处理到队尾时从队头重新开始动作完成后删除动作 → 转换组件状态 → 发送通知 → 创建依赖组件的后续动作计算waitfor条件的最小等待时间发送 PLMS 心跳如果控制器挂起“PLMS heartbeat is not executed”系统管理器可检测并恢复3. Client Handler Thread客户端处理线程资源管理器线程负责处理来自外部应用程序的命令并排队到action_queue。4. Worker Thread工作线程处理实际执行工作“启动和停止组件”。调用执行器执行组件任务和函数。5. Pulse Handler Thread脉冲处理线程处理两种 QNX 脉冲死亡通知脉冲检测 PLMS 启动的进程死亡创建恢复动作路径空间通知脉冲检测路径空间中添加了新文件“releases the component waiting for the file”6. Watchdog Thread看门狗线程按指定间隔监控客户端心跳检测到组件心跳失败时禁用监控并创建失败动作入队同步机制通过控制器线程的串行化实现同步“By serializing all actions through the controller thread, the order of actions is maintained, and less synchronization between threads is required.”第七部分plms 命令行参考语法plms [Options] config_file配置文件是必需的必须为最后一个参数。如果缺失、不可访问或无效“plms aborts with an error.”所有选项选项平台描述-C clusterSDP 8.x为每个工作线程设置集群逗号分隔列表须与-w一起使用-d通用试运行验证配置文件解析后退出。不处理load_config加载的文件-D settings通用设置默认 POSIX spawn 属性见下方子选项-h interval_ms通用心跳更新间隔。默认 1000ms范围 500–INT_MAX-i name通用实例名称挂载到/dev下。若名称已被使用则中止。默认/dev/plms-k通用仅与-s一起使用。启动组件后退出无控制接口/通知/看门狗-m interval_ms通用看门狗监控间隔。默认 100ms范围 10–3,600,000ms-n slots通用通知槽最大数。默认 4范围 0–32-p priorityPolicy通用线程优先级和调度策略。格式如10fFIFO。策略r(RR),f(FIFO)。默认30r-s component_name通用启动时启动的组件/模块名。伪模块all启动全部。未指定则不自动启动-t secpol_type通用初始安全策略类型。使用-U以非 root 运行时必需-T settings通用性能调优参数见下方子选项-U uid[:gid]通用更改用户/组身份。SDP 8.x 支持用户名-v通用详细日志级别累计最多 7 级-w threads通用工作线程数。默认 4范围 1–32-W runmasksQOS 2.2.x为每个工作线程设置 CPU runmask。须与-w一起使用-x通用同-k但组件失败时调用 DSS (sysmgr_reboot())-D默认 spawn 属性子选项默认值描述max_triesnumber3最大恢复尝试次数0 到 INT_MAXrepairNONE|STOP|RESTART|DSS|FAULTSTOP受监控组件的恢复模式restart_wait_timenumber100重启失败组件前的等待时间(ms)term_timeoutnumber100stop-task 信号后发送 SIGKILL 前的超时(ms)pathcolon_separated_path环境 PATH冒号分隔的搜索路径-T性能调优子选项默认值描述max_nodesnumber1024最大节点数max actions 3 × max_nodes。范围 1 到 INT_MAX-k模式行为启动指定组件后 PLMS 退出“控制接口、通知功能、异常终止和看门狗不可用”组件失败时取消执行并退出 — 不执行恢复动作失败前已启动的组件继续运行并行启动的多个组件中一个失败PLMS 立即中止所有进一步执行第八部分plmsctrl 调试工具参考警告不适合生产环境使用。语法plmsctrl -a -t plms name command [arguments]-a禁用 root 用户的能力请求-t name指定目标 PLMS 实例未指定则使用默认 PLMS权限通过内核 abilities 或 secpol 控制命令参考命令语法用途startplmsctrl start component|module启动组件或模块stopplmsctrl stop component|module停止组件或模块restartplmsctrl restart component重启命名组件noneplmsctrl none component将组件状态设为 nonelistallplmsctrl listall列出所有组件statusplmsctrl status component查询组件状态isdegradedplmsctrl isdegraded component检查组件是否处于降级状态wdog_ctrlplmsctrl wdog_ctrl on|offon 禁用全局看门狗off 启用dagplmsctrl dag file将当前 DAG 写入文件shutdownplmsctrl shutdown启动完全关闭fastshutdownplmsctrl fastshutdown启动快速关闭verbosityplmsctrl verbosity value设置详细级别loadplmsctrl load file从文件加载配置第九部分libplms API 参考共享库libplms.so提供客户端与 PLMS 通信的接口。支持与多个 PLMS 实例交互。API 函数函数描述fsp_plms_Action()对组件或模块执行操作fsp_plms_Connect()连接到 QPLMS 实例fsp_plms_Disconnect()断开与 PLMS 实例的连接fsp_plms_GetComponentStatus()获取组件当前状态fsp_plms_GetDependencyTree()获取组件的依赖树fsp_plms_GetLauncherHeartbeat()获取 PLMS 心跳fsp_plms_IsComponentDegraded()获取组件或模块的降级状态fsp_plms_LoadConfig()将配置加载到 PLMS 中fsp_plms_MsgRegisterEvent()注册安全事件fsp_plms_RegisterNotificationEvent()注册接收 PLMS 通知fsp_plms_SetVerbosity()修改 PLMS 详细程度fsp_plms_UnregisterNotificationEvent()取消注册 PLMS 通知fsp_plms_WatchdogControl()控制 PLMS 看门狗功能fsp_plms_WatchdogHeartbeat()向 PLMS 发送心跳API 功能分类类别函数连接管理Connect,Disconnect组件控制/状态Action,GetComponentStatus,IsComponentDegraded,GetDependencyTree配置LoadConfig通知/事件RegisterNotificationEvent,UnregisterNotificationEvent,MsgRegisterEvent看门狗WatchdogControl,WatchdogHeartbeat监控/诊断GetLauncherHeartbeat,SetVerbosity相关参考构建嵌入式系统 — 系统启动和 IPL系统启动优化与 BSP 定制 — 启动过程优化QNX OS 用户指南 — 运行时环境在线 PLMS 文档