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

时间:2017-05-31 09:54:43

标签: c++ real-time heap-memory

我正在使用Linux上的RT PREEMPT修补程序处理包含实时软件组件的项目。

"空闲"操作软件只是等待传入的TCP连接和请求。根据请求,软件可以创建运行一段时间的实时线程。因此整个应用程序不需要实时操作,只需要这一个线程。

我的问题是:我很清楚动态内存分配是非确定性的,对实时代码有害。但是,访问堆上的现有内存是否也对实时约束有害?

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

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

EDIT2:我忘了提到该程序最终会部署在一个没有任何交换空间的系统上,所以我不认为内存分页应该是一个问题。 (当然,这并不能避免通过操作系统尚未配置的内存出现页面错误的问题。)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  

访问堆上的现有内存也不利于实时约束?

不,除非您的系统是thrashing

顺便说一下,您可以考虑编写自己的分配(例如,高于mmap(2) ...)并使用mlock(2)作为应该在RAM中的内存。