⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chttpdatams.cpp

📁 这是cdma2000的一个分组调度算法实例
💻 CPP
字号:
//---------------------说明----------------------------------
//  --------------by  Dou Zhongzhao-------------------------
//  2001.06.13 改进接口的说明:
//  1)改动了PacketCallProcess()函数;
//  2)配合CDataMs,将packet生成时相应的变量进行赋值;
//  3)有关PacketCall吞吐量计算改在CDataMs中进行计算,在我的模块中将原来的
//     有关函数和变量进行了删除;   
//  4)m_bIsInPacketCall改为是否标志着在一个packetcall中(即不是处于packetcall的间隔时间),
//    而是标志packetcall是否传输。
//
//--------------------------------------------------------------

//zdy修改注释及程序 2001/07/30
/////////////////////////////////////////////////////////////////////
////CHttpDataMs类中的函数定义
#include"CHttpDataMs.h"
#include "CMsManager.h"

//***********以下为pulic中的函数的具体实现****************
void CHttpDataMs::HttpInitialization()			
//初始化业务模型函数,并调用下述函数,完成一个packet call的设置
{
	 m_iLabelOfDataTraffic=1;         //初始化业务类型
     m_iPacketSize=m_pMsManager->m_iHttpPacketSize*8;        //单位:bits  乘以8以后
	 m_fAlpha=m_pMsManager->m_fAlpha;
	 m_fK=m_pMsManager->m_fK;
	 m_iMaxDataBitsNum=m_pMsManager->m_iMaxDataBitsNum;
     m_iPacketCallSize=0;     //模拟得到,单位:bit其中alpha=1.1,k=4500bytes,m=2Mbytes
     m_iPacketNumInPacketCall=0;  // m_iPacketCallSize/ m_iPacketSize得到
     m_iPacketGeneratedNum=0;      //已经生成的packet 的数量
	 m_iTimeBeforeNextPacket=0;   //packet的间隔时间,单位:slot
     m_lTimeBeforeNextPacketCall=0; // packet call的间隔时间,单位:slot     
     m_fPacketCallIntervalParameter=5; //packet call 间隔均值,5 seconds=5000ms
     m_fPacketIntervalParameter=6;  //间隔时间参数6ms
     m_bIsInPacketCall=false;      //是否存在packet call,设置为false

}



//-----------CHttpDataMs::PacketCallSizeGenerator()------------

void CHttpDataMs::PacketCallSizeGenerator()      //Pareto with cut-off生成packet call数据量
{
	  //m_iAlpha 和m_fK的初始化应该被定义在MsManager类中,其中
      // m_iAlpha=1.1,m_fK=4.5kbytes, m_iMaxDataBitsNum=2Mbytes

	   ////取pareto分布的随机数赋值给m_iPacketCallSize 
	    m_iPacketCallSize=xPareto(m_fAlpha,m_fK,m_iMaxDataBitsNum);  //单位:byte
        m_iPacketCallSize=m_iPacketCallSize*8;  //单位:bit
        m_bIsInPacketCall=true; //有packet call存在 
}

void CHttpDataMs::PacketNumGenerator()            //根据packet call的数据量和packet的大小计算packet的间隔时间
{
	 //根据packetcall 数据量和packet的大小计算出packet的数量
	if((m_iPacketCallSize%m_iPacketSize)==0)      
        m_iPacketNumInPacketCall=m_iPacketCallSize/m_iPacketSize;
	else 
		m_iPacketNumInPacketCall=m_iPacketCallSize/m_iPacketSize+1;

}

void CHttpDataMs::PacketIntervalGenerator()
//产生packet 的时间间隔
{
	//packet 的间隔时间服从Geometry 分布,而Geometry已经在随机函数库中被定义为一个类,
    //所以可以通过下面的语句实现void PacketIntervalGenerator()             
              
    //取几何分布的随机数赋值给m_iPacketBeforeNextPacket, 单位:slot  
    m_iTimeBeforeNextPacket
		=xGeometry((float)(1.0/5));
	//6.0就是根据以上的那个PacketIntervalCalculate()里的公式直接计算出来的结果。
	//单位:slot

}
void CHttpDataMs::PacketGenerator()
//向数据队列中加入一个packet的数据量,同时生成新的packet的时间间隔,
//并把已生成的packet数量加1
{
      //向数据队列中加入一个packet的数据量,
      //同时调用一次void PacketIntervalGenerator() ------packet 间隔生成函数,
      //并把已生成packet数量------m_iPacketGeneratedNum-------加1。
      //注:数据队列的内容实际上是在class CdataMs中定义的数据量m_lDataQueueSize
      //具体实现程序如下:
	if(m_iPacketNumInPacketCall<=m_iPacketGeneratedNum)
	{
      return;
	}

     m_lDataQueueSize+=m_iPacketSize; 
	 //继承了CdataMs类中的成员m_lDataQueueSize,并将新生成的packet加入队列

     PacketIntervalGenerator();  //调用间隔生成函数
     m_iPacketGeneratedNum++;     //已经生成的packet数量加1
 
}


bool CHttpDataMs::IsPacketCallover() 
//比较packet call中的分组数与已生成的分组数,若相等,
//把m_bIsInPacketCall置为假,并生成packet call间隔时间
{
	 //基本思想:
	 //比较packet call中的分组数m_iPacketNumInPacketCall与已经生成的分组数m_iPacketGeneratedNum, 
     //若相等,把m_bIsInPacketCall置为假,并生成packetcall间隔时间
     // -----利用函数void PacketCallIntervalGenerator()----
     //具体实现程序如下:
      if(m_iPacketNumInPacketCall<=m_iPacketGeneratedNum)//
      {
          m_bIsInPacketCall=false;
          return  true;         //表示packet call生成结束
      }
      else
      {
          m_bIsInPacketCall=true;
          return  false;     //表示packet call生成尚未结束
      }
}

void CHttpDataMs::PacketCallIntervalGenerator()
//生成packet call的间隔时间
{
      //packet call的间隔时间服从Geometry分布,均值u=5 seconds
      //这个均值用m_fPacketCallIntervalParameter表示
      //下面是具体的实现函数
      // m_fPacketCallIntervalParameter u=5seconds 是参数文件里定义的  
              
     m_lTimeBeforeNextPacketCall
		 =xGeometry((float)1.0/m_fPacketCallIntervalParameter)*800;
	 // 单位:slot
}

void CHttpDataMs::PacketCallProcess()
//首先判断是否有packet call在传输,若无则把packet call的间隔时间递减,
//并判断是否到时,若到时,则重新生成packet call。
//若有,则调用packet生成函数,生成新的packet
//同时生成一个packetarrivalmessage的结点插入到链表尾部
{
	

//-------------------------------------------------------------
   if(m_bIsInPacketCall==false)    //判断是否有packet call 存在
	    {
	  
       m_lTimeBeforeNextPacketCall--;
       //间隔时间以时隙为单位,减去一个时隙
	   
      if(m_lTimeBeforeNextPacketCall<=0)  //如果packet call间隔耗尽
        {  
            NewPacketCallSetup();   //重新生成packet call,这个函数的实现在下面
//----------------------------------------------------------------------
// 为了改进数据业务的接口而对程序进行的改动:
			PACKETARRIVALMESSAGE_TYPE *pHttpNewPacketArrivalMessage=new  PACKETARRIVALMESSAGE_TYPE;

			pHttpNewPacketArrivalMessage->iPacketIndex=0;	//m_iPacketGeneratedNum-1=0就表示此packet是所属PC的第一个packet-zdy
			pHttpNewPacketArrivalMessage->iPacketSize=m_iPacketSize;
			pHttpNewPacketArrivalMessage->iTimeOfGeneratePacket=m_pMsManager->m_iSlotCurrentNum;
			pHttpNewPacketArrivalMessage->bIsPacketCallEnd=IsPacketCallover();
			m_PacketArrivalMessageList.AddTail(pHttpNewPacketArrivalMessage);
//-----------------------------------------------------------------------
        }
      else  
           return;//do nothing 
     }
    else 
	{
	
		if(m_iTimeBeforeNextPacket<=0)  // 判断packet是否到达,若不到,间隔减1
		{
			 
	          PacketGenerator();  //调用packet 生成函数:向数据队列中加入一个packet的
                         //数据量,同时生成新的packet的时间间隔,并把已经生成的        
                         //packet数量加1
			  
//---------------------------------------------------------------------------
//改进接口后新加的语句:
///zdy
		     PACKETARRIVALMESSAGE_TYPE *pHttpNewPacketArrivalMessage=new  PACKETARRIVALMESSAGE_TYPE;

			 pHttpNewPacketArrivalMessage->iPacketSize=m_iPacketSize;
			 pHttpNewPacketArrivalMessage->iTimeOfGeneratePacket=m_pMsManager->m_iSlotCurrentNum;
			 pHttpNewPacketArrivalMessage->iPacketIndex=m_iPacketGeneratedNum-1;	//m_iPacketGeneratedNum-1就是packet在所属PC中的序号,zdy
			 pHttpNewPacketArrivalMessage->bIsPacketCallEnd=IsPacketCallover();
			 m_PacketArrivalMessageList.AddTail(pHttpNewPacketArrivalMessage);
//----------------------------------------------------------------------------

			  if(m_iPacketGeneratedNum==m_iPacketNumInPacketCall-1)   //为了正确处理每一个packetcall的最后一个packet的大小,
			 {                                                      //在NewPacketCallSetup中也相应的作了改动,请见这个函数
	        	m_iPacketSize=m_iPacketCallSize-m_iPacketSize*m_iPacketGeneratedNum;
			 }
 			
		}   
		else
			m_iTimeBeforeNextPacket--;  //packet间隔减1
     //------调用IsPacketCallover(),判断packet call是否结束,如果结束,则生成packetcall间隔,
	 //-------如果packet call还没有结束,则结束PacketCallProcess()的调用
		if(IsPacketCallover())
			PacketCallIntervalGenerator();
	}
}

void CHttpDataMs::NewPacketCallSetup()
//重新设置packet的数量,并生成第一个packet
{
      //基本思想:1)调用packet call size 生成函数PacketCallSizeGenerator() ;
      //          2)  调用packet call间隔生成函数PacketCallIntervalGenerator();
      //          
      //          3)  调用packet 生成函数PacketGenerator(),生成第一个packet
                
     //具体实现如下:
        m_iPacketSize=12000;
		//这里又是直接用的数字,最好用数据文件读入的内容
        PacketCallSizeGenerator() ;   //生成packet call的大小
		PacketNumGenerator();           //计算出packet call中的packet的数量,以便在IsPacketCallover()中用来判断
		m_iPacketGeneratedNum=0;      //清零
        PacketGenerator();          //向数据队列中加入一个packet的数据量,同时生成
                              //新的packet的时间间隔,并把已生成packet的数量加1。
		PACKETCALLARRIVALMESSAGE_TYPE *pHttpNewPacketCallArrivalMessage=new  PACKETCALLARRIVALMESSAGE_TYPE;
	
		pHttpNewPacketCallArrivalMessage->iTimeOfPCArrival=m_pMsManager->m_iSlotCurrentNum;
		pHttpNewPacketCallArrivalMessage->lDataBitsOfPC=m_iPacketCallSize;
		m_PacketCallArrivalMessageList.AddTail(pHttpNewPacketCallArrivalMessage);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -