实现内存池

时间:2016-07-09 12:37:02

标签: c memory-management embedded

我想为嵌入式系统项目创建一个内存池管理器。我想在.c文件(比如mempool.c)中创建一个单独的头和相应的实现。我的疑问是,当我在这个文件的函数实现中调用malloc()时,我实际上使用了哪个堆内存?

鉴于有其他文件(比如foo1.c和foo2.c)使用标题" mempool.h"以及mempool.c中的相应函数。因此,当我同时编译并执行foo1.c和foo2.c时,他们对mempool中函数的调用是否会在2个完全独立的堆或同一个堆上调用分配?

1 个答案:

答案 0 :(得分:2)

正在播放三个 C源文件:mempool, foo1, foo2

.h个文件是标题文件,用于描述函数"的外观,"以及他们如何被召唤。

当您编译foo1foo2时,来自mempool.o的对象代码将静态链接

这样做之后,他们现在是两个完全独立的程序,"两者都包含相同的对象代码。

当两个程序执行时,每个程序都有自己的私有堆。虽然它们都包含用于内存池管理的相同对象代码,但它们彼此无关。

如果您 希望程序实际上共享内存,那么#34;您必须使用命名的共享内存段。 shmget等等),并且您必须设计内存池管理器代码以查找,打开并正确使用该共享资源。同样,两个程序都将包含它们自己的内存池管理器对象代码的独立副本。

(提示:"这已经完成了。"你可以找到完成这样做的库,在像GitHub这样的地方,而不是自己开始定制实现。)

=== 附加说明:

我还想顺便评论一下第三种可能性:动态加载库。

采用这种方法时,应用程序在运行时加载对象代码,而 的一部分。使用它的应用程序的对象代码。相反,他们可以访问它。此外,操作系统了解共享,可能识别正在共享的单个实例。 可能允许一组共同的内存分配由"拥有。 单个共享实例。操作系统(和版本,"历史与现代" 例如的MS-Windows ......)各不相同在这一点上。