C 实现内存池

C 实现内存池,c,memory-management,embedded,C,Memory Management,Embedded,我想为嵌入式系统项目制作一个内存池管理器。我想在.c文件(比如mempool.c)中创建一个单独的头文件和相应的实现。我的疑问是,当我在这个文件的函数实现中调用malloc()时,我实际使用的是哪个堆内存 假设还有其他文件(比如foo1.c和foo2.c)使用头文件“mempool.h”和mempool.c中的相应函数。所以,当我同时编译和执行foo1.c和foo2.c时,它们对mempool中函数的调用会调用两个完全不同的堆上的分配还是同一个堆上的分配 有三个C源文件在使用:mempool、f

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

假设还有其他文件(比如foo1.c和foo2.c)使用头文件“mempool.h”和mempool.c中的相应函数。所以,当我同时编译和执行foo1.c和foo2.c时,它们对mempool中函数的调用会调用两个完全不同的堆上的分配还是同一个堆上的分配

有三个C源文件在使用:
mempool、foo1、foo2

.h
文件是头文件,描述函数的“外观”和调用方式

编译
foo1
foo2
时,
mempool.o
中的目标代码将静态链接到它们中

完成这项工作后,它们现在是“两个完全独立的程序”,两个程序都包含相同的目标代码

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

如果确实希望程序真正“共享内存”,则必须使用命名的共享内存段。(
shmget
等…),您必须设计内存池管理器代码以查找、打开并正确使用该共享资源。同样,这两个程序都将包含内存池管理器目标代码的独立副本

(提示:“这已经完成了。”您可以在GitHub之类的地方找到完成这项工作的完整库,而不是自己着手定制实现。)

=== 附加说明:

顺便说一句,我还想指出第三种可能性存在:动态加载的库

采用这种方法时,目标代码在运行时由应用程序加载,并且不会成为使用它的应用程序的目标代码的“一部分”。相反,他们可以访问它。此外,操作系统知道共享,并且可以识别正在共享的单个实例。它可以允许单个共享实例“拥有”一组公共内存分配。操作系统(以及“历史与现代”版本,例如MS Windows…)在这一点上有所不同。

有三个C源文件在使用:
mempool、foo1、foo2

.h
文件是头文件,描述函数的“外观”和调用方式

编译
foo1
foo2
时,
mempool.o
中的目标代码将静态链接到它们中

完成这项工作后,它们现在是“两个完全独立的程序”,两个程序都包含相同的目标代码

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

如果确实希望程序真正“共享内存”,则必须使用命名的共享内存段。(
shmget
等…),您必须设计内存池管理器代码以查找、打开并正确使用该共享资源。同样,这两个程序都将包含内存池管理器目标代码的独立副本

(提示:“这已经完成了。”您可以在GitHub之类的地方找到完成这项工作的完整库,而不是自己着手定制实现。)

=== 附加说明:

顺便说一句,我还想指出第三种可能性存在:动态加载的库


采用这种方法时,目标代码在运行时由应用程序加载,并且不会成为使用它的应用程序的目标代码的“一部分”。相反,他们可以访问它。此外,操作系统知道共享,并且可以识别正在共享的单个实例。它可以允许单个共享实例“拥有”一组公共内存分配。操作系统(以及“历史与现代”版本,例如MS Windows…)在这一点上各不相同。

太宽泛,但嵌入式系统通常没有可用的标准库,使用
malloc
&friends是一个非常糟糕的主意。这就是使用内存池的原因…foo1.c和foo2.c是编译到同一个程序中还是两个单独的程序中?它们都是单独的单独程序。太广泛了,但嵌入式系统通常没有可用的标准库,使用
malloc
&friends是一个非常糟糕的主意。这就是人们使用内存池的原因…foo1.c和foo2.c是编译到同一个程序中还是两个单独的程序中?它们是各自独立的程序,全部放在一起。非常感谢。非常清楚的回答!谢谢。非常清楚的回答!