动态内存访问对实时程序有害吗?

Is dynamic memory access detrimental in real-time programs?

我正在开发一个包含实时软件组件的项目,使用 Linux 上的 RT PREEMPT 补丁。

在 "idle" 操作期间,软件只是等待传入的 TCP 连接和请求。根据请求,软件可能会创建一个运行一段时间的实时线程。所以整个应用不需要实时运行,时不时的只需要这一个线程。

我的问题是:我很清楚动态内存分配是不确定的并且不利于实时代码。但是,访问堆上的现有内存是否也会对实时约束产生不利影响?

我问是因为我正在考虑程序启动的情况,在堆上分配任何需要的结构,然后触发访问堆的实时线程。

编辑:一旦实时线程启动,其他线程将被阻止写入实时线程需要使用锁访问的变量(好吧,除了一个必须更新的变量,但访问仍然是使用单独的锁进行限制)。

EDIT2:我忘了提到该程序最终将部署在没有任何交换的系统上 space,所以我认为内存分页应该不是问题。 (当然,这并不能避免 OS 尚未配置的内存引起的页面错误问题。)

is accessing existing memory on the heap also detrimental to real-time constraints?

否,除非您的系统是 thrashing

顺便说一句,您可以考虑编写自己的分配(例如,上面 mmap(2)...) and using mlock(2) 应该在 RAM 中的内存。

虚拟内存管理器可能会将您的内存移动到交换区,从而使您的线程在 运行 时生成主要页面错误。您需要使用 mlock() 锁定内存页面。我还建议分块分配内存并在使用 memset() 之前使用 memset() 写入所有内存以避免在 运行 时间出现轻微页面错误,并使用 placement new 而不是常规放置在已分配的内存中创建对象.