posix_memalign与mmap有何不同

时间:2012-02-26 12:31:03

标签: c linux gcc x86-64

对齐大小为4096字节的posix_memalignmmap有何不同?它在内部使用mmap还是其他一些机制?

4 个答案:

答案 0 :(得分:5)

posix_memalign是一个比mmap更高级别的API,旨在与mallocfreerealloc互操作。 mmap用法更复杂,因为它提供的功能比posix_memalign更多(将文件映射到进程的地址空间)。它的实现方式(以mmap或其他方式)未被POSIX标准指定。

如果您没有对齐限制,请使用posix_memalign使用malloc

答案 1 :(得分:1)

mmap可用的地方,posix_memalign通常使用mmap实施。主要区别在于posix_memalign位于stdlib.h中,其中mmap是一个系统调用,可能不可用,并且在不同平台上具有不同的语义。

答案 2 :(得分:1)

  

对齐大小为4096字节的posix_memalign与mmap有何不同?

显而易见的答案:posix_memalign无法通过fd mmap任意文件。 :)

至于posix_memalign与mmap(MAP_ANOYMOUS)的分配行为:我认为没有要求posix_memalign(size)必须使用mmap。它也可以与malloc共享sbrk机制,并返回一个指向brk区域部分的正确对齐的指针。

答案 3 :(得分:1)

从标准 (POSIX) 的角度来看,posix_memalign()mmap() 没有任何真正的联系:

<块引用>

posix_memalign - 对齐的内存分配

posix_memalign() 函数应分配大小字节对齐在 由对齐指定的边界,并应返回指向 memptr 中分配的内存。

<块引用>

mmap - 映射内存页面

mmap() 函数应建立地址空间之间的映射 一个进程和一个内存对象。

以下内存应支持mmap()函数 对象:

  • 常规文件
  • [SHM] > 共享内存对象 <
  • [TYM] > 类型化内存对象 <

未指定对任何其他类型文件的支持。

特别是,POSIX 没有指定可以使用的 MAP_ANONYMOUS 标志(例如在 Linux 上)使用 mmap() 来分配没有相应文件的内存。因此,先验地,这两个函数执行不相关的任务:posix_memalign() 分配动态内存(POSIX mmap() 不能这样做),而 mmap() 将文件映射到进程地址空间({{1 }} 不能做,如jørgensen’s answer 中所述)。

当谈到支持 posix_memalign() 的系统时,例如 Linux(在问题中被标记),MAP_ANONYMOUS 获得了类似于 mmap() 的能力,尽管 posix_memalign()返回一个与系统页面大小对齐的指针,而 mmap() 也可用于获取具有不同对齐方式的内存。

最后,memory allocated with posix_memalign() is freed using free(),而 mmap() is cleaned up using munmap()