正点原子lwIP学习笔记——网络数据包管理
TCP/IP作为一种数据通信机制,其协议栈的实现本质上是对数据包的处理。为了实现高效率的处理,lwIP数据包管理提供了一种高效的机制。协议栈各层能够灵活处理数据包,同时减少数据在各层间传递时的底部指标源码大全时间和空间开销,这是提高协议栈工作效率的关键。在lwIP中,这种机制被称为pbuf。
用户的数据经过申请pbuf,拷贝到pbuf结构的内存堆中。在应用层,数据的前面加上应用层首部,在传输层加上传输层首部,魔力赏源码开发最后在网络层加上网络层首部。
pbuf用于lwIP各层间数据传递,避免各层拷贝数据!
lwIP与标准TCP/IP协议栈的区别在于,lwIP是一种模糊分层的TCP/IP协议,大大提高了数据传输效率!
这是定义在pbuf.h中的关键结构体pbuf。通过指针next构建出了一个数据包的单向链表;payload指向的是现在这个结构体所存储的数据区域;tot_len是所有的数据长度,包括当前pbuf和后续所有pbuf;而len就是指当前pbuf的长度;type_internal有四种类型;ref代表当前pbuf被引用的次数。
右边展示的pbuf_layer就是用来首部地址偏移,用来对应相应的结构体。
PBUF_RAM采用内存堆,长度不定,直播源码录制app一般用在传输数据;PBUF_POOL采用内存池,固定大小的内存块,所以分配速度快(一般字节,就是分配3个PBUF_POOL的内存池),一般用在中断服务中;PBUF_ROM和PBUF_REF都是内存池形式,而且只有pbuf没有数据区域,数据都是直接指向了内存区(PBUF_ROM指向ROM中,PBUF_REF指向RAM中)。
左边第一幅对应PBUF_RAM;中间两幅对应PBUF_POOL;最后一幅对应PBUF_ROM和PBUF_REF。
其中PBUF_RAM和PBUF_POOL相对更为常用。
更多的函数,都可以在pbuf.c和.h中找到。pbuf_alloc()如果是dic应变云图源码PBUF_REF或者是PBUF_ROM,就会如上图所示,创建一个结构体指针p,然后会进入pbuf_alloc_reference;该函数中,会申请一个pbuf结构体大小的内存;然后调用pbuf_init_alloced_pbuf进行初始化,初始化可以如上图所示。
如果是PBUF_POOL,会定义q和last两个pbuf结构体指针,q和last都初始化为NULL,rem_len(剩余长度)初始化为(用户指定需要构建的长度);然后q会经过内存申请,qlen则是去rem_len和当前可申请的数据大小(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset))取小值,然后同样经过pbuf_init_alloced_pbuf初始化q中的pbuf结构体;然后会把offset清零,就是说之后的pbuf都没有offset了,只有第一个链表的外卖侠源码授权元素有offset;经过if判断并判断rem_len的大小,只要还有剩余就会回去循环继续执行上述操作,直到完成3个内存块的初始化。
首先会计算payload_len和alloc_len,如果是传输数据,那么LWIP_MEM_ALIGN_SIZE(offset)就是,计算得到payload_len=,alloc_len=;然后进入判断payload和alloc的长度是否
进入判断p是否为空,不为空证明还没有释放;进入while语句,每一次都--ref(引用次数);然后类似链表删除,调用相应的pbuf类型的内存释放(内存堆或者内存池),直到p全部被释放。源码如下:
这个就要看你使用的是什么类型,然后会根据类型来决定payload_len的大小,进行相应的payload指针指向数据区前的首部字段。
这一章主要讲述了lwIP中重要的pbuf缓冲,具体有哪些数据构成,为之后的学习奠定基础,确定了pbuf除了所需传输的数据,还有哪些变量需要添加,如何申请对应的pbuf内存大小,以及对应的内存堆和内存池。
newåalloc initçåºå«ä»¥ååèªç好å¤ï¼
å ¶å®å¨ä»¥åï¼å°±æ¸æ¸çä½¿ç¨ [[className alloc] init]ï¼èæ ¹æ¬ä¸å»ç¨ [className new]ï¼äºï¼è¿ä¸¤è åºæ¬çåãå¯ä»¥å»æ¥ä¸ä¸æºç ï¼åºå«åªå¨äºallocåé å åçæ¶å使ç¨äºzoneï¼zoneæ¯ç»å¯¹è±¡åé å åçæ¶åï¼æå ³èç对象åé å°ä¸ä¸ªç¸é»çå ååºåå ï¼ä»¥ä¾¿äºè°ç¨æ¶æ¶èå¾å°ç代价ï¼æåäºç¨åºå¤çé度ãèä¸è¯è¯´åæ¥ï¼åå§åçæ¹å¼å¹¶ä¸æ¯åªæinitä¸ç§ï¼ç¨newçè¯å±éäºinitä¸ç§æ¹æ³ã
ios开发之Alloc底层原理探究
探索iOS开发中的内存分配奥秘:Alloc底层剖析 在Objective-C的世界里,对象的诞生始于"alloc"这简单的四个字符。当我们在代码中写下School *s1 = [School alloc];,其实触发了一场内存管理的精密舞蹈。这一切的核心,隐藏在NSObject.mm源码的深处,特别是object_alloc到alloc..._class_createInstanceFromZone的路径。 首先,实例化过程中的关键步骤是计算内存需求。通过调用cls->instanceSize或fastInstanceSize,我们确定了对象所需的内存容量。但这并不止于此,flags和mask这两个术语如同调色板上的调和剂,通过逻辑运算(size=_flags & MASK),确保了字节的内存对齐,这是内存管理中不可或缺的细节。 接下来,calloc的介入更为微妙。segregated_size_to_fit函数在这个阶段发挥作用,它会根据对象的实际需求动态调整内存大小,以达到最佳性能和内存利用率。这一步,关乎着内存分配的灵活性与效率。 最后,initInstanceIsa函数成为舞台的焦点,它负责处理isa_t结构,这是一个8字节的基石,承载着类信息、引用计数、关联对象以及C++扩展的标志。其内部的复杂逻辑和架构差异处理,确保了每个对象都能在其所属的世界中正确地初始化和运行。 这一切的背后,isa结构扮演着核心角色,它是一个动态的链接,连接着对象的类标识和内存管理。内存分配的整个流程,从isa的初始化到对象的实例化,无不体现出算法的智慧、内存缓存的策略,以及逻辑运算的精细掌控。 总的来说,alloc的底层原理并非简单地分配内存,而是一场精心编排的内存管理交响曲,体现了iOS开发中对于性能和内存管理的深刻理解。每一步都关乎对象的生存和性能,让我们对iOS开发的内存管理有了更深一层的认识。ios newåallocçåºå«
1.å¨å®é å¼åä¸å¾å°ä¼ç¨å°newï¼ä¸è¬å建对象å±ä»¬çå°çå ¨æ¯[[className alloc] init]
ä½æ¯å¹¶ä¸æå³çä½ ä¸ä¼æ¥è§¦å°newï¼å¨ä¸äºä»£ç ä¸è¿æ¯ä¼çå°[className new]ï¼
è¿æå»é¢è¯çæ¶åï¼ä¹å¾å¯è½è¢«é®å°è¿ä¸ªé®é¢ã
2.é£ä¹ï¼ä»ä»¬ä¸¤è ä¹é´å°åºæä»ä¹åºå«å¢
æ们çæºç ï¼
+ new { id newObject = (*_alloc)((Class)self, 0); Class metaClass = self->isa; if (class_getVersion(metaClass) > 1) return [newObject init]; else return newObject; } //è alloc/init åè¿æ ·ï¼ + alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); } - init { return self; }
éè¿æºç ä¸æ们åç°ï¼[className new]åºæ¬çåäº[[className alloc] init]ï¼
åºå«åªå¨äºallocåé å åçæ¶å使ç¨äºzone.
è¿ä¸ªzoneæ¯ä¸ªä»ä¹ä¸ä¸å¢ï¼
å®æ¯ç»å¯¹è±¡åé å åçæ¶åï¼æå ³èç对象åé å°ä¸ä¸ªç¸é»çå ååºåå ï¼ä»¥ä¾¿äºè°ç¨æ¶æ¶èå¾å°ç代价ï¼æåäºç¨åºå¤çé度ï¼
3.è为ä»ä¹ä¸æ¨è使ç¨newï¼
ä¸ç¥å¤§å®¶åç°äºæ²¡æï¼å¦æ使ç¨newçè¯ï¼åå§åæ¹æ³è¢«åºå®æ»åªè½è°ç¨init.
èä½ æ³è°ç¨initXXXæä¹åï¼æ²¡é¨å¿ï¼æ®è¯´æåç设计æ¯å®å ¨åé´Smalltalkè¯æ³æ¥çã
ä¼ è¯´é£ä¸ªæ¶åå·²ç»æallocFromZone:è¿ä¸ªæ¹æ³ï¼
ä½æ¯è¿ä¸ªæ¹æ³éè¦ä¼ 个åæ°id myCompanion = [[TheClass allocFromZone:[self zone]] init];
è¿ä¸ªæ¹æ³åä¸é¢è¿æ ·ï¼
+ allocFromZone:(void *) z { return (*_zoneAlloc)((Class)self, 0, z); } //åæ¥ç®å为ä¸é¢è¿ä¸ªï¼ + alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); }
ä½æ¯ï¼åºç°ä¸ªé®é¢ï¼è¿ä¸ªæ¹æ³åªæ¯ç»å¯¹è±¡åé äºå åï¼å¹¶æ²¡æåå§åå®ä¾åéã
æ¯ä¸æ¯ååå°newé£æ ·çå¤çæ¹å¼ï¼å¨æ¹æ³å é¨éå¼è°ç¨initæ¹æ³å¢ï¼
åæ¥åç°âæ¾ç¤ºè°ç¨æ»æ¯éå¼è°ç¨è¦å¥½âï¼æ以åæ¥å°±æ两个æ¹æ³åå¼äºã
æ¦æ¬æ¥è¯´ï¼newåalloc/initå¨åè½ä¸å ä¹æ¯ä¸è´çï¼åé å å并å®æåå§åã
å·®å«å¨äºï¼éç¨newçæ¹å¼åªè½éç¨é»è®¤çinitæ¹æ³å®æåå§åï¼
éç¨allocçæ¹å¼å¯ä»¥ç¨å ¶ä»å®å¶çåå§åæ¹æ³ã
alloc initånewçåºå«
æ¬ç¯æç« éç¨çæºç æ¯ objc4-çæ¬
éè¿ new æ¹æ³å建çå®ä¾ä¼è°ç¨ init æ¹æ³ï¼é£ä¹ [Class alloc] init] å [Class new] è¿ä¸¤ç§æ¹æ³çå¯ä¸åºå«å°±å¨äºåé å åè¿ä¸æ¥ï¼æ们å¯ä»¥å æ¾å° _objc_rootAlloc çå®ç°å½æ°
ä¸å¾ä¸ callAlloc è¿ä¸ªå½æ°ä¹æ¯ new æ¹æ³éé¢è°ç¨çå½æ°ã
ä¸é¢æ¯ callAlloc çæºç
å°±æ¯ allocWithZone åæ°äºï¼ä» alloc é£éçæ¶å为 true ï¼
new è¿æ¥çæ¶å为é»è®¤å¼ false ï¼
ä»æ´ä¸ª callAlloc ç¨å° allocWihZone åæ°çå°æ¹å°±å¨äºæåå è¡ã
å¦æ allocWithZone 为çåä¼èµ° [cls allocWithZone:nil] ï¼åä¹åèµ° [cls alloc]
[Class new] å°±ç¸å½äºè°ç¨ [[Class alloc] init] ï¼ä¸ä¸ªä¸ºéå¼è°ç¨ï¼ä¸ä¸ªä¸ºæ¾ç¤ºè°ç¨èå·²ãå¯ä»¥ç解为 new 为ä¸ä¸ªå¿«æ·é®
2024-11-23 11:27
2024-11-23 10:24
2024-11-23 10:19
2024-11-23 09:48
2024-11-23 09:44