如何创建平台库——封装内存管理子系统

本文探讨了为何需要为上层应用建立自己的平台而非直接使用操作系统提供的平台,并以内存管理子系统为例,介绍了如何封装底层系统以提供更加稳定、高效及易于调试的应用平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  摘要

我们为什么要给上层应用提供一个自己的平台,而不直接利用已有的操作系统及其附属开发库提供的开发平台呢?这是不是多此一举呢?如果真的需要,那么这些平台又能提供什么样的功能呢?

这篇文章降带你领略向上层应用提供自己平台的方法以及提供自己平台的好处。

2.  效益

为了引起读者的兴趣,我们先来说说自己的平台可以为我们带来哪些可见的效益。

首先,现在的操作系统,特别是嵌入式操作系统,种类不能说繁多,但也给我们提供了许多可选的余地。就是因为有了选择,我们的应用就有可能从一个平台移植到另一个平台,以使我们的应用更加具有效率或者具有更好的安全性。为了减少这种移植的工作量,我们应该为我们的应用提供一个底层的平台库,以屏蔽操作系统提供的底层开发平台。

但是,也许有人说我的应用根本不需要进行移植,它肯定只运行在Linux或者Vxwork上,那么是不是就不需要自己的支持平台呢? 如果我们要使用某个操作系统更新的版本或者为了需要,我们使用一个更低版本的系统,我们可能也需要更改上层应用的某些接口,如果我们有自己的平台封装,那么我们可以很容易适应这些更改,而如果我们没有,那么也许我们遇到了麻烦。

其次,提供自己的支持平台,我们可以为我们的应用提供更加丰富的调试手段。

比如,在平台中,封装了底层的动态内存分配机制,我们就可以为我们的应用提供内存泄漏、内存越界、内存块的重复释放的检测功能。

再次,提供自己的支持平台,我们可以为应用提供更具有效率(针对我们应用进行的优化)的系统操作。

比如,我们系统中有很多的小内存分配需求,那么我们就可以用一定的手段来优化这些操作,而使系统运行得更快,并且可以节省不少内存空间,以及减少内存碎片的产生。

有了这些明显的利益,我想我们应该有理由去创建一个我们自己的平台库,而不是直接利用操作系统提供的开发平台了。为了有的放矢,我们仅以内存管理子系统为例,说明如何封装底层系统,并提供自己的应用平台。 

 

3.      内存管理子系统的封装

内存管理,是每个应用都必须要面对的问题,特别是那些使用C/C++的应用,因为它们为我们使用内存提供了完全的控制权,这也许是好事,但是,它也带来了问题,那就是内存管理的非自动化,导致在许多应用中,大部分的BUG都是由于内存使用的不当而引起的。那么我们可不可以使用一些简单的方法来对这些内存使用不当进行检测呢?答案是有,下面我们就将详细叙述实现方案。

也许有人会说,如果在C++中,我们可以使用smart pointer或者GC,但是如果使用它们,我们将会改变我们在C/C++中使用内存的习惯,这对许多不熟悉的人来说,是不可接受的,更甚的,在C语言中,并没有它们的存在。所以我们有必要实现自己的检测方案。

也许会有人说,我们用内存泄漏的检测工具去检测内存泄漏就是了,干嘛要自己提供?如果你实现的仅仅是一个小的应用,这个应用只有一两个进程,那么你说的这种方案是可行的。但是,如果你的系统有几十个应用,或者你系统运行的平台没有工具的支持,那么我们应该怎么做呢?

 

1)   替换接口

我们可以把我们自己的平台实现看成是一个适配器,用来保护变化的底层库;但同时它又不仅仅是一个适配器,因为它还要针对特定的使用,做一些本地优化。所以,我们首先就是向外提供自己的接口,把底层的接口函数封装起来。

我们为应用提供两个文件,mms.c, mms.h。并在mms.h中导出内存管理子平台的接口:my_malloc, my_free, my_realloc

这些接口可以做如下定义:

if defined(__MMS_DEBUG__)

 

   #define my_malloc(size_t)   __mms_malloc(size_t, const char* file, const char* function, const int line);

 

   #define my_realloc(void *, size_t new_size); __mms_realloc(void *, size_t new_size, const char* file, const char *function, const int line);

 

#else

   #define my_malloc(size_t)   __mms_malloc(size_t);

   #define my_realloc(void*, size_t new_size) __mms_realloc(void*, size_t new_size);

#endif

 

Void my_free(void *);

然后,使我们应用中的每个.c文件都包含mms.h,并且所有的内存操作都使用我们自己的接口。

2)   内部实现

我们将在mms.c中实现我们内部的接口:__mms_malloc, __mms_realloc, __mms_realloc

在实现时,我们需要使用如下技巧。为了给上层应用提供一些调试手段和一些统计信息,我们需要保存信息的空间,这些空间就在每个分配给上层应用的内存块中。

比如:

我们定义需要放在数据块的头和尾的数据结构(根据你自己的需求,可以定义不同的结构,来提供不同的信息)

Typedef struct {

Struct list_header     mms_list;      //用双向链表把所有的内存块连接起来

 

 

 

待续......

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值