【RTOS论文笔记】A Comparative Analysis of RTOS and Linux Scalability on an Embedded Many-core Processor

2023-05-16

背景

以往对多核实时操作系统的研究主要集中在多核处理器上任务集的可调度性和响应时间分析。

同时,许多研究人员声称,在不久的将来,高端嵌入式系统还将包括高性能并行应用程序,以支持复杂的任务,如车辆的自动驾驶。目前主流的嵌入式多核处理器由于核数较少,不适合于并行应用。近年来,已经发布了几种面向未来嵌入式系统的现成多核处理器,这些处理器包含数十个(甚至数百个)核。

然而,由于传统RTOS的设计目的不是为这些应用程序提供高可扩展性,因此它是否能够在许多核心处理器上实现并行应用程序的良好扩展尚不清楚。

Linux实际上可以在许多具有数十个内核的核心处理器上(或至少在一台48核的机器上)提供良好的可扩展性。

本文工作

在本文中,我们重点研究了传统多核RTOS在少于100核的多核处理器上的可扩展性。

1、将一个称为TOPPERS/FMP内核的传统多核RTOS内核移植到72核TILE-Gx72嵌入式多核处理器。

2、通过与Linux 4.5进行比较,发现了RTOS中的几个瓶颈。这些问题实际上已经在Linux中得到了解决,我们已经提出了在RTOS中避免这些问题的方法。

3、最后,我们通过PARSEC基准测试套件评估和分析了RTOS和Linux的可扩展性。

如果RTOS在并行基准测试中显示出与Linux相比接近(或更好)的可伸缩性,那么我们可以说传统RTOS至少潜在地适合在嵌入式多核处理器上扩展并行应用程序。

FMP与Linux的比较

1、系统设计:静态与动态

对于大多数嵌入式系统,所需的和可用的资源是预先确定的,因为这些系统设计用于执行某些特定任务。FMP是静态设计的,所有的内核对象(例如任务、信号量、数据队列)是静态配置的,在配置文件中定义,编译时由配置文件生成。每个内核对象都与一个ID相关联,以便通过系统调用进行访问。好处:由于FMP中内核对象的数量在运行时是固定的,因此它们可以简单地存储在数组中,并使用索引作为ID进行引用。可以实现更小的占用空间、更好的实时性能和更高的可靠性。缺点:灵活性有限。

Linux是动态设计的,以提供通用系统的灵活性。内核对象是在系统运行时调用内核提供的API创建和初始化的。通常,这些API会返回为该对象动态分配的数据结构指针。好处:Linux中内核对象的数据结构使用动态分配内存块的链表进行管理,因为它们的数量被认为是无限的。缺点:与静态设计的直接实现相比,动态设计引入的这种复杂性会导致更高的开销。

2、基本服务和设备驱动

从应用程序开发人员的角度来看,操作系统内核主要由基本服务和设备驱动程序组成,它们的功能通常作为系统调用提供。

通常,在FMP中访问服务的开销较低,而Linux经过优化可以实现更好的吞吐量和可伸缩性。

由于嵌入式系统的硬件对于特定的应用领域是高度专业化的,内核很难假设应该提供什么设备驱动程序。FMP本身只包括最少必要的设备驱动程序,如定时器、中断控制器和串行端口的驱动程序(如果使用syslog)。其他设备由在内核之上实现的可选中间件组件支持。开发人员需要使用每个中间件的专用API来控制相应的设备。

相反,Linux作为一个GPOS内核,必须支持大多数常用设备,并且提供一种通用的访问方法。驱动程序是内核中的模块,通过系统调用接口与应用程序交互。更具体地说,Linux中的设备被抽象为称为设备文件的特殊文件,可以通过文件I/O系统调用(如write())进行访问。

3、任务调度机制

多核系统中的调度目标是确定任务如何映射到不同的核,以及CPU资源如何分配到每个核上的任务,以实现吞吐量最大化或响应时间最小化等目标。

在FMP中,用户应用程序中的任务通过一种称为循环调度然后FIFO(RtFIFO)的方法进行调度。任务在创建时以循环方式分配给核心。每个核心将依次获得一个任务,直到分配完所有任务。同一核心上的任务将由默认的固定优先级抢占式调度器处理。所有任务都设置为相同的优先级,因此它们将以FIFO方式在每个核心上提供服务。

默认情况下,Linux使用完全公平调度程序(CFS),其目的是最大限度地提高总体CPU利用率。CFS定期运行复杂的负载平衡算法,以保持所有核心的运行队列大致平衡。由于比较两个具有不同调度规则的运行时系统是不公平的,我们也在Linux上实现了RtFIFO方法。

4、内存管理

大多数操作系统内核都支持内存管理,包括静态操作系统内核(如FMP),它的功能主要包括两部分:内核中的对象管理和用户应用程序中的数据管理。

对于内核对象,FMP和Linux用于管理它们的机制非常相似。尽管FMP不支持内存的动态分配,但它允许用户静态地定义对象,如具有预定最大数量的固定大小块的内存池。因此,使用对象池设计模式可以轻松实现内核对象的动态管理。在Linux中,称为slab allocation的机制也基于对象池,用于内核对象的高效内存分配。

页表管理
对于像TILE-Gx72这样使用分页MMU的处理器,用户应用程序数据的动态分配在技术上意味着将页表条目与可用物理内存相关联。在FMP中,所有页表都是静态生成的,未使用的物理内存定义为一个池,可以从用户应用程序访问该池。也就是说,从页面的角度来看,所有可用的物理内存已经提前分配给用户应用程序。预先分配的可用内存池可以由内存分配器中间件进行逻辑管理,并且无需在运行时动态更改页表。

同时,Linux有一个极其复杂的页表管理实现,具有高级功能,包括按需分页和交换。在某些情况下,动态修改页表可能是一个瓶颈,多年来一直在积极研究和优化。

因此,如果应用程序经常从内核请求内存管理服务,那么它在FMP上的性能可能比Linux更好。

5、内核锁

是一种多核操作系统中支持核间同步和通信的基本机制。内核中锁模型的粒度对总体吞吐量有很大影响,因为几乎所有共享资源都需要锁来保护。

在FMP中,有三个粒度级别可供选择:巨锁(G KLOCK)、处理器锁(P KLOCK)和细粒度锁(F KLOCK)。在巨锁模式下,所有内核对象共享一个单独的全局锁,因此像系统调用这样的内核服务只能串行访问。此模式需要最少的内存空间,但具有最高的资源争用。在处理器锁模式下,同一核上的内核对象共享一个锁,因此可以并发处理不同核上的内核服务请求。在细粒度锁模式下,每个内核对象都有自己的锁,因此可以尽可能并行地提供内核服务。此模式具有最低的资源争用,但如果存在大量内核对象,则会比其他模式占用更多内存。

由于我们的实验环境有大量可用内存,我们使用细粒度锁模式来最大化并行性。

当前Linux内核中的锁定粒度比FMP中的细粒度锁定模式略粗,因为Linux更复杂,并且包含许多由多个内核对象组成的组件。

TAS和TATAS自旋锁用于FMP等嵌入式系统的RTOS中,该自旋锁可以在几个核心的嵌入式系统上提供优异的性能,但在许多核心的处理器上吞吐量可能会急剧下降。

在Linux中,在TILE-Gx72处理器上使用退避自旋锁(a ticket spinlock with exponential backoff)。退避自旋锁也不可扩展,但被认为比TAS和TATAS自旋锁有更好的吞吐量。

为了评估TILE-Gx72上不同自旋锁的可伸缩性,我们在FMP中实现了退避自旋锁,在Linux中实现了TAS和TATAS自旋锁。我们还实现了K42自旋锁,它是可伸缩MCS自旋锁的一个变体,具有兼容的api,用于比较可伸缩和不可伸缩实现之间的差异。

使用微基准测试了FMP和Linux上不同自旋锁的吞吐量,结果如下。
在这里插入图片描述
当核数量较少(小于6)时,TAS和TATAS自旋锁的吞吐量确实比其他自旋锁的吞吐量要好,但会迅速下降。退避自旋锁的吞吐量下降速度比TAS和TATAS慢得多,并且在使用所有核时仍然可以提供相对可接受的性能。K42自旋锁可以在核心数量增加时保持良好的可扩展性,但在少于3个核竞争共享资源时性能最差。

结论

结果表明,尽管传统的RTOS不是为执行高性能应用程序而设计的,但在许多情况下,它可以提供比Linux更好的可扩展性。因此,由于之前的研究表明Linux可以在具有数十个核心的多个核心处理器上很好地扩展,因此我们相信传统RTOS(如TOPPERS/FMP)也可以是嵌入式多核心处理器的良好选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【RTOS论文笔记】A Comparative Analysis of RTOS and Linux Scalability on an Embedded Many-core Processor 的相关文章

  • SSL 和 Tkinter 不存在于 Python 3.5.2、Debian Linux 的源代码构建中

    我刚刚将 Python 3 5 2 下载到我的 Debian 机器上并使用以下命令构建它 configure make make test sudo make install 一切正常 但在make test输出中 它显示安装程序由于未安装
  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • Ubuntu 上的 Docker 无法连接到本地主机,但可以连接到其 IP

    我运行的是 Ubuntu 18 04 uname r 5 3 0 46 generic 我已经安装了docker docker version Docker version 19 03 8 build afacb8b7f0 我有一个简单的
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 如何获取uinput创建的设备的名称(路径)

    我已经成功设置了一个小程序来创建uinput questions tagged uinput我计划使用它来自动测试接收键盘输入事件的应用程序 我已关注both http thiemonge org getting started with
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • 无法使用Linux服务启动Archiva 2.1.0

    我正在尝试在 Linux 上启动最近发布的 Apache Archiva v2 1 0 独立版 出于测试目的 该 zip 已解压缩在 opt archiva 2 0 文档说 http archiva apache org docs 2 1
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

    在这个问题中 https stackoverflow com questions 32230 tracking down where disk space has gone on linux有人询问如何在 Linux 中显示磁盘使用情况 我
  • Amazon EC2 - Apache 服务器重启问题

    当我运行这个命令时 sudo etc init d httpd restart 它给出以下错误 停止 httpd 失败 启动 httpd 98 地址已在使用中 make sock 无法绑定到地址 80 98 地址已在使用 make sock
  • 在 UNIX 时间戳 Shell/Bash 中将日期与时区转换

    我需要将日期从格式为 yyyy mm dd hh mm ss TZ 的字符串转换为 UNIX 时间 TZ 时区 到目前为止我所做的是将没有时区的 yyyy mm dd hh mm ss 格式的日期转换为时间戳 dateYMD 2019 2
  • 使用请求和多处理时的奇怪问题

    请检查这个Python代码 usr bin env python import requests import multiprocessing from time import sleep time from requests import
  • 每个进程是否都存在内核堆栈?

    每个用户空间进程是否都存在一个内核堆栈和一个用户空间堆栈 如果两个堆栈都存在 那么每个用户空间进程应该有 2 个堆栈指针 对吗 在 Linux 中 每个任务 用户空间或内核线程 都有一个 8kb 或 4kb 的内核堆栈 具体取决于内核配置
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • 使用无效命令进行 fork 会导致 valgrind 中的内存泄漏

    我有以下代码 它在分叉内执行无效命令 以下代码在 valgrind 中返回内存泄漏 include
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2

随机推荐

  • 5000字学习C语言错误处理的四种方式。

    C错误处理 在C语言中 xff0c 错误处理是一个非常重要的主题 通常情况下 xff0c 程序员需要在代码中处理错误 xff0c 以保证程序能够在出现错误时正确地处理这些情况 C语言中常见的错误类型包括 xff1a 语法错误 逻辑错误 运行
  • yum 源制作

    YUM介绍 YUM主要用于自动升级 安装 移除 rpm 软件包 xff0c 它能自动查找并解决 rpm 包之间的依赖关系 xff0c 要成功的使用 YUM 工具更新系统和软件 xff0c 需要有一个包含各种 rpm 软件包的 reposit
  • MATLAB021b与VS2022混编

    MATLAB2021b与VS2022混编 前言 目前在做一个大创项目 xff0c 其中用到关于Matlab与C的混合编程 xff0c 特此记录 Matlab2021b 如图所示 xff0c 红线划出的是即将使用的 c函数 xff0c 在左侧
  • 香橙派5使用NPU加速yolov5的实时视频推理(一)

    前言 xff1a 寒假里 xff0c 博主完成了树莓派4B搭载yolofastest V2的ncnn加速 xff0c 效果挺不错的 xff0c 但总感觉还是稍微差点意思 xff0c 于是就购买了一块香橙派5 xff0c 想要用RK3588芯
  • 香橙派5使用NPU加速yolov5的实时视频推理(二)

    三 将best onnx转为RKNN格式 这一步就需要我们进入到Ubuntu20 04系统中了 xff0c 我的Ubuntu系统中已经下载好了anaconda xff0c 使用anaconda的好处就是可以方便的安装一些库 xff0c 而且
  • 【STM32学习】——串口通信协议&STM32-USART外设&数据帧/输入数据策略/波特率发生器&串口发送/接受实操

    文章目录 前言一 串口通信1 通信接口2 串口通信 xff08 1 xff09 串口简介 xff08 2 xff09 串口硬件电路 xff08 3 xff09 串口软件部分 二 STM32的USART外设1 USART简介2 图示详解 三
  • 【STM32学习】——USART串口数据包&HEX/文本数据包&收发流程&串口收发HEX/文本数据包实操

    文章目录 前言一 数据包格式 xff08 江科大规定 xff09 1 HEX数据包2 文本数据包3 两者对比 二 数据包收发流程1 HEX数据包接收 xff08 只演示固定包长 xff09 2 文本数据包接收 xff08 只演示可变包长 x
  • buuctf simplerev 中的小头位序

    33条消息 BUUCTF SimpleRev xff08 涉及大小端序存储的问题 xff09 Ireb9z的博客 CSDN博客 buuctfsimplerev https blog csdn net afanzcf article deta
  • 简要分析网络编程——UDP编程

    计算机网络是指两台或更多的计算机组成的网络 xff0c 在同一个网络中 xff0c 任意两台计算机都可以直接通信 xff0c 因为所有计算机都需要遵循同一种网络协议 网络编程中有很多协议 xff0c 如 xff0c TCP协议 UDP协议
  • 数据结构之二叉树 Python实现

    树 树是一种非线性的数据结构 树 xff0c 它是若干结点的集合 xff0c 是由唯一的根和若个棵互不相交的子树组成的 其中 xff0c 每一棵子树又是一棵树 xff0c 也是由唯一的根结点和若干棵互不相交的子树组成的 由此可知 xff0c
  • 《奔跑吧Linux内核(第二版)》第四章笔记

    内核配置 内核配置工具常见的有 xff1a make config make oldconfig make menuconfig 内核配置工具最终会在Linux内核源码的根目录下生成一个隐藏文件 config文件 xff0c 这个文件包含了
  • GDB+QEMU调试Linux内核

    1 使用qemu创建虚拟机 使用qemu创建ARM64架构虚拟机可以参考我的另一篇博客 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08 二 xff09 2 安装gdb multiarch工具包 span
  • centos7 HA

    本文以两台机器实现双集热备高可用集群 xff0c 主机名node1的IP为192 168 122 168 xff0c 主机名node2的IP为192 168 122 169 一 安装集群软件 必须软件pcs xff0c pacemaker
  • 《奔跑吧Linux内核(第二版)》第五章笔记

    Linux内核采用宏内核架构 xff0c 即操作系统的大部分功能都在内核中实现 xff0c 比如进程管理 内存管理 进程调度 设备管理等 xff0c 并且都在特权模式下 xff08 内核空间 xff09 运行 而与之相反的另一种流行的架构是
  • 交叉编译内核模块

    本实验在x86环境中交叉编译ARM64架构模块 xff0c 然后qemu启动ARM64架构虚拟机 xff0c 加载该模块运行 1 创建ARM64虚拟机 详见 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08
  • Linux内核模块相互调用

    编写一个内核模块A xff0c 通过导出模块符号的方式来实现接口函数 编写另一个内核模块B xff0c 调用内核模块A暴露出来的接口函数 1 源文件 内核模块A xff08 test A c xff09 span class token m
  • RTOS论文笔记(二)

    李在林 韩宏克 嵌入式Linux实时性分析及改造 2010 Linux 的实时性测试 中断延迟测试 在Linux中 xff0c 内核或驱动程序显式地关 开中断 xff0c 一般是通过调用 cli sti 来进行操作的 在调用 cli 时 x
  • LXC容器相关论文笔记

    段赫 基于LXC容器资源优化的研究与实现 2016 一 绪论 容器虚拟化技术 传统虚拟化技术 xff0c 实现一个虚拟机就意味着需要消耗了硬件资源来在底层系统上虚拟一个新的操作系统 xff0c 所以除了传统模拟硬件的虚拟化技术 xff0c
  • fork和clone系统调用小实验

    实验一 xff1a 使用fork 函数创建一个子进程 xff0c 然后在父进程和子进程中分别使用printf语句来判断谁是父进程和子进程 fork 函数被调用后会立即创建一个子进程 xff0c 子进程和父进程同时独立运行互不干扰 返回值 x
  • 【RTOS论文笔记】A Comparative Analysis of RTOS and Linux Scalability on an Embedded Many-core Processor

    背景 以往对多核实时操作系统的研究主要集中在多核处理器上任务集的可调度性和响应时间分析 同时 xff0c 许多研究人员声称 xff0c 在不久的将来 xff0c 高端嵌入式系统还将包括高性能并行应用程序 xff0c 以支持复杂的任务 xff