MonaTiny之分析开篇Memory

         一直打算分析MonaTiny流媒体服务器,只能看一部分记录一部分。MonaServer是一个类似fms,srs,live555一样的流媒体服务器,支持rtmp,rtmpe,http,websocket,rtsp等协议。MonaTiny为MonaServer的简化版本,大体上重构了一遍代码,去掉了lua部分,功能也没有MonaServer丰富,但是一些核心的功能具备。

        MonaTiny代码从项目上分为MonaBase, MonaCore,MonaTiny。我将从分析流的发布及订阅开始阅读,主线之外会涉及到一些辅助代码,这些代码是搭建整个体系的核心,这些核心就在MonaBase和MonaCore中。MonaBase主要提供net,memory,log,time,disk等基础服务器类的实现;MonaCore主要实现容器及协议的操作。

        下面从MonaBase的Memory部分开始,Memory主要是一些内存分配及二进制操作的类,主要有:

Allocator 负责分配和释放内存及一个默认的分配器,派生自Object,Object是一个不能拷贝构造及右值构造的类。

Binary 二进制操作基类,其中重载方法Get7BitValueSize用途暂时不明,以后补充。从函数看是统计有多少个非0的7bit。

BinaryReader 二进制读取器,派生自Binary,主要具备对内存块的读取功能,比如协议中经常用到的Read8 Read24 Read32等并且会根据构造时指定的字节序进行转换。

BinaryWriter 二进制写入器,派生自Binary,是和BinaryReader配合使用的一个类。

Buffer 这个间名之意,派生自Binary,就是通过Allocator申请内存块操作。_offset操作位置,_data数据,_size数据长度,_capacity内存块容量,_buffer指向内存块指针,

这个类_capacity操作怪怪的,我一般设计buffer capacity一般是buffer的容量,所以一般不会变,这里除了扩容,clip也跟着变。

BufferPool 内存池,次类派生自Allocator,主要功能是申请内存块及缓存和释放不超限的内存块。构造的时候回引用到一个定时器,当内存块超过100时会释放超过最大长度的块及最小的100-x个内存块,因为容器multimap有默认根据Key升序排序功能,10s检测一次,能保证不用爆。

BufferPool.allocate查找最大一块合适的内存,如果没有就申请一块新的,返回内存地址及大小。

BufferPool.deallocate 回收内存块。

Byte 字节序转换类,派生自Static,Static为不能构造,拷贝构造,右值构造的类,意味着不能实例化。

Cache 主要实现了双向Buffer链表。

Packet 这个类很重要,后面有大量的数据操作会使用到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值