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

问题描述 投票:-1回答:1

在函数中。

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

参数 lengthmmap 代表的是字节数还是页数?另外,我可以使用 mmap 恰似 malloc? 有什么不同?

c++ c linux mmap
1个回答
5
投票

length 参数的单位是字节。 Linux手册页面没有明确说明这一点,但在 POSIX规范 说(重点是我的)。

mmap()函数应该在地址pa的进程地址空间之间建立一个映射,这个地址pa为len 字节数 到文件描述符fildes所代表的内存对象,在偏移量off处为len 字节数.

可以使用 mmap 作为分配内存的方式(你会想使用 MAP_ANONYMOUS 否则映射 /dev/zero 设备),但一般来说,它并不能很好地直接替代 malloc:

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

  • 你不能将 mmapreallocfree (使用 mremapmunmap 而不是)。)

  • munmap 实际上是将内存返回给系统,而 free 可能会将它分配给您的进程,并将其标记为可供未来调用的 malloc. 这有优点也有缺点。 一方面,如果你知道将来不需要那条内存,让系统把它收回来是件好事。 另一方面,每个 mmapmunmap 都需要系统调用,这相对较慢,而 malloc 可能能够分配之前的 freed内存已经属于你的进程,无需系统调用。

© www.soinside.com 2019 - 2024. All rights reserved.