动态内存管理涉及两类重要函数,内存分配函数,内存释放函数,如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等文件。

动态内存堆管理

lwip-动态内存管理的更多相关文章

  1. C++动态内存管理之shared_ptr、unique_ptr

    C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...

  2. uCGUI动态内存管理

    动态内存的堆区 /* 堆区共用体定义 */ typedef union { /* 可以以4字节来访问堆区,也可以以1个字节来访问 */ ]; /* required for proper aligne ...

  3. Keil C动态内存管理机制分析及改进(转)

    源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...

  4. (原创)动态内存管理练习 C++ std::vector<int> 模拟实现

    今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自 ...

  5. FreeRTOS 动态内存管理

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面 ...

  6. C++程序设计入门 引用和动态内存管理学习

    引用: 引用就是另一个变量的别名,通过引用所做的读写操作实际上是作用于原变量上. 由于引用是绑定在一个对象上的,所以定义引用的时候必须初始化. 函数参数:引用传递 1.引用可做函数参数,但调用时只需 ...

  7. 动态内存管理详解:malloc/free/new/delete/brk/mmap

    c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...

  8. oracle结构-内存结构与动态内存管理

    内存结构与动态内存管理 内存是影响数据库性能的重要因素. oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存 ...

  9. 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体

    1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...

  10. 动态内存管理---new&amp;delete

    动态内存管理 动态对象(堆对象)是程序在执行过程中在动态内存中用new运算符创建的对象. 因为是用户自己用new运算符创建的.因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. ...

随机推荐

  1. 受限玻尔兹曼机(Restricted Boltzmann Machine, RBM) 简介

    受限玻尔兹曼机(Restricted Boltzmann Machine,简称RBM)是由Hinton和Sejnowski于1986年提出的一种生成式随机神经网络(generative stochas ...

  2. Window10下安装sbt

    参考:https://segmentfault.com/a/1190000002474507 下载:https://dl.bintray.com/sbt/native-packages/sbt/0.1 ...

  3. VIVADO 入门之仿真与逻辑分析仪使用

    多路分频器设计 在第七节的学习中,笔者带大家通过一个入门必学的流水灯实验实现,快速掌握了VIVADO基于FPGA开发板的基本流程.考虑到很多初学者并没有掌握好Vivado 下FPGA的开发流程,本章开 ...

  4. 200. Spring Boot JNDI:在Tomcat中怎么玩JNDI?

      [视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...

  5. java常见面试题及答案 11-20(JVM)

    11.JVM内存分哪几个区,每个区的作用是什么? Java虚拟机主要分为以下一个区: 方法区:1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区 ...

  6. java判断是否是数字

    1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ ...

  7. 20165304 2017-2018-2《Java程序设计》学习总结

    20165304 2017-2018-2<Java程序设计>学习总结 一.每周作业及实验报告链接汇总 1.我期望的师生关系 2.20165304学习基础和C语言基础调查 3.linux系统 ...

  8. background url base64

    各自含义:data: ----获取数据类型名称image/gif; -----指数据类型名称base64 -----指编码模式AAAAA ------指编码以后的结果. background-imag ...

  9. mysql 索引type介绍

    以下全部详细解析explain各个属性含义: 各属性含义:    id: 查询的序列号    select_type: 查询的类型,主要是区别普通查询和联合查询.子查询之类的复杂查询 SIMPLE:查 ...

  10. Java语法 [HelloWorld]

    程序代码: public class lqx {// AAAAANBBBBCKJKSLJIOQL/*请手打哦!*/ public static void main (String[] args) { ...