【问题标题】:Mmap vs Static allocation for large allocations大型分配的 Mmap 与静态分配
【发布时间】:2014-01-20 19:56:43
【问题描述】:

我正在分配一个相当大的、大约 100GB 的内存块。确切的大小在编译时总是已知的。

我应该静态分配吗?

static char data[DATA_SIZE];

还是使用mmap?

data = mmap(NULL, DATA_SIZE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_LOCKED|MAP_UNINITIALIZED, -1, 0)

对于前者,应用程序(忽略启动时间)似乎运行得稍微快了一点。

忽略失败的分配,每种方法的优缺点是什么?

【问题讨论】:

  • 这么大的数据你放了什么?

标签: c linux gcc mmap static-allocation


【解决方案1】:

我会使用mmapmalloc,只是因为故障情况更容易处理(并且您至少可以给出有意义的错误消息)。对于静态数据,您的程序的 execve(2) 会失败(并且尝试它的 shell 会给出一个不是很有用的消息)。

不过,我也可能会测试(可能通过解析/proc/meminfo)底层系统是否有足够的内存资源。

最后,在不知道为什么需要这么多数据的情况下,它闻起来很糟糕。你确定你不能这样做吗?如果你真的需要 100GB,你只能在非常大(而且成本很高)的机器上运行。

不要指望virtual memory 子系统能被paging 很好地处理。 Thrashing 对于使计算机无法使用非常重要。或者考虑使用madvise(2)

除非您可以使用专门的超级计算机,否则这看起来像是设计错误(当前的桌面最多有 32GB)。

【讨论】:

    【解决方案2】:

    没有任何理由为此使用mmapmalloc 非常有能力做到这一点,并且通常会在后台使用mmap,但是使用malloc 会使您的代码更简单、更易于理解且更便携。

    至于静态数组是否更可取,也许吧。主要缺点是它迫使您拥有一个实际的单例(这很糟糕),而不是拥有一个数据结构的实例,即使您不需要它,它也可能存在于多个实例中。根据您的观点,使用可能是赞成或反对的静态数组的另一个方面是,它将失败案例从您必须在运行时处理的事情转移到程序的调用者必须处理的事情(由于失败execve 或在控制到达您的进程之前提前终止进程)。

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2010-12-04
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多