• 嵌入式实时操作系统的设计与开发(任意大小的内存管理)


    任意大小的内存管理是根据用户需要为其分配内存,即用户需要多大内存就通过acoral_malloc2()为之分配多大内存,同时每块分配出去的内存前面都有一个控制块,控制块里记录了该块内存的大小。

    同时未分配出去的内存也有一个控制块,寻找空闲内存块要进行遍历。

    由于分配和回收的顺序和内存大小是没有规律的,如果不断分配和回收后,会将内存分为很多块,产生很多内存碎片。

    任意大小内存的管理机制是:“一分为二”,将一块分为两块,一块分配给用户使用,剩下一块留给后续使用,同时改变大小标志。可见用户不断调用acoral_malloc2()会产生很多内存碎片。

    在这里插入图片描述
    若刚开始内存只有一块,其大小为x1,则全部空闲,当用户调用acoral_malloc2()后,内存分布如图b。这里x1=x2+x3。
    在这里插入图片描述
    当用户多次调用acoral_malloc2()后,内存分布如图c所示,此时有两个空闲的内存块,一块大小128B,另一块大小56B。如果用户预申请80B的内存,则后面那个56B不够,这时就必须从头开始搜索空间,然后一分为二,找到128B。
    从上面可以看出这种分配方式,时间不确定,搜索时间与块的个数、当前内存使用情况有关。

    aCoral内存管理初始化

    在aCoral内存管理机制能正确工作签,需要对其进行初始化,该工作是在启动aCoral时,内核模块acoral_module_init()中进行的,如代码,这里调用了acoral_mem_sys_init()

    void acoral_mem_sys_init()
    {
    	acoral_mem_init((unsigned int)&heap_start, (unsigned int)&heap_end); //伙伴系统初始化
    #ifdef CFG_MEM2
    	acoral_mem_init2();
    #endif
    	acora_res_sys_init();//资源池系统初始化
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Flink面试进阶篇
    京东怎么上架产品,定时上下架教程
    3.0、软件测试——测试用例
    云原生 | Docker - [简介、架构、安装、加速]
    大文件怎么实现切片上传?「硬核」
    SMB 协议详解之-NTLM身份认证
    C# TreeView
    使用STM32F103C8T自制freejoy控制板
    笔记本电脑怎么写日记
    LinearLayout:线性布局 水平布局 垂直布局
  • 原文地址:https://blog.csdn.net/Caramel_biscuit/article/details/133969999