在函数中。
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
参数 length
在 mmap
代表的是字节数还是页数?另外,我可以使用 mmap
恰似 malloc
? 有什么不同?
在 length
参数的单位是字节。 Linux手册页面没有明确说明这一点,但在 POSIX规范 说(重点是我的)。
mmap()函数应该在地址pa的进程地址空间之间建立一个映射,这个地址pa为len 字节数 到文件描述符fildes所代表的内存对象,在偏移量off处为len 字节数.
可以使用 mmap
作为分配内存的方式(你会想使用 MAP_ANONYMOUS
否则映射 /dev/zero
设备),但一般来说,它并不能很好地直接替代 malloc
:
映射将始终以页为单位(因此系统将四舍五入)。length
到页面大小的下一个倍数),所以对于小分配来说,它的效率非常低。
你不能将 mmap
到 realloc
或 free
(使用 mremap
和 munmap
而不是)。)
munmap
实际上是将内存返回给系统,而 free
可能会将它分配给您的进程,并将其标记为可供未来调用的 malloc
. 这有优点也有缺点。 一方面,如果你知道将来不需要那条内存,让系统把它收回来是件好事。 另一方面,每个 mmapmunmap 都需要系统调用,这相对较慢,而 malloc
可能能够分配之前的 free
d内存已经属于你的进程,无需系统调用。