谈谈 eMule 中的 内存管理器类 CMemPoolMgr

科技中介服务机构如何利用数智工具提升服务效率?.docx 科技中介服务机构如何利用数智工具提升服务效率? 立即下载

 1、内存管理器类CMemPoolMgr有一个成员m_MemoryUnitList,我们称作内存单元链表,每一个内存单元对象对应着一个正在下载的文件所使用的内存池(CMemPool)列表。当eMule客户端接收到其他客户端发来的文件数据时,内存管理器对象m_pMemoryPool,调用函数GetMemory()来分配内存。我们来看看GetMemory()
 TByte* CMemPoolMgr::GetMemory(CPartFile* pPartFile, unsigned int size)
 {
  TByte* pData;

  CMemoryUnit *pMemoryUnit = NULL;

  // 首先检查内存单元链表中有没有pPartFile,
  POSITION pos2, pos1 = m_MemoryUnitList.GetTailPosition();

  //从后往前查找
  for (; (pos2 = pos1) != NULL;)
  {
   m_MemoryUnitList.GetPrev(pos1);

   if (m_MemoryUnitList.GetAt(pos2)->GetPartFile() == pPartFile)
   {
    pMemoryUnit = m_MemoryUnitList.GetAt(pos2);
    break;
   }
  }

  if (pMemoryUnit) //找到该文件对应的内存单元
  {
   //检查该内存单元的内存池链表中有没有空闲的并且不小于size的内存单元
   if ((pData = pMemoryUnit->GetMemory(size)) != NULL)
   {
    return pData;
   }
   else //没有找到
   {
        //首先在内存管理器中查找有没有空闲内存池
        //如果有,将该空闲内存池加入到该内存单元的内存池链表尾部
       //如果没有,重新申请一段内存,分别加入内存管理器和该内存单元的内存池链表尾部
       CMemPool * pMemPool = GetMemPool(pMemoryUnit, m_nPoolUnitSize);
       //返回查找到的或申请的内存
       return pMemPool->GetMemory(size);
   }
  }
  else //没有找到
  {
   //重新申请一个内存单元
   pMemoryUnit = new CMemoryUnit(this, pPartFile);
   //加入到内存管理器的内存单元链表尾部
   m_MemoryUnitList.AddTail(pMemoryUnit);
   
   //同上
   CMemPool * pMemPool = GetMemPool(pMemoryUnit, m_nPoolUnitSize);
   return pMemPool->GetMemory(size);
  }
 }

2、再来看看内存池类CMemPool
   内存池对象又若干个(默认是1M)大小相等的内存块(默认是11K)组成,其在构造函数中调用InitMemPool()完成内存分配。
 void CMemPool::InitMemPool()
 {
  try
  {
   unsigned int blocksize = CalcBlockSize(m_nPoolSize);
   PMemoryBlock pMemBlock = new MemoryBlock[blocksize];
   
   //初始化所有内存块对象,加入链表中
   for (unsigned int i = 0; i < blocksize; i++)
   {
    m_MemoryUnitList.AddTail(&pMemBlock[i]);
   }
 
   //申请内存
   m_pPoolEntry = (TByte*) new TByte[m_nPoolSize];
   POSITION pos2, pos1 = m_MemoryUnitList.GetHeadPosition();
   
   //给所有内存块对象赋值
   for (unsigned int i = 0; (pos2 = pos1) != NULL; i++)
   {
    m_MemoryUnitList.GetNext(pos1);
    
    //内存块起始地址
    m_MemoryUnitList.GetAt(pos2)->pData      = (TByte*)(m_pPoolEntry + i * m_nBlockUnitSize);
    //该内存块处可用内存大小
    m_MemoryUnitList.GetAt(pos2)->DataSize   = m_nPoolSize - i * m_nBlockUnitSize;
   }
  }
  catch (...)
  {
   // TODO : Catch the Exception of Memory allocation
  }

  //初始化时,指针指向链表头部,标识所有内存可用
  m_CurUnitPos = m_MemoryUnitList.GetHeadPosition();
 }

  当调用GetMemory(int nSize)分配内存时,首先计算要分配的内存块数目,然后从内存块链表的尾部开始查找第一个大于nSize的内存 块对象,如果没有找到,返回NULL标志失败;如果找到,返回该内存块的指针。

 

 

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现) 基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)内容概要:本文档标题为《Plecs全桥LLC谐振变换器仿真模型.txt》,但实际上内容并未围绕Plecs或全桥LLC谐振变换器展开详细论述,而是罗列了大量基于Matlab/Simulink和Python的科研仿真项目标题及相关技术方向,涵盖电力系统、无人机控制、微电网优化、路径规划、状态估计、信号处理、电动汽车调度、电力电子变换器等多个领域。其中包括多种优化算法(如粒子群、遗传算法、NSGA-II)、控制策略(如PID、MPC、滑模控制)、仿真建模(如LLC谐振变换器、DAB变换器、PWM整流器)以及具体应用场景的研究实现。尽管提及“隔离型全桥LLC谐振变换器建模及参数设计资料”,但全文缺乏对该主题的具体描述、模型细节或仿真分析,仅作为条目之一出现。因此,该文档实质是一份科研项目资源清单或代码合集目录,而非针对某一主题的深入文章。; 适合人群:具备一定Matlab/Simulink或Python编程基础,从事电气工程、自动化、控制科学、电力电子、新能源系统等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①为科研工作者提供丰富的课题参考与复现资源,涵盖优化调度、控制系统设计、电力电子仿真等方向;②辅助完成硕士/博士论文、期刊论文复现、课程设计或项目开发,提升研究效率与创新性;③通过已有模型和代码快速搭建仿真平台,聚焦算法改进与性能优化。; 阅读建议:此文档应作为科研资源索引使用,读者可根据自身研究方向筛选相关条目,结合配套代码与参考资料进行深入学习与实践。对于希望研究全桥LLC谐振变换器的用户,需注意本文档未提供完整内容,建议查找标注的“仿真+设计报告+计算书”等附件资源以获取详细信息。 立即下载

相关推荐

高校技术转移办公室在推动成果转化过程中,如何高效完成技术成果的信息整合与价值挖掘.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

DMABuffer剖析

Dma buffer分析

weixin_42136255的博客 9473

高校技术转移办公室人员,如何精准挖掘并分析企业的技术需求?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

flash申请内存失败,导致老化问题解决

正确的分配完内存,可顺利打开相机拍照。FlashRegisterRead申请的内存池组的flag,有概率被异步的TFE修改会导致分配内存失败。可以通过添加标志位bNeedDedicatedBuffers=TRUE,来设置专属内存组。

AuvKaixin的博客 473

隔离型全桥LLC谐振变化器建模及参数设计资料【仿真+设计报告+计算书】

内容概要:本文档是一套关于隔离型全桥LLC谐振变换器的综合性技术资料,系统涵盖了拓扑建模、参数设计、闭环控制策略及仿真验证等关键环节。资料整合了Simulink仿真模型、详细设计报告、Mathcad计算书以及控制算法说明文档,深入探讨了恒压恒流双闭环控制、变频与移相混合控制、软启动机制等核心技术,并提供了多应用场景实例,包括双向全桥LLC、多相交错LLC以及电动汽车V2G系统中的CLLC变换器设计。此外,配套资源还包含了多种先进控制与状态估计算法(如EKF、UKF、PF及其与神经网络融合算法)的Matlab实现代码,强化了科研复现与工程实践能力。; 适合人群:适用于电气工程、电力电子及相关专业的研究生、科研人员,以及从事高频开关电源、新能源变换器开发的工程师;需具备扎实的电路理论基础与一定的仿真软件操作经验。; 使用场景及目标:①支持全桥LLC变换器的高效参数设计与动态性能优化;②服务于高校或企业的科研项目,助力拓扑创新与控制系统开发;③作为毕业设计、学术论文或工业级产品原型开发的重要技术参考,提升系统效率、稳定性和响应速度。; 阅读建议:建议结合Simulink仿真模型与Mathcad计算书同步学习,重点关注谐振元件匹配、控制环路设计与系统稳定性分析,充分利用提供的Matlab/Simulink环境进行仿真调试与二次开发,深化理论认知与实际工程应用的融合。

三相交错并联Buck变换器+低纹波输出+双闭环控制仿真【附参考文献】(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink平台构建的三相交错并联Buck变换器仿真模型,重点实现了低输出纹波特性和双闭环控制策略。通过三相交错并联结构有效抑制输入与输出电流的纹波成分,显著提升电源系统的稳定性和电能质量;控制系统采用电压外环与电流内环相结合的双闭环架构,增强了系统的动态响应能力和抗干扰性能。资源包涵盖完整的Simulink仿真模型、技术说明文档及参考文献,具有较强的工程实践价值,适用于电力电子变换器的科研开发与教学实验。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校本科生、研究生及科研人员,尤其适合从事直流变换器拓扑结构与先进控制策略研究的专业人士,具备电路理论基础和Simulink仿真操作经验者更佳。; 使用场景及目标:①用于高效低纹波DC-DC变换器的拓扑创新与控制算法研究;②支撑科研项目中对多相并联技术与双闭环控制系统的性能验证;③作为课程设计、毕业设计或实验教学的技术范例,帮助深入理解交错并联的工作机理与闭环系统的设计方法。; 阅读建议:建议结合所提供的参考文献系统学习控制策略的理论依据,并动手调整仿真参数以观察系统在不同工况下的动静态响应特性,进一步掌握模型搭建、控制器设计与性能优化的全流程,强化理论与工程实践的融合能力。

C语言自动管理动态分配内存的一种方法

C语言实现自动管理动态分配内存的一种方法,自定义分配内存函数,无需每次都释放。

gwsong52的博客 2493

车辆TBOX科普 第64次 TBOX系统集成测试与文档编写

汽车电子开发中,TBOX作为核心网关面临独特挑战:需处理多网络接口、满足严苛安全标准并确保10年以上可靠性。项目文档是开发流程的核心资产,必须与编码同步更新,构建从需求到测试的完整闭环。系统集成测试需分层进行,结合硬件在环测试和自动化工具,并严格管理缺陷。文档与测试深度协同,通过追溯矩阵确保每个需求都被覆盖验证。最终交付不仅是软件包,更是一套包含完整验证报告的信任体系。这种严谨的工程纪律,是将代码转化为车规级可靠产品的关键保障。

IT深耕十余载,大道之简 1324

基于C语言的内存池的设计与实现

介绍:       设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,从而减少系统中出现有效空间足够,而无法分配大块连续内存的情况。目标:    此次设计内存池的基本目标,需要满足线程安全性(多线程),适量的内存泄露越界检查,运行效率不太低于malloc/free方式,实现对4-128字节范围内

阿攀的专栏 2242

WSL子系统启动报错 Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE

WSL子系统启动报错 :Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE 于是分析原因,最终发现是Windows功能中的虚拟机平台功能不知道什么时候被取消了。

Linux I Tell U 6万+

易智联LM401模块学习(四)——双串口收发

串口的发送和接受有三种方式,分别是阻塞发送和接收(轮询)、中断方式发送和接收、DMA方式发送和接收。这里我使用阻塞+中断的方式实现双串口通信。简单的串口收发。

weixin_46046597的博客 991

eMule代码分析(2)------内存管理

由于网上一哥们恰好跟我的想法一致,那我这边就借花献佛,直接献上eMule的内存管理分析:(此文属于转载) 1、内存管理器类CMemPoolMgr有一个成员m_MemoryUnitList,我们称作内存单元链表,每一个内存单元对象对应着一个正在下载的文件所使用的内存池(CMemPool)列表。当eMule客户端接收到其他客户端发来的文件数据时,内存管理器对象m_pMemoryPool,调用函数Ge

Aaron的私藏 391

Linux环境下离线升级GCC-9.4.0的完整实践指南

本文详细介绍了在Linux环境下离线升级GCC-9.4.0的完整实践指南,包括准备工作、依赖库安装、编译配置及常见问题解决。特别适用于企业内网或安全要求严格的服务器环境,帮助开发者高效完成GCC离线升级,提升编译性能并支持现代编程语言特性。

weixin_29288313的博客 671

简易C\C++内存池

一个简单C\C++内存池,网址如下:http://www.codeproject.com/Articles/27487/Why-to-use-memory-pool-and-how-to-implement-it,大体思路为:初始化时,分配几十个固定大小的内存块供程序使用,程序需要内存时,直接从内存池中取,释放内存时,内存池回收。该程序的内存分配时这样的,不管分配多大内存,只要内存池中有内存块并且

u014511737的专栏 513

以太网接口及POE设计

PoE标准 Power Over Ethernet 是有源以太网供电的简称 通过Cat-5电缆供电在IEEE 802.3af以太网供电标准中进行了定义。PoE标准以前限制在几瓦以内,但更新的PoE技术可实现更高的功率。例如,PoE+允许每端口功率高达25 W,而PoE++(四 对以太网供电系统)通过使用现有电缆的所有电线允许70 W到100 W的功率。与此PoE标准并行的是ADI公司定义的专有标准 LTPoE++™,该标准定义高达90W的受电设备(PD)功率规范(请参见表1)。 表1. ADI...

u010783226的专栏 1万+

微机原理-基于8086电压报警2.5V仿真系统设计

*单片机设计介绍,微机原理-基于8086电压报警2.5V仿真系统设计。

2201_75940997的博客 1083

内存池(MemPool)技术详解

本文已经迁移到: http://cpp.winxgui.com/cn:dive-into-memory-pool概述内存池(MemPool)技术备受推崇。我用google搜索了下,没有找到比较详细的原理性的文章,故此补充一个。另外,补充了boost::pool组件与经典MemPool的差异。同时也描述了MemPool在sgi-stl/stlport中的运用。 经典的内存池技术 

QBox/Golang/CERL/StdExt/TPL/WinxGui - 许式伟的专栏 3万+

A*搜索算法在三维路径规划(避障)中的MATLAB实现与Python实现

A star algorithmA*搜索算法简介A*搜索算法的Python简化代码MATLAB实现启发函数回溯轨迹RRT算法对比A\*算法在三维路径规划中的一些不足 A*搜索算法简介 A*搜索算法是Greedy Best-First算法的改进,因为Greedy Best-First算法只考虑将预估距离(当前节点到目标点的预估距离)作为遴选开节点集的条件。即: priority=heuristic(goal,next)priority=heuristic(goal, next)priority=heurist

ZYunfei的博客 2万+

用C++实现自己的内存池

打开浏览器,搜索了下内存管理的概念,百度百科中是这样定义的:内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。说到内存,与之紧密相联系的一个概念就是指针。回想起上学那会儿,自己对指针是即喜欢,又害怕。因为学好了指针,就可以学好C,继而学好C++,但面对那些晦涩的概念,和程序运行中一些莫名其妙的指针越界、内存泄露……

Bruce Che 的专栏 1万+

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 511

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

emule文章收集

eMule源代码学习心得 http://www.newsmth.net/pc/pcdoc.php?userid=wolfenstein  eMule源代码解析http://www.yuanma.org/data/2006/1213/article_1943.htm如何在 Visual C++.NET 2003 下编译eMule http://blog.youkuaiyun.com/loleeve/arch

黄楚伟的专栏 1010

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

不只是给面试加分 -- Java WeakReference的理解与使用

前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存...

全是干货 1979

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

boost之内存池使用实例

需要说明的就是初始化的时候指定的是内存池分配内存块的大小,而且内存池是非线程安全的,多线程要加锁 #ifndef BUFFER_POOL_H #define BUFFER_POOL_H #include "boost_comm.h" using namespace boost; namespace seemmo { class buffer_pool { public: buffe

phymat.nico的专栏 1229

c实现的内存池

中间用简单链表就可以,效率不错,分配时比老程的快,没有详细测试。做全局的分配释放函数,可以像sgi stl中那样建16个全局的内存池,释放时还可以提供一个带大小的函数以提高效率。新的block放在链表首部,对连续的new有利,对后new先delete有利。做成环链表的好处是成功回收空间后,让blocklist指向该block,这样下次分配时就不用遍历blocklist了。删除时如果块回收之后全部空

jollyjumper的专栏 803

固定的,高效的内存池实现机器应用

今天整理了一份固定的,高效的内存池,跟大家分享。代码如下:#ifndef __FIXOBJPOOL_H__#define __FIXOBJPOOL_H__//// 高效、固定大小、小数量内存池,思想来自LOKI//#include "stdafx.h"namespace loki{ template  class CFixMemPool {  typedef unsigned short blockcount_type; public:  CFixMemPool()  {   // 空间大小限制   GNA

游戏服务器编程 591
上一篇: eMule中的 CAsyncSocketEx 类
下一篇: 百度笔试题
InsideKernel
博客等级 码龄19年 5粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值