C 这个内存分配器有多好?

C 这个内存分配器有多好?,c,linux,gcc,x86-64,C,Linux,Gcc,X86 64,正如您所知,mmap和malloc在具有地址空间布局随机化的系统上是不确定的。为了使内存分配具有确定性,我使用mmap来保留一个非常大的地址空间(在64位系统上),没有交换空间,也就是说,使用MAP\u NORESERVE。然后,由于我需要内存,我通过执行mmap,在该地址空间范围内固定MAX_,来分配10 MB的空间。因此,分配的内存呈线性增长 当我需要释放内存时,我只需使用munmap取消映射即可。此外,我不会重新利用未映射的地址空间,而是继续提前分配。我想这不会真正影响任何事情,因为我的地

正如您所知,
mmap
malloc
在具有地址空间布局随机化的系统上是不确定的。为了使内存分配具有确定性,我使用
mmap
来保留一个非常大的地址空间(在64位系统上),没有交换空间,也就是说,使用MAP\u NORESERVE。然后,由于我需要内存,我通过执行
mmap
,在该地址空间范围内固定MAX_,来分配10 MB的空间。因此,分配的内存呈线性增长

当我需要
释放
内存时,我只需使用
munmap
取消映射即可。此外,我不会重新利用未映射的地址空间,而是继续提前分配。我想这不会真正影响任何事情,因为我的地址空间(使用MAP_NORESERVE分配给
mmap
)非常大

现在的问题是,这个内存分配器有多好。它当然不是很聪明,因为它不能分配小块内存,就像通过
mmap
分配至少4096字节内存一样,但我想这仍然是一个可行的解决方案。你觉得怎么样

另外,如果进程只分配因数4096的内存,情况会怎样呢。在这种情况下,我认为这种方法不会比
malloc

编辑
注意,我所说的是关于两个相同的冗余过程的决定论。一个是从另一个分叉的,因此它使用MAP_NORESERVE获取mmaed区域的初始地址,就像我后来做的那样。

不好。你迟早会耗尽虚拟内存。这取决于进程的分配和释放量,但无论如何,它肯定不适合长时间运行的守护进程。

但这种决定论要求很奇怪。即使内存分配是确定的,也取决于输入。如果过程的顺序稍有不同,则结果会有所不同。

如果他们做的每件事都一模一样,他们怎么会多余呢?如果一个会崩溃,那么另一个也会完全一样。

不好。你迟早会耗尽虚拟内存。这取决于进程的分配和释放量,但无论如何,它肯定不适合长时间运行的守护进程。

但这种决定论要求很奇怪。即使内存分配是确定的,也取决于输入。如果过程的顺序稍有不同,则结果会有所不同。
如果他们做的每件事都一模一样,他们怎么会多余呢?如果一个会崩溃,那么另一个也会这样做

使我的内存分配具有确定性

一个简单的解决方案可能是

这是一个多么好的内存分配器

这在很大程度上取决于你们的质量标准。另一个答案指出,它不是一个很好的通用分配器。但是,一般用途的分配器通常不需要具有确定性

大概您有这样一个需求,也可能有一些其他(尚未说明的)需求

因为你一直让我们不知道你到底想做什么,我们不能告诉你你所做的是好是坏

使我的内存分配具有确定性

一个简单的解决方案可能是

这是一个多么好的内存分配器

这在很大程度上取决于你们的质量标准。另一个答案指出,它不是一个很好的通用分配器。但是,一般用途的分配器通常不需要具有确定性

大概您有这样一个需求,也可能有一些其他(尚未说明的)需求


由于您一直不让我们知道您实际上在做什么,我们无法告诉您所做的是否好。

我想说的主要问题应该是:为什么您需要将应用程序的内存设置为单个块?这有什么意义?为什么你认为这会更具“确定性”?ThiefMaster在我的问题中补充了为什么我需要它。
MAP\u NORESERVE
?你的意思是“地图共享”?黑暗,不,我指的是“地图共享”。另外,我说的是私有分配的内存,因此MAP_PRIVATE,而不是MAP_SHARED。我想说的主要问题应该是:为什么您需要应用程序的内存是单个块?这有什么意义?为什么你认为这会更具“确定性”?ThiefMaster在我的问题中补充了为什么我需要它。
MAP\u NORESERVE
?你的意思是“地图共享”?黑暗,不,我指的是“地图共享”。另外,我说的是私有分配的内存,因此MAP_PRIVATE,而不是MAP_SHARED.ugoren,正如我所说,它是一个64位系统,我们几乎拥有无限的地址空间,就物理内存和页面交换而言,它根本不是我们不释放内存,但只是做的粒度不如malloc那么细。我想这是唯一的区别。如果,比方说,我们有一个只分配因子为4096的内存的进程,那么我认为这种方法甚至比malloc更好。你说什么?没有什么是无限的。在64位系统中,耗尽内存可能需要更多的时间。另外,进程地址空间很大,但不是2^64字节,它要小得多。它足够大,可以容纳任何合理的内存,但不足以一直丢弃虚拟内存。如果其中一个崩溃,那么另一个可能会崩溃,这是没有必要的!我的意思是,您可能有一个软错误,它会损坏一个进程的数据,但不会损坏另一个进程的数据。没有人在浪费记忆。ugoren,就像我说的,这是一个64位的系统,我们有几乎无限的地址空间,就物理内存和页面交换而言,这并不是说我们根本没有释放内存,只是没有在粒度上释放内存