【问题标题】:C++, How to Ensure Aligned Memory Using mmap()?C++,如何使用 mmap() 确保对齐内存?
【发布时间】:2021-09-14 04:18:34
【问题描述】:

我目前正在使用 mmap 分配内存,如下所示:

void *void_new_block = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

现在我想提高 64 位 CPU 的性能,因此我需要我的块驻留在 8 的乘法地址之间为此我需要两件事:

  1. 为了确保大小是 8 的乘积(我已经通过四舍五入做到了)

  2. 为了确保 mmap 将在乘以 8 的地址处开始分配。

我该如何解决 2?我听说一些特殊的标志可能会有所帮助?

一些笔记,我的操作系统:

Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:    18.04
Codename:   bionic

g++ 版本:

g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.

【问题讨论】:

  • 过度分配,然后调整返回的指针以满足对齐需求。
  • @RichardCritten 但是我怎么知道从哪里做 munmap?
  • 我更喜欢提供一些标志将解决 2 的解决方案,有一天我读到它是可能的,但再也找不到了
  • 不要调整返回指针,复制后再对齐。

标签: c++ memory malloc cpu mmap


【解决方案1】:

mmap always allocates entire pages.

如果 addr 为 NULL,则内核选择创建映射的(页面对齐)地址 [...] 如果 addr 不为 NULL,则 [...] 在 Linux 上,内核将选择一个附近的页面边界

(在 Linux 以外的系统上,它仍然需要选择页面边界,但它可能不在附近)

在 x86 或 x86_64 上,页面是 4096 字节,所以没问题。很难想象页面小于 8 字节的 CPU。

【讨论】:

  • 所以你100%确定它会正确分配
  • @daniel 是的。页面大于 8 个字节。实际上4096偏小;其他一些 CPU 的页面更大。由于它们是 4096 字节的倍数,它们已经是 8 字节的倍数。
猜你喜欢
  • 2010-12-11
  • 2018-07-08
  • 2011-08-07
  • 2011-11-27
  • 2015-09-24
  • 2023-03-06
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
相关资源
最近更新 更多