Work-in-Progress: Function-as-Subtask API Replacing Publish/Subscribe for OS-Native DAG Scheduling
Takahiro Ishikawa-Aso, Atsushi Yano, Yutaro Kobayashi, Takumi Jin, Yuuki Takano, Shinpei Kato
TL;DR
This work addresses enforcing DAG task semantics in component-based real-time systems like ROS 2, where the publish/subscribe model fails to strictly enforce precedence constraints. It introduces the Function-as-Subtask (FasS) API, which expresses each DAG subtask as a function whose inputs/outputs map directly to incoming/outgoing edges, enabling the OS to ensure completion boundaries and join synchronization at the API level. The authors implement a DAG-native scheduler in a Rust-based kernel and outline reference designs for Linux sched_ext, along with an evaluation showing improved join fidelity relative to ARR-based ROS 2 configurations. The approach promises more faithful DAG scheduling in real-time systems by reducing reliance on programmer discipline and aligning middleware interfaces with classic DAG scheduling theory.
Abstract
The Directed Acyclic Graph (DAG) task model for real-time scheduling finds its primary practical target in Robot Operating System 2 (ROS 2). However, ROS 2's publish/subscribe API leaves DAG precedence constraints unenforced: a callback may publish mid-execution, and multi-input callbacks let developers choose topic-matching policies. Thus preserving DAG semantics relies on conventions; once violated, the model collapses. We propose the Function-as-Subtask (FasS) API, which expresses each subtask as a function whose arguments/return values are the subtask's incoming/outgoing edges. By minimizing description freedom, DAG semantics is guaranteed at the API rather than by programmer discipline. We implement a DAG-native scheduler using FasS on a Rust-based experimental kernel and evaluate its semantic fidelity, and we outline design guidelines for applying FasS to Linux Linux sched_ext.
