简介
ASRT (Async Runtime) 是一个用现代C++编写的开源任务调度库,专门为嵌入式Linux系统设计。它是一个仅包含头文件的库,提供高效且安全的异步任务调度和网络编程能力,让编写高性能嵌入式应用程序变得轻而易举。无需再费力地编写原始系统调用的包装器和手动事件循环,ASRT 提供了任务调度器和POSIX对象(如套接字和管道)的C++抽象。如果您熟悉C++11或更高版本,并编写过网络应用程序,那么您就可以上手使用了!
为什么需要另一个任务调度库?
尽管C++中存在大量的任务库,例如Boost::Asio、Intel的TBB以及即将成为C++26标准的NVIDIA stdexec,但似乎缺少一个专门针对嵌入式应用设计的任务调度器。ASRT 正是为了填补这一空白而设计的。它的设计目标是:
- • 安全性: 嵌入式应用中,安全性至关重要。软件能够在长时间内正确运行,而不会崩溃或停滞,这在医疗设备和自动驾驶等领域尤其关键。
- 性能: 现代嵌入式应用越来越复杂和互联,高效、低延迟的任务调度和网络框架的需求越来越重要。
- • 可扩展性:
asrt::Executor和asrt::BasicSocket等对象设计为易于定制和扩展。
架构概述
ASRT 库的核心组件可以逻辑上分为三层:
- • 操作系统抽象层: 这一层实现对操作系统提供的API/对象的抽象。ASRT 在其POSIX等价物之上实现了对通信对象(如
asrt::BasicSocket和asrt::BasicNamedPipe)的抽象。
由于Linux缺乏Windows重叠I/O提供的异步I/O的原生支持,因此需要反应器来模拟异步性。所有ASRT I/O对象(如asrt::BasicStreamSocket和asrt::BasicNamedPipe)都通过底层反应器支持异步I/O。
- • 异步/并发层: 这一层通过
asrt::Executor等抽象实现异步任务调度。从高层次来看,执行器只是任务存储和执行策略的组合。任务是用户提交给执行器以供执行的可调用函数。执行策略控制执行的“如何”(任务是否可以并行执行)、“何时”(立即执行还是稍后执行)和“何处”(在哪个线程上执行任务)。
- • 应用原型层: 最高层,ASRT 提供了可重用应用程序组件的现成实现,例如
asrt::TcpConnection和asrt::UnixStreamConnection,它们只是相同asrt::Connection基类型的不同模板实例化。asrt::ClientInterface和asrt::ServerInterface等接口也可以被用户实现继承/封装,以实现典型的客户端-服务器用例。
任务调度和任务组合
ASRT 提供了简洁的任务调度和强大的任务组合功能,方便用户构建复杂的异步流程。
总结
ASRT 是一个功能强大且易于使用的嵌入式Linux系统异步任务调度库,它在安全性、性能和资源效率方面做了很好的平衡,并提供了丰富的可扩展性和定制选项。其新颖的任务组合功能进一步提升了开发效率和代码可读性。对于需要高效、安全和可靠的异步编程能力的嵌入式开发者来说,ASRT 是一个理想的选择。
项目地址:https://github.com/ozhang3/asrt