分配内存字节池 tx_byta.c

该博客详细介绍了内存管理函数_tx_byte_allocate_的工作流程,包括线程安全的内存分配、字节对齐、中断处理以及在内存不足时的等待选项。当内存不足时,线程可以选择挂起等待其他线程释放内存,或者立即返回TX_NO_MEMORY。此过程涉及到线程状态管理、内存池所有权和内存分配策略。

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

UINT  _tx_byte_allocate(

        //指向之前创建的内存块池的指针

        TX_BYTE_POOL *pool_ptr,

        // 指向目标内存指针的指针。 成功分配时,已分配内存区域的地址位于此参数所指向的位置

        VOID **memory_ptr

        //请求的字节数

        ULONG memory_size,  

        //定义此服务在没有足够内存可用时的行为方式

        ULONG wait_option);

局部变量:

        


流程:

1.thread_ptr记录申请内存分配的当前线程

2.计算申请内存大小,4字节对齐

3.禁止中断

4.循环操作 //当内存申请失败或内存池拥有者不再是当前线程时,退出循环

        (1) 标记内存池拥有者为当前线程

        (2) 恢复中断 //后面的操作可能被高优先级打断,高优先级线程也可能在这个内存池申请分配内存

        (3) 当前线程搜寻自由内存,work_ptr存储返回的内存地址

        (4) 禁止中断

        这个线程恢复后,循环继续,再次尝试内存申请

5.如果申请到了内存,memory_ptr指向返回的内存地址,修改状态为成功

6.如果内存不够申请失败

        (1) 若wait_option不为0,挂起线程到suspension list,等其他线程释放内存后,在tx_byte_release中重新申请内存,恢复线程

                1) 挂起线程

                2) 记录内存池控制块指针

                3) 记录需要申请分配内存大小

                4) 挂起到suspension list,按照fifo

                5) suspended count++

                6) 修改状态为TX_BYTE_MEMORY

                7) 设置suspending flag

                8) 禁止抢占

                9) 保存timeout

                10) 恢复中断

                11) 若wait_option有值,,开启定时器,定时器超时会清楚申请内存相关操作,并返回失败

                12) 调用线程挂起函数

                13) 返回线程状态

        (2) 若wait_option为0,返回TX_NO_MEMORY

7.恢复中断

8.返回线程状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值