通过轻型线程提高多核设备中的Linux实时性能
多线程为何重要?
30 多年前,当计算机解决方案软件设计人员碰到单线程解决方案无法解决的复杂问题时,便已提出了对多线程实时性方面的需求。所需解决方案要求单个应用具有多个任务,也许一些是计算任务,一些是受 I/O 驱动的任务,但是,就任务的总体执行而言,所有任务均密切相关。但多个任务密切相关意味着这些任务应共享一部分 CPU 时间才能达到 CPU 的有效总体利用率。在很多此类应用中,必须禁止执行某些操作、等待某些 I/O 事件或另一应用发出的其他通信。因此出现了简单的可执行程序,这些可执行程序可以处理多个线程,同时可禁用线程,并可在各线程之间进行低延迟通信。
并非所有实时应用都需要支持重要的多线程处理功能。本文并未对相关应用进行分类。但很显然,需要使用多线程处理功能的应用是那些需要在协议中设定"等待状态"的任何类型的复杂协议,即等待允许应用继续进行的响应或事件。之后,应用应放弃对 CPU 的控制权,允许运行其他类似的线程,来代替该响应或事件。
也许上述教程对于许多人来说很简单。请注意,很多移动基础设施和核心网络设备供应商得出的结论是,虽然 Linux 是当前或未来系统的首选,但目前构建的 Linux 还不足以满足业界的全部要求。原因是什么?
采用 PTHREADS 的 Linux 多线程
Pthreads 是由 IEEE 规划的可移植操作系统接口 (POSIX) 创建的,目的是为了解决 Unix 中存在的高性能、多线程问题,之后被 Linux 用在最早的版本中,用于为企业实施可移植 Unix,目前用于嵌入式应用中。
创建 pthreads 模型是为了解决原始 Unix Fork/Join 模型创建 Unix"子"进程时出现的问题。由于该模型涉及到创建(还可能涉及删除)整个受内存保护的环境及执行模式,因此Unix 进程模型非常庞大。需要在 Unix 下采用适用于多线程的较轻型模型,因此pthreads应运而生。
但 Unix(也包括 Linux)模型是专为将内核与用户空间应用完全分离而设计的,其优势之一在于提供的保护、安全性和可靠性远胜于其他实施方案(包括过去 10 几年间使用的 RTOS)。实质上,这意味着 Linux 用户空间中的每个 pthread 都会由 Linux 内核线程表示,因此,全部或大部分 Linux 系统调用(特别是设备驱动器)均可通过用户空间进行访问。但是,由于 OEM 制造的产品并不具备 GPL,因此用户空间中实际存储了所有嵌入式 Linux 实时应用。因此,在每种情况下,使用 pthreads 都涉及到调用 Linux 内核,从而为本可以在本地实施的应用带来了额外的系统开销。
但请您稍稍考虑一下。采用上文提到的 Linux 实时扩展怎么样?是的,PREEMPT_RT 可以解决 Linux 内核中存在的许多关于响应性的问题,但不能真正解决多线程问题。实施用户空间 Linux 可解决设备驱动器/中断性能问题,但并不能真正解决多线程问题。Linux 实时容器可解决部分问题,但实时容器只是一种基于标准 Linux 的用户空间 Linux 可视化技术,并不能真正解决根本的多线程问题。
轻型线程 (LWT) – 复杂 Linux 应用的真正解决方案
之前针对 Linux 提出了多种轻型线程模型的建议,但没有一种模型能够真正解决问题。原因何在?因为大多数模型的功能都不是很强大。涉及复杂多线程应用的下一代 Linux 解决方案真正需要的是适用于用户空间 Linux 应用的全新 Linux 模型。下文概括介绍了这种名为Linux轻型线程 (LWT) 的解决方案。将高性能、低系统开销、多线程调度器植入 Linux 用户空间,来代替单独的 pthread。原因何在?
该用户空间调度器的运行和操作方式与某些传统 RTOS 高性能、低延迟实施完全相同,但不会涉及到 Linux 内核。
实施过程利用新用户空间 Linux 实施过程来直接访问硬件。同样也不涉及 Linux 内核。
上述 LWT 解决方案可在任何 Linux 实时应用中实现动态性能的提升。Enea 已设计出上述 LWT 的一些原型,事实证明,与 Linux pthreads 在调度器系统开销、特别是上下文切换和线程间消息发送/通信延迟方面的性能相比,LWT 性能可提高 10 倍。
但是除了调度性能和线程间通信功能之外,
- Enea Element:高可用性(HA)和嵌入式管理中间件的应用(08-16)
- Enea Element:高可用性(HA)和嵌入式管理中间件的应用(06-03)
- 51单片机ALE、PSEN、EA、RD、WR脚的使用(11-18)
- Enea Element:高可用性(HA)和嵌入式管理中间件(09-12)
- 嵌入式Linux发展 谈Montavista Linux(04-15)
- 利用MLD自动化操作系统移植降低 Linux成本(05-04)