通道模拟程序

感谢dreamwrever的帮助,解决了我很多困惑的问题,也提高了自己的信心

这代码是对计算机系统结构中通道的一个模拟,希望高手多多指点,谢谢

class.h 

#include<iostream>
#include<string.h>
using namespace std;
const int NONE = 0;
const int INIT = 1;
const int FINISH = 2;
//IO设备类;
class Device{
private:
 int Num;
 int RequireTime;
 int priority;
 char* Content;
 int itslen;
 int RequireState;// 0->r 1-> nr
 int itspos;
public:
 Device();
 Device(int itsNum,int itsRequireTime);
 ~Device(){delete[] Content;}
 void SetNum(int itsNum);
 int GetNum(){return Num;}
 void SetRequireTime(int itsRequireTime);
 int GetRequireTime(){return RequireTime;}
 void Setpriority(int itspriority);
 int Getpriority(){return priority;}
 void SetContent(const char* itscontent);
 char* GetContent() const{return this->Content;}
 void SetRequireState(int state);
 int GetRequireState(){return RequireState;}
 void PrintDevice();
// int operator++(){ return itspos++; };
 int Getpos(){return itspos;}
};
Device::Device():
Num(0),
RequireTime(0),
Content(NULL),
RequireState(0),
priority(0),
itspos(0)
{}

Device::Device(int itsNum,int itsRequireTime):
Num(itsNum),
RequireTime(itsRequireTime)
{}

void Device::SetNum(int itsNum)
{
 Num = itsNum;
}

void Device::SetRequireTime(int itsRequireTime)
{
 RequireTime = itsRequireTime;
}

void Device::Setpriority(int itspriority)
{
 priority = itspriority;
}

void Device::SetContent(const char* itsContent)
{
 if (!this->Content)
 {
  itslen = strlen(itsContent);
  Content = new char[itslen + 1];
 }
 
 Content[itspos] = itsContent[itspos];
 itspos++;
 Content[itspos] = '/0';
}

void Device::SetRequireState(int state)
{
 RequireState = state ;//0 = f, 1 = t;
}

void Device::PrintDevice()
{
 cout << "设备" << Num << "/t请求时间" << RequireTime << "/t内容:" << (Content ? Content : "null") << endl;
}


//内存类;
class Memory{
private:
 char* itsString;
 int itsLen;
public:
 Memory();
 Memory(const char* content);
 ~Memory();
 void SetMcontent(const char* content);
 char* GetMcontent() const
 {
  return this->itsString;
 }
};

Memory::Memory():itsString(NULL),itsLen(0)
{
}

Memory::Memory(const char* content)
{
 this->itsLen = strlen(content);
 this->itsString = new char[itsLen + 1];
 strcpy(itsString, content);
}

Memory::~Memory()
{
 delete[] itsString;
}

void Memory::SetMcontent(const char* content)
{
 if (!content)
 {
  delete[] itsString;
 }

 this->itsLen = strlen(content);
 this->itsString = new char[itsLen + 1];
 strcpy(itsString, content);
}

 

class Ch_mannager{
public:
 Ch_mannager(){}
 ~Ch_mannager(){}
 void run(int state);
 int sort(Device []);
 void memoryToDevice(Memory [],Device []);
};

void Ch_mannager::memoryToDevice(Memory m[],Device d[])
{
 int i;
 int maxDnum = 0;
 int flag = 0;
 static int time = 0;
 for(i = 0; i < 4; i++)
 {
  d[i].SetRequireState(1);
 }

 while(true)
 {
   if((d[0].GetContent() != NULL))
      cout << strlen( d[0].GetContent() )<< endl;
   
   if((d[0].GetContent() != NULL) && (strlen( d[0].GetContent()) == 4 ) )
   {   
    d[0].SetRequireState(0);
    cout << "d[" << i << "]" << d[0].GetRequireState() << endl ;
   }

  if((d[1].GetContent() != NULL) &&strlen(d[1].GetContent()) == 7)
  {
   d[1].SetRequireState(0);
  }
  if((d[2].GetContent() != NULL) &&strlen(d[2].GetContent()) == 6)
  { 
   d[2].SetRequireState(0);
  }
  if((d[3].GetContent() != NULL) &&strlen(d[3].GetContent()) == 5)
  {
   d[3].SetRequireState(0);
  }
  for (i = 0;i<4;i++)
  {
   cout << "d[" << i << "]" << d[i].GetRequireState() << endl ;
  }
  maxDnum = sort(d);
 
   d[maxDnum].SetContent( m[maxDnum].GetMcontent());
   d[maxDnum].SetRequireState(0);

  d[0].PrintDevice();
  d[1].PrintDevice();
  d[2].PrintDevice();
  d[3].PrintDevice();
  time+=5;
   for(i=0;i<4;i++)
  {

   if( ( time % d[i].GetRequireTime() ) == 0)
   {
    d[i].SetRequireState(1);
   }
  }
   cout << "time" << time << endl;
  if( ( strlen( d[0].GetContent() ) == 4&&strlen(d[1].GetContent()) == 7&&strlen(d[2].GetContent()) == 6&&strlen(d[3].GetContent()) == 5) )
   break;
 }
}


int Ch_mannager::sort(Device d[])
{
 int index = 0;
 int i = 0;
 int max;
 max = 0;
 for(i = 0;i < 4;i++)
 {

  if(( d[i].GetRequireState() == 1)&&(d[i].Getpriority() > max))
  {
   index = i;
  // cout << index <<"index" << endl;

   max = d[i].Getpriority();
  // cout << max << endl;
  }
 }
 cout << "index" << index;
 return index;
}


void Ch_mannager::run(int state)
{
 while(true)
 {
  if(state == NONE)
  {
   cout<<"The cpu is doing some thing..."<<endl;
   cout<<"The cpu is doing some thing..."<<endl;
   break;
  }
  if(state == INIT)
  {
   cout<<"CPU is interrupted"<<endl;
   cout<<"This is a I/0 Init instruction,The channalManager is init thedevice..."<<endl;
   break;
  }
  if(state == FINISH)
  {
   cout<<"CPU is interrupted"<<endl;
   cout<<"This is a I/0 Finish instruction,The channalManager is close thedevice..."<<endl;
   break;
  }
 }
}

channel.cpp

#include<iostream>
#include "Class.h"

using namespace std;

const int DeviceNum = 4;
const int MemoryNum = 4;

void main()
{
 //使用类声明;
 Device Dev[DeviceNum];
 Memory Mem[MemoryNum];
 Ch_mannager c;
// ui user;
 int i;
 //init the memory;
 cout << "init the memory" << endl;
 Mem[0].SetMcontent("love");
 cout << "Mem0 :/t" << "/t" <<  Mem[0].GetMcontent() << endl;
 Mem[1].SetMcontent("channel");
 cout << "Mem1 :/t" << "/t" <<  Mem[1].GetMcontent() << endl;
 Mem[2].SetMcontent("middle");
 cout << "Mem2 :/t" << "/t" <<  Mem[2].GetMcontent() << endl;
 Mem[3].SetMcontent("house");
 cout << "Mem3 :/t" << "/t" <<  Mem[3].GetMcontent() << endl;
 cout << "init the Device" << endl;
 //init the Device;
 Dev[0].SetRequireTime(10);
 Dev[0].SetNum(0);
 Dev[0].Setpriority(4);
 Dev[1].SetRequireTime(20);
 Dev[1].SetNum(1);
 Dev[1].Setpriority(3);
 Dev[2].SetRequireTime(25);
 Dev[2].SetNum(2);
 Dev[2].Setpriority(2);
 Dev[3].SetRequireTime(40);
 Dev[3].SetNum(3);
 Dev[3].Setpriority(1);
 for(i = 0; i < DeviceNum; i++)
 {
  Dev[i].PrintDevice();
 }
 //begin io;
 c.run(0);
 cout << "any io device?/t" << "/tyes -> 1" << endl;
 c.run(1);
 c.memoryToDevice(Mem,Dev);
 c.run(2);

}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值