我需要尽可能让这个过程实时运行。
所有通信都是通过共享内存完成的 - 内存映射文件 - 根本没有系统调用 - 它使用繁忙等待共享内存。
该进程在实时优先级下运行,所有内存都被mlockall(MCL_CURRENT|MCL_FUTURE)
锁定,但成功并且进程有足够ulimits
锁定所有内存。
当我在它上面运行perf stat -p PID
时,我仍然会看到次要页面错误。
我用过程亲和力测试了这个,没有。
问题:
是否有可能消除它们 - 即使是轻微的页面错误?
答案 0 :(得分:5)
我通过从内存映射文件切换到POSIX共享内存shm_open
+内存锁定来解决了这个问题。
答案 1 :(得分:0)
如果我理解问题是正确的,那么完全避免轻微的页面错误是不可能的。在大多数现代操作系统(包括Linux)中,操作系统在程序启动时不会将所有文本和数据段加载到内存中。它分配内部数据结构,并且在需要文本和数据时,页面基本上都是错误的。这导致页面错误物理内存可供进程使用,从后备存储交换页面。因此,可以避免轻微的页面错误,而无需访问可能无法访问的后备存储。