手写协议之内存控制模块

本文介绍了手写协议中的内存控制模块,包括内存申请和释放。内存申请通过链表元素分配内存,并使用锁和信号量进行线程同步;内存释放则将内存清零后放回链表。该模块为数据存储提供基础。
摘要由CSDN通过智能技术生成

手写协议之内存控制模块

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;
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值