mmap 中的长度是字节数还是页数?

Is the length in mmap a number of bytes or a number of pages?

本文关键字:字节数 mmap      更新时间:2023-10-16

在函数中:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)

mmaplength的参数是表示字节数还是页数?另外,我可以像malloc类似地使用mmap吗?有什么区别?

length参数以字节为单位。 Linux 手册页没有明确说明这一点,但 POSIX 规范说(强调我的(:

mmap(( 函数应在 len字节的地址 pa 处的进程地址空间与 len字节偏移量关闭处的文件描述符 fildes 表示的内存对象之间建立映射。

可以使用mmap作为分配内存的一种方式(您需要使用MAP_ANONYMOUS或映射/dev/zero设备(,但它通常不是malloc的良好直接替代品:

  • 映射将始终以页面单位进行(因此系统将length舍入到页面大小的下一个倍数(,因此对于较小的分配来说效率非常低。

  • 不能将mmap返回的指针传递到reallocfree(改用mremapmunmap(。

  • munmap实际上将内存返回到系统,而free可能会将其分配给您的进程,并仅将其标记为可供将来调用malloc使用。 这有利有弊。 一方面,如果您知道将来不需要该内存,那么让系统将其恢复是很好的。 另一方面,每个 mmap/munmap 都需要一个系统调用,这相对较慢,而malloc可能能够在没有系统调用的情况下分配已经属于您的进程的先前freed 内存。