全页Malloc

Nat*_*ist 4 c memory malloc page-size

我试图通过一次使用整个页面来优化我的程序的内存分配.

我抓住这样的页面大小:sysconf(_SC_PAGESIZE);然后计算适合页面的元素总数,如下所示:elements=pageSize/sizeof(Node);

我的想法是,当我真正去malloc我的记忆时,我会用malloc(elements*sizeof(Node)); 它似乎sifeof(Node)的乘法和除法会抵消,但是对于整数除法,我不相信那是这种情况.

这是一次malloc整个页面的最佳方式吗?

谢谢

Mat*_*son 5

malloc函数没有页面大小的概念。除非您还要分配与页面边界对齐的页面,否则malloc以这种方式调用不会有任何好处。只是malloc因为你需要很多的元素,并停止担心微观优化的东西,几乎可以肯定不会给你所有的任何好处。

是的,Linux内核一直在做这样的事情。有两个原因:

  1. 您不希望分配比页面大的​​块,因为这会大大增加分配失败的风险。
  2. 内核分配是按页进行的,而不是像C库那样一次分配大量内存,然后将其拆分为较小的组件。

如果您确实要分配页面大小的内存,则将from的结果sysconf(_SC_PAGESIZE)用作您的size参数。但是几乎可以肯定,您的分配跨越了两个页面。

  • @ysdx 可以,所以他的评论太强了,但是绝大多数 malloc 实现都在返回内存之前存储它们的开销,因此他们可以在需要时非常快速地访问它。 (2认同)

Yan*_*aud 5

您的计算elements=pageSize/sizeof(Node);没有考虑malloc()添加到返回的任何块/内存块的元数据malloc().在许多情况下,malloc()将返回一个可能至少在min(sizeof(double),2 * sizeof(void *))边界上对齐的内存块(32个字节变得非常普遍......).如果malloc()在页面上对齐内存块,添加其块(使用填充),并且您编写整页大小的数据,则最后一个字节不在第一页:因此您最终使用2页.

想要一整页,只为你而不用担心浪费内存,而不使用mmap()/ VirtualAlloc()如评论中所建议的那样?这个给你:

int ret;
void *ptr = NULL;
size_t page_size = sysconf(_SC_PAGESIZE);

ret = posix_memalign(&ptr, page_size, page_size);
if (ret != 0 || ptr == NULL) {
    fprintf(stderr, "posix_memalign failed: %s\n", strerror(ret));
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这可能与微观优化有关.您可能仍然没有检查过你Node的缓存行的大小倍数,也没有检查如何改进缓存局部性,也没有找到减少内存碎片的方法.因此,您可能会采用错误的方式:首先使其工作,使用profil,优化算法,profil,在最后一个选项进行微优化.