6、缓冲及内存管理

在一个通信系统中,内存缓冲管理系统必须容纳各种大小的缓冲数据,其范围从包含具有数百个字节的数据的全尺寸TCP段到只有几个字节的短ICMP回复包。此外,为了避免拷贝,应该让数据内容缓冲驻留不被网络子系统管理的内存中。例如应用程序内存或或者ROM。

6.1、包缓冲——pbufs

包缓冲是LWIP一个数据包的内存呈现,专门满足特殊需求而设计的最小的堆栈。pbufs类似于BSD实现中使用的mbufs。pbuf结构体支持内存动态分配和静态内存存放包数据。所有pbufs被一起链接到链表中称为pbuf链,一个数据包可以跨越好几pbufs。(一个数据包存放连续的好几个节点中存储)

pbufs有三种类型,分别是PBUF_RAM, PBUF ROM, and PBUF_POOL.图1显示的是PBUF_RAM类型的pbuf,包数据已经存储pbuf子系统管理的内存中了。如下图1所示:

图1

图2表示一个pbuf链的例子,在链中第一个pbuf的类新是PBUF_RAM。第二个是PBUF_ROM类型。这意味着它具有位于内存中的数据而不被pbuf子系统管理。如下图2所示.

图2

第三种类型是PBUF_POOL,如下图3所示,包含在一个固定大小的缓冲池中分配来的固定大小的pbuf,该pbuf链表包含了多种类型的pbuf。

这三种类型有不同的使用者,

PBUF_POOL主要用于网络设备驱动程序,因为可以快速分配单个pbuf,所以适合在中断程序中使用。

PBUF_ROM用于应用程序发送数据,该数据来源由应用程序管理的内存。这些数据在pbuf移交给TCP/TP后不能被修改,因此这种类主要用于数据存储于ROM中。(因此命名为PBUF_ROM).

在PBUF_ROM附加头的数据被存储在PBUF_RAM中,并被连接到PBUF_ROM 的前面如图2所示。

PBUF_RAM类型的pbuf也用于当应用程序发送动态生成的数据时。在这种情况下,pbuf系统不仅仅为应用程序数据分配内存,也为添=付加到该数据的头分配。如图1所示。pbuf系统无法预先知道在这些数据前面会附加哪样的头,以及假定最坏的情况。这些头的大小在编译的时候都是可以配置的。

  本质上,传入进来的pbuf是PBUF_POOL的类型,传出去的pbuf类型是PBUF_ROM或者PBUF_RAM 类型。pbuf的内部结构可以在图1和图3中看到。pbuf结构包含了两个指针,两个长度字段,一个标志字段和一个引用计数。在pbuf链中,next字段是指向下一个pbuf的指针。payload指针指向的是pbuf中数据的起始位置。len字段表示的是在pbuf中数据内容的长度。tot_len字段包含当前pbuf和在pbuf链中所有后续pbuf中len字段总和。换句话说,tot_len字段是len字段和pbuf链中后续pbuf中的len字段值的总和。flags字段表示pbuf的类型,ref字段包含引用计数。 next和payload字段是本机指针,其大小取决于所使用的处理器体系结构。两个length字段是16位无符号整数,flag和ref字段是4位宽。

  pbuf模块提供了操作pbuf的功能。pbuf的分配由函数pbuf_alloc()完成,它可以分配上述三种类型中的任何一种的pbuf。函数pbuf_ref()增加引用计数。通过函数pbuf_free()进行解除分配,它首先减少pbuf的引用计数。如果引用计数达到零,则释放pbuf。 函数pbuf_realloc()缩小了pbuf,使其占用足够的内存来覆盖数据的大小。 函数pbuf_header()调整有效负载指针和长度字段,以便可以将标头添加到pbuf中的数据之前。 函数pbuf_chain()和pbuf_dechain()用于链接pbuf。

6.2内存管理

  支持pbuf方案的内存管理器是非常简单的,它处理分配和释放连续内存区并能缩减之前所分配的内存块的大小。内存管理器使用系统中总内存的专用部分。这样子可以确保网络系统不会使用所有的可以用的内存,且其他应用程序也不会干扰到网络系统已经使用的内存。

  在内存,内存管理器会在每个申请的内存块的顶部放置一个小结构体来跟踪已经分配的内存。这个结构体(图4)保存两个指针next指针和prev,next指向下一个已申请的内存空间,prev指向前一个已申请的内存空间,且使用used标识来指示是否已经分配好了分配块。

  内存分配是通过在存储器中搜索足够大以满足所需要分配的未使用的分配块。使用首次适应原则以便足够大的第一个块被使用。当已分配的块被释放时,used标识被置为0。为了防止碎片,应该要检查下一个和上一个分配块的used标识,如果其中任何一个未使用,则将块组合成一个较大的未使用块。

图4

6、LwIP协议规范翻译——缓冲及内存管理的更多相关文章

  1. 7、LwIP协议规范翻译——网络接口

    7.网络接口 在lwIP中,物理网络硬件设备驱动是由类似于BSD网络接口结构表示.网络接口结构如图5所示.网络接口被保存在一个全局的链表中,通过结构体中的next指针来完成链表的链接. 每个网络接口都 ...

  2. 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理

    [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...

  3. LWIP内存管理

    LWIP是一种TCP/IP协议栈,与嵌入式操作系统一样也提供了内存管理. 内存池里面有多个同样大小的内存,不同类型的内存池其里面的内存大小不一样.

  4. lwIP内存管理机制

    lwip的内存管理机制,我们以enet_lwip这个例程为例. 在使用lwip的时候,我们可以使用两种形式的内存,一种是heap(mem.c文件-mem_malloc()),一种是pool(memp. ...

  5. [翻译]理解Unity的自动内存管理

    当创建对象.字符串或数组时,存储它所需的内存将从称为堆的中央池中分配.当项目不再使用时,它曾经占用的内存可以被回收并用于别的东西.在过去,通常由程序员通过适当的函数调用明确地分配和释放这些堆内存块.如 ...

  6. java Hotspot 内存管理白皮书(中文翻译)

    转自: http://my.oschina.net/u/568779/blog/166891 1引言 一个健壮的 Java™2平台,Standard Edition (J2SE™)拥有一个自动内存管理 ...

  7. Spark 1.6以后的内存管理机制

     Spark 内部管理机制 Spark的内存管理自从1.6开始改变.老的内存管理实现自自staticMemoryManager类,然而现在它被称之为"legacy". " ...

  8. 内存管理单元(MMU)和协处理器CP15介绍(转)

    内存管理单元(MMU)和协处理器CP15介绍内存管理单元(MMU)介绍嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如FLASH,SRAM,SDRAM,ROM等,这些不同类型的存储器件速度 ...

  9. 【转】Android中的内存管理--不错不错,避免使用枚举类型

    原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...

随机推荐

  1. InputStream为什么不能被重复读取?

    最近上传阿里云的时候同一个文件上传两个服务地址,第一个文件读取以后第二个再去读取就拿不到了.代码如下: //内网上传OSS获取key值 String ossKey = OSSClientUtil.ge ...

  2. 物联网架构成长之路(27)-Docker练习之Zookeeper安装

    0. 前言 准备了解一下消息队列MQ,对比了一些开源的中间件,最后选择Kafka作为以后用到的消息队列,消息队列的应用场景及Kafka与其他消息队列的优缺点这里就不细说了,具体的可以参考其他博客说明. ...

  3. 如何关闭windows server2012 80端口

    Windows Server禁用本地端口的两种方法 这篇文章主要介绍了Windows Server 2008 禁用本地端口的两种方法,本文讲解了通过Windows防火墙禁用端口.通过IP安全策略禁用端 ...

  4. 31Spring的一些想法

    看一遍以前的自己写的博客,记录下自己的一些想法,Spring分为两块:IOC和AOP.IOC就是在applicatcontext.xml中配置<<bean......>>这种. ...

  5. Module 10:I/O流(java如何实现与外界数据的交流)

    Module 10:I/O流(java如何实现与外界数据的交流) Input/Output:指跨越出了JVM的边界,与外界数据的源头或者目标数据源进行数据交换.               输出   ...

  6. myeclipse及Eclipse中.classpath、.project、.settings、.mymetadata(myeclipse特有)介绍

    引言 今天在创建java项目的时候遇到了很多的错误,在解决的过程中遇到了一些根本不知道什么作用的文件,然后按照网上的一些做法可以将问题解决,但是这也说明我们在学习的时候很多基础和细节的地方是我们薄弱的 ...

  7. yii2快速導出phpexcel

    https://packagist.org/packages/moonlandsoft/yii2-phpexcel 安装方式:首先是已经安装过Composer,则通过 Composer 下载安装 Mo ...

  8. TCP断线重连

    struct sockaddr_in TempSadd; TempSadd.sin_family = AF_INET; TempSadd.sin_port = htons(m_ServerPort); ...

  9. Webpack+Vue+ES6 前端组件化开发mobile-multi-page应用实战总结和踩坑

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 项目上线有一段时间了,一个基于webpack+vue+ES6的手机端多页面应用 ...

  10. laravel5.8笔记四:中间件

    应用场景:检测登陆,控制器加载数据,传递常量 命令 //中间件创建命令 php artisan make:middleware Check 注意: 1.需要注册中间件 2.中间件命名不能重复   mi ...