动态内存访问对实时程序有害吗?
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 而不是常规放置在已分配的内存中创建对象.
我正在开发一个包含实时软件组件的项目,使用 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 而不是常规放置在已分配的内存中创建对象.