linux实时性 避免页面错误

当应用读取或写入未提交到物理内存的内存时,会发生页错误。 不可能(或很难)预测页面错误何时会发生,因此它们是计算机中不确定性的另一个来源。

幸运的是,有一个函数允许您提交进程使用的所有内存并将其锁定,这样它就不会导致页面错误。 它是mlockall(2)。 这是它的两面旗帜:

  • MCL_CURRENT:此选项锁定当前映射的所有页面。
  • MCL_FUTURE:此选项锁定稍后在中映射的页面。

通常在应用启动期间调用mlockall,并将这两个标志设置为锁定所有当前和未来的内存映射。

 

MCL_FUTURE不是魔术,因为在使用malloc()/free() 或mmap()分配或释放堆内存时,仍然会有不确定的延迟。 这样的操作最好在启动时完成,而不是在主控制循环中完成。

在堆栈上分配的内存比较棘手,因为它是自动完成的,如果您调用一个使堆栈比以前更深的函数,您将遇到更多的内存管理延迟。 一个简单的解决方法是将堆栈的大小增加到您认为在启动时永远不会需要的大小。 代码如下所示:

复制代码
#define MAX_STACK (512*1024)
static void stack_grow (void)
{
      char dummy[MAX_STACK];
      memset(dummy, 0, MAX_STACK);
      return;
}
int main(int argc, char* argv[])
{
      […]
      stack_grow ();
      mlockall(MCL_CURRENT | MCL_FUTURE);
      […]
复制代码

stack_grow()函数在堆栈上分配一个较大的变量,然后将其置零,以强制将这些内存页提交给该进程。

中断是我们应该警惕的另一个非决定论的来源。

posted on   tycoon3  阅读(122)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示