c - 嵌入式系统上分层通信堆栈的内存管理
问题描述
这个问题与嵌入式系统上的编程有关。我正在研究嵌入式设备上的实验性通信堆栈。堆栈从底层通道接收流数据,检测离散数据包,重新组装碎片数据等......
每个功能都在单独的层中实现。某些层延迟数据包的处理(因为数据到达中断处理程序并且进一步的处理被卸载到主上下文中)。一些层将多个传入数据包合并为一个转发到下一个上层的单个数据包(即碎片数据的重组)。因此,一些层将一个传入数据包拆分为多个数据包,然后转发到下一个较低层。当然,任何层都可能在任何时候丢弃数据包,而无需另行通知,因为例如校验和与数据不匹配。
我的问题是关于这些数据包的内存分配。
目前,我在每一层都使用 malloc 。具体来说,我为要转发到下一层的数据包分配内存,将指针传递给下一层的处理程序,并在调用后再次释放内存。复制所需数据是下一层的处理程序的责任。因此,每一层都维护分配的数据的所有权,并且很难忘记释放分配的内存。这工作得很好,但会导致很多不必要的副本。
或者,我可以将缓冲区的所有权转发给下一层。然后下一层可以直接在缓冲区上做它的工作,并将同一个缓冲区转发到下一层,以此类推。我想这有点棘手,因为没有内存泄漏。
最终,因为它是嵌入式设备,我想找到一个没有动态内存分配的解决方案。如果每一层都拥有自己的内存所有权,那么没有 malloc 的实现应该很容易。但如果所有权被传递,那么它似乎更复杂。
你有什么意见吗?
解决方案
Allocate memory in one place. Since it is an embedded system, you'll have to use a static memory pool. Like a classic ADT implemented as opaque type:
// buffer.h
typedef struct buffer_t buffer_t;
buffer_t* buffer_create (/*params*/);
/* setter & getter functions here */
// buffer.c
#include "buffer.h"
struct buffer_t
{
/* private contents */
};
static buffer_t mempool [MEMPOOL_SIZE];
static size_t mempool_size = 0;
buffer_t* buffer_create (/*params*/)
{
if(mempool_size == MEMPOOL_SIZE)
{ /* out of memory, handle error */ }
buffer_t* obj = &mempool[mempool_size];
mempool_size++;
/* initialize obj here */
return obj;
}
/* setter & getter functions here */
Now all your various application layers and processes only get to pass around copies of a pointer. In case you do need to actually make a hardcopy, you implement a buffer_copy
function in the above ADT.
In case of a multi-process system, you will have to consider re-entrancy in case multiple processes are allowed to allocate buffers at the same time.
推荐阅读
- c# - 在 c# 中的 Label 之后未分配字符串
- javascript - 使用 javascript 使 html 页面中的文本变为粗体
- javascript - JavaScript 说 10 低于 9
- python - Python“尝试除外”阻止继续使用普通代码
- java - 给定 IP 的 Spring Security 自动授权
- c# - 将 ASP.NET MVC 应用程序部署到服务器后的水晶报表问题
- spring - 无法在 eclipse photon 中创建 maven 项目
- matlab - 如何在 MATLAB 中更改 RGB 图像的像素值?
- vba - 我需要实现什么接口以允许在用 delphi 编写的 COM 对象上在 VBA 中使用 ForEach?
- bash - 是否可以在 Makefile 中设置环境变量 - 之后使用