[ndnSIM]服务器剩余资源评估实现

这个主要在ndn-producer.cpp下实现,在OnInterest函数中进行代码构建。当接收到兴趣包时将兴趣包数据存入等待队列中,当其执行队列任务为可满足的情况时,将其从等待队列中转移到执行队列中;当执行队列中的任务完成后,放入发送队列,当所有判定结束后,通过原本的执行方法将数据包构建发出。

1.头文件及变量导入

在头部将头文件导入,如下所示:

#include <ndn-cxx/lp/tags.hpp>
#include <memory>
#include <fstream>
#include <iostream>
#include <ctime>
#include <list> 

其中,结构体“node”用于定义兴趣包的信息字段;“std::list<node>”实现node类型的队列,用于存储兴趣包;由于本次实验的Pro定义为3个,如有其他需求可以进行修改;其他的变量如注释所示。

struct node{
  Name name;         //兴趣包名字
  int frequency;     //该任务所需计算资源
  int arr_num;       //到达时兴趣包的数量
  int node;          //所在Pro节点数
}; 

int rec_num=0;   //统计Pro接收到的兴趣包数量
int node_num;    //当前Pro节点标记

double t=0;      //当前仿真时间
double value0=0; //节点0的剩余资源
double value1=0; //节点1的剩余资源
double value2=0; //节点2的剩余资源

std::list<node> execute;  //执行队列 
std::list<node> waits;    //等待队列
std::list<node> send;     //发送队列

std::list<node>::iterator iter;   //node类型迭代其,用于遍历队列

2.代码实现

所有代码在,OnInterest中实现,如图下所示:

void
Producer::OnInterest(shared_ptr<const Interest> interest)
{
  App::OnInterest(interest); // tracing inside

  NS_LOG_FUNCTION(this << interest);

  if (!m_active)
    return;
 。。。。。。

当接收到兴趣包时,首先进行时间判定,由于不同的Pro接收时都在此函数内实现,不同Pro接收的兴趣包数量不同,通过此方法将兴趣包数量更正。

  /*时间判定*/
  double now =ns3::Simulator::Now().GetSeconds();
  if(t!=now){
    rec_num++;
    t=now;
  }

将兴趣包的信息通过结构体node将兴趣包信息设置完成,推入等待队列中。

  /*设置兴趣包信息*/
  node_num=ns3::Simulator::GetContext();
  Name dataName(interest->getName());
  node xx;
  int f=interest->getName().at(-2).toSequenceNumber();
  if(f<0)
    f=1;
  xx.name=dataName;
  xx.frequency=f;
  xx.node = node_num;
  xx.arr_num=rec_num;
  waits.push_front(xx); 

通过遍历执行队列,计算到达时节点数与当前节点数判断该任务是否完成,然后将执行完成的任务推出,放入发送队列中。

  /*将执行完成的任务推出队列*/
  for (iter = execute.begin(); iter != execute.end();){
    if((*iter).frequency<=rec_num-(*iter).arr_num){
      node p =(*iter);
      send.push_front(p);
      iter=execute.erase(iter);
    }
    else{
       ++iter;
    }
  }

将所有执行后的任务判定完之后,通过对不同节点标记的任务计算进行统计,获取节点的资源;需要注意的是,本次实验的拓扑中,Pro的标记为0、1、2,针对不同实验需要进行修改。

  /*计算当前已用资源*/
  int p_value0=0;
  int p_value1=0;
  int p_value2=0;
    for (iter = execute.begin(); iter != execute.end(); ++iter){
      if ((*iter).node==0)
      {
        p_value0=p_value0+(*iter).frequency;
      }
      if ((*iter).node==1)
      {
        p_value1=p_value1+(*iter).frequency;
      }
      if ((*iter).node==2)
      {
        p_value2=p_value2+(*iter).frequency;
      }
  }

通过遍历等待队列,将任务计算资源合适的推入执行队列,将其从等待队列删除。

for (iter = waits.begin(); iter != waits.end(); ){
      if ((*iter).node==0)
      {
        if ((*iter).frequency+p_value0<=40)
        {
          p_value0=p_value0+(*iter).frequency;
          node s=(*iter);
          execute.push_front(s); 
          iter=waits.erase(iter);
        }
        else{
          ++iter;
        }
      }
     if ((*iter).node==1)
      {
        if ((*iter).frequency+p_value1<=40)
        {
          p_value1=p_value1+(*iter).frequency;
          node s=(*iter);
          execute.push_front(s); 
          iter=waits.erase(iter);
        }
        else{
          ++iter;
        }
      }
        if ((*iter).node==2)
      {
        if ((*iter).frequency+p_value2<=40)
        {
          p_value2=p_value2+(*iter).frequency;
          node s=(*iter);
          execute.push_front(s); 
          iter=waits.erase(iter);
        }
        else{
          ++iter;
        }
      }
  }

计算剩余资源,并将其导出,便于后期分析

double Surplus_resources0;
double Surplus_resources1;
double Surplus_resources2;
Surplus_resources0=double((40-p_value0)/40.0);
Surplus_resources1=double((40-p_value1)/40.0);
Surplus_resources2=double((40-p_value2)/40.0);
Surplus_resources0=Surplus_resources0*100;
Surplus_resources1=Surplus_resources1*100;
Surplus_resources2=Surplus_resources2*100;
   std::ofstream out("jisuan.txt",std::ios::app);
            if (out.is_open())
            {
            out <<0<<'\t'<<Surplus_resources0<<'\n';
            out <<1<<'\t'<<Surplus_resources1<<'\n';
            out <<2<<'\t'<<Surplus_resources2<<'\n';
            out.close();
            }

在最后通过遍历发送队列将data数据包构建发送出去,同时通过setTag方法将Pro的剩余资源发送给router。

 for (iter = send.begin(); iter != send.end(); ){
  auto data = make_shared<Data>();
  data->setName((*iter).name);
  data->setFreshnessPeriod(::ndn::time::milliseconds(m_freshness.GetMilliSeconds()));
  data->setContent(make_shared< ::ndn::Buffer>(m_virtualPayloadSize));
  data->setSource(100);
  //使用setTag()方法加入LcdInsertTag,并且Tag的数值设置为2.
  if ((*iter).node==0)
  {
      data->setTag(make_shared<lp::LcdInsertTag>(Surplus_resources0));
  }
if ((*iter).node==1)
  {
      data->setTag(make_shared<lp::LcdInsertTag>(Surplus_resources1));
  }
  if ((*iter).node==2)
  {
      data->setTag(make_shared<lp::LcdInsertTag>(Surplus_resources2));
  }
 // std::cout<<"ss"<<data->getTag<lp::LcdInsertTag>()->get()<<std::endl;

  Signature signature;
  SignatureInfo signatureInfo(static_cast< ::ndn::tlv::SignatureTypeValue>(255));

  if (m_keyLocator.size() > 0) {
    signatureInfo.setKeyLocator(m_keyLocator);
  }

  signature.setInfo(signatureInfo);
  signature.setValue(::ndn::makeNonNegativeIntegerBlock(::ndn::tlv::SignatureValue, m_signature));
  data->setSignature(signature);

  NS_LOG_INFO("node(" << GetNode()->GetId() << ") responding with Data: " << data->getName());

  // to create real wire encoding
  data->wireEncode();

  m_transmittedDatas(data, this, m_face);
  m_appLink->onReceiveData(*data);
  iter=send.erase(iter);
 }

也可以通过setSource将其剩余资源嵌入数据包中。

  if ((*iter).node==0)
  {
      data->setSource(Surplus_resources0);
  }
if ((*iter).node==1)
  {
      data->setSource(Surplus_resources1);
  }
  if ((*iter).node==2)
  {
      data->setSource(Surplus_resources2);
  }

3.验证

暂时不想写,请自行验证

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇