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

 由于网上一哥们恰好跟我的想法一致,那我这边就借花献佛,直接献上eMule的内存管理分析:(此文属于转载)

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标志失败;如果找到,返回该内存块的指针。

 

出自: http://blog.csdn.net/insidekernel/article/details/1920327
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: emule0.51d-installer.exe 是一个电脑软件的安装文件,它与 eMule 下载软件相关。eMule 是一个基于 Peer-to-Peer 技术的开源下载软件,允许用户通过网络共享和下载各种类型的文件。emule0.51d-installer.exe 是 eMule 版本 0.51d 的安装程序。安装这个文件后,用户可以使用 eMule 下载平台上的各种资源,如电影、音乐、软件、游戏等。 emule0.51d-installer.exe 安装程序包含了 eMule 下载软件所需的所有文件和组件。安装程序的运行过程中,会提供用户自定义选项,例如选择安装位置和设置配置选项。安装完成后,用户可以在计算机上找到 eMule 的图标,双击即可打开该软件,开始使用 eMule 下载资源。 eMule 作为一款流行的下载软件,具有一些特殊的功能和特点。它采用了多种技术,如分布式文件索引、文件部分下载和源客户端交换,以提高文件的下载速度和稳定性。eMule 还支持自动恢复被中断的下载,保证下载任务的连续性。 总之,emule0.51d-installer.exe 是 eMule 版本 0.51d 的安装程序,用于将 eMule 软件安装到用户的计算机上,供用户下载各种类型的文件并享受高质量的下载体验。 ### 回答2: emule0.51d-installer.exe是一个下载和分享文件的软件安装程序。Emule是一种被广泛使用的文件共享软件,它通过P2P网络,允许用户分享和下载各种类型的文件。通过emule0.51d-installer.exe,用户可以方便地安装并使用Emule软件。 这个安装程序通常是一个可执行文件,用户只需运行它,按照指示进行安装即可。安装程序通常会提供一些选项,供用户选择安装的位置和其他相关设置。安装完成后,用户可以在计算机上找到Emule软件的图标,通过点击它来打开程序。 使用Emule软件,用户可以搜索并下载各种类型的文件,如音乐、电影、软件等。用户可以在Emule网络中搜索文件,找到自己想要的文件后,可以选择下载并共享给其他用户。Emule使用了一种特殊的文件共享协议,称为eDonkey协议,通过这个协议,用户可以相互连接和共享文件。 Emule软件还提供了一些额外的功能,例如支持下载文件的排队、自动恢复下载中断、对下载文件进行验证等。用户也可以通过Emule软件与其他用户交流和分享文件。Emule社区还提供了丰富的资源和论坛,用于用户之间的交流和资源分享。 总之,emule0.51d-installer.exe是一个方便用户安装和使用Emule文件共享软件的安装程序。通过安装Emule软件,用户可以访问广泛的文件资源,方便地下载和分享文件。 ### 回答3: emule0.51d-installer.exe是eMule软件的一个安装程序文件。eMule是一个开源的文件共享软件,可以通过互联网下载和分享各种类型的文件。通过eMule,用户可以连接到eDonkey和Kad网络来进行文件共享和下载。 emule0.51d-installer.exe文件是eMule软件的安装程序,用于安装eMule软件到用户的计算机上。用户需要下载这个文件并运行它,安装过程中会显示一些设置选项,例如选择安装目录、选择语言等。安装完成后,用户可以在计算机上找到eMule的快捷方式,并通过它来启动eMule软件。 安装eMule之后,用户可以通过eMule软件搜索和下载文件。用户可以在eMule界面中输入文件名或关键词来搜索需要的文件,然后选择下载,并等待文件下载完成。eMule软件通过eDonkey和Kad网络连接到其他eMule用户,并从其他用户那里下载文件。同时,用户可以选择共享自己的文件,让其他eMule用户下载。 总之,emule0.51d-installer.exe是安装eMule软件的安装程序文件,通过这个程序可以将eMule安装到计算机上,让用户可以方便地通过eMule软件进行文件的搜索、下载和共享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值