对齐大小为4096字节的posix_memalign与mmap
有何不同?它在内部使用mmap
还是其他一些机制?
答案 0 :(得分:5)
posix_memalign
是一个比mmap
更高级别的API,旨在与malloc
,free
和realloc
互操作。 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()
函数
对象:
未指定对任何其他类型文件的支持。
特别是,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()
。