具有嵌入式 Linux 的单核低延迟进程

Posted

技术标签:

【中文标题】具有嵌入式 Linux 的单核低延迟进程【英文标题】:Low latency process on single core with embedded Linux 【发布时间】:2015-08-03 02:36:30 【问题描述】:

我想在带有嵌入式 Linux 系统的单独内核上运行单个低延迟任务(用于音频,ALSA/JACK)。删除调度程序和其他中断可能是这里的关键。

到目前为止,我发现了几种方法,例如cpusets 和 2009 年的离线调度程序(遗憾的是不支持用户空间任务)。

有没有更新/更方便的方法来实现这一点?

Offline scheduler

【问题讨论】:

查看renice & ionice 命令 【参考方案1】:

您要查找的主题名为"CPU affinity"。 CPU 亲和性主要有两个方面:进程亲和性和中断亲和性。

据我所知(诚然有限):

使用taskset 命令将进程分配给 CPU。 (亲缘关系由子进程继承。)

Linux 上 CPU 分配的中断可以使用 /proc/irq/<n>/smp_affinity 进行操作。要验证分配的有效性,请检查/proc/interrupts 以查看哪些 CPU 服务于哪些中断。 See here.

在您的特定情况下,您希望为关键应用程序保留一个 CPU(也称为内核),例如 CPU0。这意味着所有进程和中断都应该分配给除 CPU0 之外的所有进程,使用清除了位 0 (== CPU0) 的关联掩码,例如0xffffff 。并且您的关键应用程序将具有 0x1 的关联掩码,这意味着它只允许在 CPU0 上运行。

此外,您可能需要在应用程序中使用sched_setscheduler 系统调用将调度设置为实时策略之一。这可能会改善您的应用程序的延迟(但也可能会变得更糟)。

请注意,调整 CPU 亲和性并非易事,而且很少有明确的解决方案。您需要进行测试和试验,以确保配置可以维持您需要的性能。例如,您的应用程序可能会与其他进程进行通信。如果通信是同步的,并且其他进程反应缓慢(因为它们的 CPU 资源有限),这反过来会对关键应用程序的性能产生负面影响。同样适用于声卡的中断。

希望对您有所帮助。

【讨论】:

我不知道您可以如此轻松地操纵中断,太棒了!是否仍然可以异步使用函数挂钩来实现例如其他核心上的音频过滤器? 亲和性是由操作系统调度程序实现的,因此它需要一些操作系统对象,通常是一个进程。 Linux 显然还允许以编程方式更改线程的亲和性 - 请参阅 man pthread_setaffinity_np。(虽然软件开发人员是专业的,但我不得不专门以系统管理员的身份处理亲和性。)

以上是关于具有嵌入式 Linux 的单核低延迟进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux 嵌入式 (ARM) 中的低内存吞吐量

Everspin MRAM磁场抗扰度

嵌入式 Linux进程间通信——Linux系统日志

嵌入式Linux从入门到精通之第十一节:进程间通信

嵌入式Linux从入门到精通之第十节:系统编程之进程

2014025681 《嵌入式系统程序设计》第七周学习总结