• lwip-动态内存管理


    动态内存管理涉及两类重要函数,内存分配函数,内存释放函数,如C语言中的malloc和free.

      内存分配的本质是:在事先准好一大块内存堆(可以理解为一个很大的数组)中分配合适的空间,然后将该空间起始地址返回给调用者,内核必须采用自己独有的一套数据结构来描述,记录那些空间范围已经被分配(称之为占用块),哪些未用(称之为空闲块),而根据这里采用的机制的不同,就会延伸出多种类型的内存分配策略。  

    常见内存分配策略

    1,系统规定用户在申请内存时,申请大小必须指定为某几个固定值,否则内存分配函数不予分配。称之为动态内存池分配。适用于TCP首部,IP首部。-动态内存池分配

    2,分配策略与第一种很相似,初始化几个固定大小的内存块链表,不同链表的空间大小不一,如申请5个字节时,系统在包含较小字节的链表中去查找空闲空间。

    3,系统运行时,各个空闲块的大小是随着系统运行而改变的,即可变长度内存分配。

    a.首次拟合-动态内存堆分配,分配时查询空闲链表,回收时只用将空闲块插到表头;

    b.最佳拟合,适用于用户请求大小范围较广的系统。分配和回收都需要查找链表,最浪费时间;

    c.最差拟合,适用于用户内存请求大小范围较窄的系统。分配时不需要查找,回收时需要查找空闲链表。

    存储紧缩操作

    动态内存池管理

                                表 6­1 动态内存池管理相关数据结构

    名称 类型 所在文件 描述
    memp_t 枚举型数据类型 memp.h 为每类 POOL 定义一个名称/编号
    memp_tab[] 全局型指针数组 memp.c 指向每类 POOL 中的第一个 POOL
    memp_sizes[] 全局型数组 memp.c 每类 POOL 中单个 POOL 的大小
    memp_num[] 全局型数组 memp.c 每类 POOL POOL 的个数
    memp_desc[] 全局型指针数组 memp.c 指向每类 POOL 的描述字符串
    memp_memory[] 全局型数组 memp.c 为所有 POOL 分配的内存空间

     

    typedef enum {
    #define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name,
    #include "lwip/memp_std.h"
    MEMP_MAX
    } memp_t;
    //为每类POOL定义一个名词/编号

    当memp_std.h编译完后,memp_t就建立起来了,其内容如下:

    typedef enum {
    MEMP_ RAW_PCB,
    MEMP_ UDP_PCB,
    MEMP_ TCP_PCB
    MEMP_ TCP_PCB_LISTEN,
    MEMP_ TCP_SEG,
    ……
    MEMP_MAX
    } memp_t;

    相关定义查看memp_std.h,memp.c等文件。

    动态内存堆管理

  • 相关阅读:
    差分约束
    DevOps系列【centos 7离线安装中文版GitLab】
    Linux系列【硬盘的插入、分区、格式化、挂载】
    并发编程系列【ThreadLocal】
    Linux系列【从一台linux通过ssh登录另一台linux服务器】
    idea系列【配置git忽略文件和目录规则】
    网络编程系列【文件上传(C/S)】
    常见的问题系列【tar: Error is not recoverable: exiting now】
    网络编程系列【TCP通信原理】
    DevOps系列【Jenkinsfile+Dockerfile+nginx+vue】
  • 原文地址:https://www.cnblogs.com/10cm/p/6648172.html
Copyright © 2020-2023  润新知