手写协议之内存控制模块
hello,大家好,这里是追風者频道。今天我们来聊一下手写协议的内存控制模块。内存控制模块,是整个手写协议的基础,它的作用是在网卡、消息队列等需要短暂存储数据时,开辟内存空间,来存放数据。
内存控制主要分为内存申请和内存释放两个接口。
内存申请
内存分配模块是通过分配链表元素来进行分配内存的,每个元素可以有固定大小的内存。下图为逻辑结构,stat 表示该结构体的起始内存地址,locker 标识进行上锁的类型且内置了 mutex 信号量来实现锁,alloc_sem 是通过信号量来进行线程同步。
内存管理结构体 mblock_t 在初始化时,会将固定大小的连续的内存块按照链表形式链接起来,构建物理内存中的 free_list。
内存分配模块通过锁来进行线程同步,线程申请内存时,首先判断是否有内存可以分配,然后再看能否获取到锁。下图为内存分配的流程图。
内存释放
内存释放就直接将线程占用的内存块,内部清零,而后插入到链表中即可(由于我们操作链表时,控制了链表大小,所以我们能够使用到的内存,一直都是初始化 mblock_t 时,申请的 free_list 所占用的内存)。
代码实现
net_err_t mblock_init(mblock_t * mblock, void * mem, int blk_size, int cnt, nlocker_type_t locker) {
uint8_t * buf = (uint8_t *)mem;
// 构建 cnt 个,元素大小为 blk_size 的 free_list.
nlist_init(&mblock->free_list);
for(int i=0; i<cnt; i++, buf += blk_size) {
nlist_node_t * block = (nlist_node_t *)buf;