如何使用mmap在堆中分配内存?

只是问题陈述,如何使用mmap()在堆中分配内存? 这是我唯一的选择,因为malloc()不是可重入函数。

你为什么需要重入? 唯一需要的是从信号处理程序调用函数; 否则,线程安全性也一样好。 mallocmmap都是线程安全的。 每个POSIX都不是异步信号安全的。 实际上, mmap可能在信号处理程序中运行良好,但是从信号处理程序分配内存的整个想法是一个非常糟糕的主意。

如果你想使用mmap来分配匿名内存,你可以使用(不是100%可移植,但绝对是最好的):

 p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 

便携但丑陋的版本是:

 int fd = open("/dev/zero", O_RDWR); p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); close(fd); 

请注意, MAP_FAILED而不是NULL是失败的代码。

制作一个简单的slab分配器


尽管在信号处理程序1中分配内存看起来确实是最好避免的,但它当然可以完成。

不,你不能直接使用malloc()。 如果你想让它在堆中,那么mmap也不会工作。

我的建议是你制作一个基于malloc的专用slab分配器 。

确切地确定所需对象的大小,并预先分配一些对象。 最初使用malloc()分配它们并保存它们以便以后同时使用。 您可以使用本质上可重入的队列和取消队列函数来获取和释放这些块。 如果他们只需要从信号处理程序进行管理,那么即使这样也没有必要。

问题解决了!


1.如果您没有这样做,那么您似乎拥有嵌入式系统或者只能使用malloc()。