#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include <winbase.h>
#include <stdio.h>
//#include <stdAfx.h>
//#include <Worker.h>
static int t;
static int flag[20];
static int turn=-1;
struct ID
{
int id;
};
int random(int max)
{
return rand()%(max+1);
}
void wait(int n,int i)
{
int time;
int max;
if(n<10)
{
max=(int)pow(2,n);
time=5*random(max);
}
else
time=5*random(1024);
Sleep(time);
}
bool judge(int i)
{
int n=0;
flag[i]=0;
while(turn!=-1)
Sleep(1);
flag[i]=1;
Sleep(1);
int k=0;
while(k<20&&((flag[k]==0)||(k==i)))
k++;
if(k==20)
{
turn=i;
return true;
}
n++;
while(n<15)
{
flag[i]=0;
wait(n,i);
while(turn!=-1)
flag[i]=1;
Sleep(1);
int k=0;
while(k<20&&((flag[k]==0)||(k==i)))
k++;
if(k==20)
{
turn=i;
return true;
}
n++;
}
flag[i]=0;
return false;
}
void send(int i)
{
if(judge(i))
{ Sleep(80);
t=t+80;
flag[i]=0;
turn=-1;
}
else
{
}
int k=random(9999);
if(k<80)
send(i);
}class CWorker
{
public:
CWorker(void);
~CWorker(void);
int DoWork(void);
};
CWorker::CWorker(void)
{
}
CWorker::~CWorker(void)
{
}
static DWORD WINAPI ThreadProo(LPVOID num)
{
int i=((ID*)num)->id;
while(true)
{
int k=random(9999);
if(k==0)
send(i);
Sleep(1);
}
}
int CWorker::DoWork(void)
{
for(int i=0;i<20;i++)
{
ID *num=new ID;
num->id=i;
HANDLE thread=::CreateThread(NULL,0,ThreadProo,(LPVOID)num,0,NULL);
::CloseHandle(thread);
}
return 0;
}
int main()
{
srand((unsigned)time(NULL));
for(int i=0;i<20;i++)
{
flag[i]=0;
}
CWorker worker;
worker.DoWork();
Sleep(60000);
double p=t/60000.0;
cout<<p<<endl;
return 1;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
同学做的一道题目,就是模拟802.3MAC协议的运行情况。模拟2台主机,每台主机的帧到达服从泊松分布,帧的到达率为十帧/秒。总线速率为10Mbps,帧长固定为1000octets,最大往返传播时延是10us,要求的是总线利用率。N为判断回避次数,如果已经回避了15次以上则丢弃该帧。现在的问题是由时候结果是正确的,有时候确实错误的,大家帮忙看一下。下面这个是人家用数组完成的一个程序。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <iostream.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include <stdio.h>int count=0; //放弃帧的数目
int t=0; //占用总线的次数
int flag[20]; //是否准备发送
int turn=-1; //谁在占用总线,-1时为空闲
int buf[20]; //帧的缓存区
int wait[20]; //等待时间
int sendtime=0; //发送时间
int N[20]; //回避次数
int Wy[20]; //冲突检查次数
int n;
int cc=0; //冲突次数
int random(int max) //生产随机数
{
return rand()%(max+1);
}
int Wait(int N,int i) //产生等待时间
{ int time;
int max;
if(N<10)
{
max=pow(2,N);
time=16*random(max);//每作一次用时3.2us,51.2/3.2=16
}
else
time=16*random(1024);
return time;
}
bool collison(int j) //检测冲突
{
int k=0;
while((k<20)&&((flag[k]==0)||(k==j))) //判断有无其他也处于发送状态
k++;
if(k==20) //没有,不冲突
return false;
else //冲突
{
cc++; //冲突次数增加
Wy[j]=0; //检测次数归0
flag[j]=0; //回到不发送状态
if(N[j]>=15) //若回避次数〉14,则放弃
{ buf[j]--; //缓存减小
N[j]=0;
count++; //放弃帧数增加
}
else
{
N[j]++;
int n=N[j];
wait[j]=Wait(n,j); //获得等待时间
}
return true; }
}int main()
{
srand((unsigned)time(NULL));
for(int m=0;m<20;m++) //变量初始化
{
flag[m]=0;
buf[m]=0;
wait[m]=0;
N[m]=0;
Wy[m]=0;
}
for(int i=0;i<10000000;i++) //每次执行时间为3.2us
{
for(int j=0;j<20;j++) //对20台主机轮寻
{
int f;
f=rand(); //产生0-32767随机数
if(f==0) //3.2us内产生帧的概率为0.000032;而在0-32767中产生0的概率为1/32768=0.000030近似相等;
buf[j]++; //帧个数增加
if(wait[j]!=0) //检查回避
{
wait[j]--; //减少回避时间
continue;
}
if(turn==j) //检查是否已经占有总线
{
if(sendtime==0) //有无发送完成
{
buf[j]--;
flag[j]=0;
turn=-1; //释放总线
}
else
{
sendtime--;
t++;
continue;
}
}
if(flag[j]>0)
{
if(Wy[j]>0) //检测冲突次是否完成
{
if(!collison(j))
Wy[j]--; //不冲突则检测次数减少
}
else
{
turn=j; //在传播时延内没有冲突则获得总线
sendtime=250;
N[j]=0;
}
continue;
}
if((buf[j]>0)&&(turn==-1)) //有帧要发送且总线空闲的话
{
flag[j]=1; //置为准备发送状态
if(!collison(j))
Wy[j]=2; //不冲突,置检测次数为2,因为传播时延为10us,要检测3次;即2,1,0;故置2
} }
}
double p=t/10000000.0;
// cout<<"总线占用时间: "<<3.2*t<<"us"<<endl;
cout<<"总线效率: "<<p<<endl;
// cout<<"冲突次数: "<<cc<<endl;
return 0;
}
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include <winbase.h>
#include <stdio.h>
//#include <stdAfx.h>
//#include <Worker.h>
static int t;
static int flag[20];
static int turn=-1;
struct ID
{
int id;
};
int random(int max)
{
return rand()%(max+1);
}
void wait(int n,int i)
{
int time;
int max;
if(n<10)
{
max=(int)pow(2,n);
time=5*random(max);
}
else
time=5*random(1024);
Sleep(time);
}
bool judge(int i)
{
int n=0;
flag[i]=0;
while(turn!=-1)
Sleep(1);
flag[i]=1;
Sleep(1);
int k=0;
while(k<20&&((flag[k]==0)||(k==i)))
k++;
if(k==20)
{
turn=i;
return true;
}
n++;
while(n<15)
{
flag[i]=0;
wait(n,i);
while(turn!=-1)
flag[i]=1;
Sleep(1);
int k=0;
while(k<20&&((flag[k]==0)||(k==i)))
k++;
if(k==20)
{
turn=i;
return true;
}
n++;
}
flag[i]=0;
return false;
}
void send(int i)
{
if(judge(i))
{ Sleep(80);
t=t+80;
flag[i]=0;
turn=-1;
}
else
{
}
int k=random(9999);
if(k<80)
send(i);
}class CWorker
{
public:
CWorker(void);
~CWorker(void);
int DoWork(void);
};
CWorker::CWorker(void)
{
}
CWorker::~CWorker(void)
{
}
static DWORD WINAPI ThreadProo(LPVOID num)
{
int i=((ID*)num)->id;
while(true)
{
int k=random(9999);
if(k==0)
send(i);
Sleep(1);
}
}
int CWorker::DoWork(void)
{
for(int i=0;i<20;i++)
{
ID *num=new ID;
num->id=i;
HANDLE thread=::CreateThread(NULL,0,ThreadProo,(LPVOID)num,0,NULL);
::CloseHandle(thread);
}
return 0;
}
int main()
{
srand((unsigned)time(NULL));
for(int i=0;i<20;i++)
{
flag[i]=0;
}
CWorker worker;
worker.DoWork();
Sleep(60000);
double p=t/60000.0;
cout<<p<<endl;
return 1;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
同学做的一道题目,就是模拟802.3MAC协议的运行情况。模拟2台主机,每台主机的帧到达服从泊松分布,帧的到达率为十帧/秒。总线速率为10Mbps,帧长固定为1000octets,最大往返传播时延是10us,要求的是总线利用率。N为判断回避次数,如果已经回避了15次以上则丢弃该帧。现在的问题是由时候结果是正确的,有时候确实错误的,大家帮忙看一下。下面这个是人家用数组完成的一个程序。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <iostream.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include <stdio.h>int count=0; //放弃帧的数目
int t=0; //占用总线的次数
int flag[20]; //是否准备发送
int turn=-1; //谁在占用总线,-1时为空闲
int buf[20]; //帧的缓存区
int wait[20]; //等待时间
int sendtime=0; //发送时间
int N[20]; //回避次数
int Wy[20]; //冲突检查次数
int n;
int cc=0; //冲突次数
int random(int max) //生产随机数
{
return rand()%(max+1);
}
int Wait(int N,int i) //产生等待时间
{ int time;
int max;
if(N<10)
{
max=pow(2,N);
time=16*random(max);//每作一次用时3.2us,51.2/3.2=16
}
else
time=16*random(1024);
return time;
}
bool collison(int j) //检测冲突
{
int k=0;
while((k<20)&&((flag[k]==0)||(k==j))) //判断有无其他也处于发送状态
k++;
if(k==20) //没有,不冲突
return false;
else //冲突
{
cc++; //冲突次数增加
Wy[j]=0; //检测次数归0
flag[j]=0; //回到不发送状态
if(N[j]>=15) //若回避次数〉14,则放弃
{ buf[j]--; //缓存减小
N[j]=0;
count++; //放弃帧数增加
}
else
{
N[j]++;
int n=N[j];
wait[j]=Wait(n,j); //获得等待时间
}
return true; }
}int main()
{
srand((unsigned)time(NULL));
for(int m=0;m<20;m++) //变量初始化
{
flag[m]=0;
buf[m]=0;
wait[m]=0;
N[m]=0;
Wy[m]=0;
}
for(int i=0;i<10000000;i++) //每次执行时间为3.2us
{
for(int j=0;j<20;j++) //对20台主机轮寻
{
int f;
f=rand(); //产生0-32767随机数
if(f==0) //3.2us内产生帧的概率为0.000032;而在0-32767中产生0的概率为1/32768=0.000030近似相等;
buf[j]++; //帧个数增加
if(wait[j]!=0) //检查回避
{
wait[j]--; //减少回避时间
continue;
}
if(turn==j) //检查是否已经占有总线
{
if(sendtime==0) //有无发送完成
{
buf[j]--;
flag[j]=0;
turn=-1; //释放总线
}
else
{
sendtime--;
t++;
continue;
}
}
if(flag[j]>0)
{
if(Wy[j]>0) //检测冲突次是否完成
{
if(!collison(j))
Wy[j]--; //不冲突则检测次数减少
}
else
{
turn=j; //在传播时延内没有冲突则获得总线
sendtime=250;
N[j]=0;
}
continue;
}
if((buf[j]>0)&&(turn==-1)) //有帧要发送且总线空闲的话
{
flag[j]=1; //置为准备发送状态
if(!collison(j))
Wy[j]=2; //不冲突,置检测次数为2,因为传播时延为10us,要检测3次;即2,1,0;故置2
} }
}
double p=t/10000000.0;
// cout<<"总线占用时间: "<<3.2*t<<"us"<<endl;
cout<<"总线效率: "<<p<<endl;
// cout<<"冲突次数: "<<cc<<endl;
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货