malloc与mmap的区别

malloc与mmap的区别,c,malloc,mmap,C,Malloc,Mmap,我试图在c中实现malloc,我必须使用mmap 但我仍然不明白malloc和mmap之间的区别是什么(MAP_ANNON) 它们都返回一个内存区域 那么为什么我们使用malloc而不是mmap呢 这两者之间的区别是什么: c = malloc(1000) 还有这个: c = mmap(NULL, 1000, PROT_READ | PROT_WRITE| MAP_ANON, -1, 0); 类似地,在支持它的系统上,mmap()批发提供内存,而malloc()零售提供内存。因为C标准只指定

我试图在c中实现malloc,我必须使用mmap 但我仍然不明白malloc和mmap之间的区别是什么(MAP_ANNON) 它们都返回一个内存区域 那么为什么我们使用malloc而不是mmap呢 这两者之间的区别是什么:

c = malloc(1000)
还有这个:

c = mmap(NULL, 1000, PROT_READ | PROT_WRITE| MAP_ANON, -1, 0);

类似地,在支持它的系统上,
mmap()
批发提供内存,而
malloc()
零售提供内存。因为C标准只指定了后一个函数,所以使用
mmap()
的代码只适用于支持它的系统(Unix定义了它,但其他一些操作系统不定义它)

通常,一个典型的malloc实现会检查它是否知道有任何存储区域有足够的可用空间来满足请求。如果是这样,它将从其块列表中删除存储区域,记录其地址以返回给调用者,并且——如果它明显大于请求的大小——将超出分配的区域部分添加回其空闲区域列表

如果malloc()发现它知道的任何可用存储区域都不能满足请求,它将从底层环境请求一个存储区域(可能在Unix系统上使用mmap(),或在其他系统上使用其他方法),记录其地址以返回调用方,并在自由区域列表中添加超出所需区域的任何部分


请注意,malloc()设计用于合理有效地处理各种场景,包括应用程序重复分配和释放许多小块的场景。在这种情况下使用
mmap()
会产生很差的结果,因为它被设计用于处理大数据块的不频繁分配。使用
malloc()
意味着,如果应用程序请求许多小区域,则可以通过细分从
mmap()
接收到的几个大区域来满足这些请求,还意味着如果分配释放了存储空间,并且以后需要获取一些存储空间,则后一个请求可以重用刚刚释放的存储空间,而不必让底层环境参与到这种重用中。

您有没有比此描述更好的代码
mmap
不用于内存分配,而是用于内存映射文件。我不知道这为什么适用于这里。如果你想知道它到底是做什么的,这是一件好事,但是阅读文档很容易回答。如果我们使用MAP_ANON标志,我们不需要使用文件,所以mmap返回一个内存区域,而malloc也返回一个内存区域,这有什么区别?我不知道为什么这是最好的方法,而不是只进行必要的低级操作系统调用,而
malloc
在内部做这些调用。@tadman
mmap
sbrk
一起使用,如果我不这样做的话,就可以实现
malloc
弄错了。@carcigenitate这实际上取决于您的操作系统。Windows是出了名的怪异,非POSIX的内存更奇怪。据我所知:Malloc使用已经知道的内存,如果还不够,它会使用mmap来获得更多的空间,而我们不使用mmap的原因是mmap总是在不检查已经映射的内存是否有空闲空间的情况下请求新的内存空间,对吗?@HakimELmansouri:许多操作系统设计为在4KB或64KiB存储的倍数的块上运行。如果希望使用OS分配函数创建500个对象,每个对象的长度为64字节,那么这500个对象可能会占用2048000字节的内存。相比之下,根据
malloc()
跟踪事物的方式,分配可能只需要32000字节,也可能不超过48000字节。