为什么mmap()以降序返回地址,而malloc()以升序返回?

时间:2019-09-07 09:47:31

标签: c malloc mmap

我想知道为什么mmap()会按降序返回地址,而malloc()则按升序返回地址,而它们两个都在堆中分配内存?

我尝试过:

#include <unistd.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#define NUM 6

int main()
{
    void    *ptr_mmap[NUM];
    void    *ptr_mall[NUM];

    size_t size = 1;
    for (int i = 0; i < NUM; i++)
    {
         ptr_mmap[i] = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE |
                            MAP_ANONYMOUS, -1, 0);
        ptr_mall[i] = malloc(size);
        printf("%d mmap ptr = %p\tmalloc ptr = %p\n", i, ptr_mmap[i],
               ptr_mall[i]);
    }

    return 0;
}

输出示例:

0 mmap ptr = 0x7fd752d6d000 malloc ptr = 0x8c3010
1 mmap ptr = 0x7fd752d6b000 malloc ptr = 0x8c3030
2 mmap ptr = 0x7fd752d6a000 malloc ptr = 0x8c3050
3 mmap ptr = 0x7fd752d69000 malloc ptr = 0x8c3070
4 mmap ptr = 0x7fd752d68000 malloc ptr = 0x8c3090
5 mmap ptr = 0x7fd752d67000 malloc ptr = 0x8c30b0

我期望他们两个都以升序返回地址,因为地址会在堆中分配内存时长大。 mmap()的行为使我感到困惑。

2 个答案:

答案 0 :(得分:0)

这是特定于实现的,即使它以这种方式出现在您的系统上,对于其他系统也可能有所不同。我的猜测是,系统上的实现会尝试将mmap()分配与malloc()分配分开,从而从堆的每一端分配它们。

答案 1 :(得分:-1)

对于类unix的系统,进程具有如下所示的内存模型:enter image description here

malloc()在堆段中向上分配内存。 mmmap()在未分配的内存区域中分配内存。该区域映射到共享内存库等。