单处理器系统的进程调度

来源:互联网 发布:淘宝dota2买号 编辑:程序博客网 时间:2024/06/07 14:43

单处理器系统的进程调度的代码,

#include <iostream.h>
#include <stdio.h>
#define NULL 0
char Name[5]={'a','b','c','d','e'};
int Super[5]={3,5,7,10,6};

////定义PCB
struct PCB {
  char name;//PCB名字
  int RunTime;//PCB已运行时间
  int RequestTime;//PCB要求运行时间
  int super;//PCB优先级
  char status;//PCB状态
  struct PCB* head;//指向上一个PCB结构体的指针变量
  struct PCB* next;//指向下一个PCB结构体的指针变量
  };

struct PCB pcb1,pcb2,pcb3,pcb4,pcb5,*p,*q;/////////定义5个PCB进程
////定义PCB各参数的初值,输入各个进程的运行时间
Value()
{
///定义PCB名
 pcb1.name=Name[0];
 pcb2.name=Name[1];
 pcb3.name=Name[2];
 pcb4.name=Name[3];
 pcb5.name=Name[4];
///定义PCB优先级
 pcb1.super=Super[0];
 pcb2.super=Super[1];
 pcb3.super=Super[2];
 pcb4.super=Super[3];
 pcb5.super=Super[4];
///定义PCB状态,初态为'R'
 pcb1.status='R';
 pcb2.status='R';
 pcb3.status='R';
 pcb4.status='R';
 pcb5.status='R';
///定义PCB运行时间,初值为0
 pcb1.RunTime=0;
 pcb2.RunTime=0;
 pcb3.RunTime=0;
 pcb4.RunTime=0;
 pcb5.RunTime=0;
///给PCB的要求运行时间赋值
 cout<<endl;
 cout<<"***请给各个PCB的要求运行时间赋值(int):"<<endl;
 cout<<"***第一个PCB "<<pcb1.name<<"要求运行的时间为:";
 cin>>pcb1.RequestTime;
 cout<<"***第二个PCB "<<pcb2.name<<"要求运行的时间为:";
 cin>>pcb2.RequestTime;
 cout<<"***第三个PCB "<<pcb3.name<<"要求运行的时间为:";
 cin>>pcb3.RequestTime;
 cout<<"***第四个PCB "<<pcb4.name<<"要求运行的时间为:";
 cin>>pcb4.RequestTime;
 cout<<"***第五个PCB "<<pcb5.name<<"要求运行的时间为:";
 cin>>pcb5.RequestTime;
 cout<<"------------------------------------参数定义完毕-------------------------------"<<endl;
}
///////////使PCB连接成循环队列
Connect()
{
///////PCB的前驱
 pcb1.head=&pcb5;
 pcb2.head=&pcb1;
 pcb3.head=&pcb2;
 pcb4.head=&pcb3;
 pcb5.head=&pcb4;
////////PCB的后续
 pcb1.next=&pcb2;
 pcb2.next=&pcb3;
 pcb3.next=&pcb4;
 pcb4.next=&pcb5;
 pcb5.next=&pcb1;
}

///////显示输入
display()
{
 cout<<"----------------------------------------------------------------"<<endl;
 cout<<"    进程名称 "<<"   下一进程名"<<"   运行时间";
 cout<<"   要求时间"<<"   优先级"<<"   状态"<<endl;
 cout<<"----------------------------------------------------------------"<<endl;
}

/////PCB执行
Run()
{
 Value();
 Connect();
// struct PCB pcb1,pcb2,pcb3,pcb4,pcb5,*p,*q;
 char a;
 int num,n,PcbNum=5,Number=5,flag=1;//PcbNum表示进程执行过程中进程的个数,n表示已执行完毕的进程个数
 q=NULL;                          //flag=1时程序继续
 cout<<endl;
 cout<<"***选择a进程先运行的请按1;"<<endl;
 cout<<"***选择b进程先运行的请按2;"<<endl;
 cout<<"***选择c进程先运行的请按3;"<<endl;
 cout<<"***选择d进程先运行的请按4;"<<endl;
 cout<<"***选择e进程先运行的请按5;"<<endl<<endl;
 cout<<"***请选择你想要运行的进程:";
 cin>>num;
 cout<<endl;
 switch(num)//num为何值则转向那一个case,选择执行的进程
 {
 case 1:
  p=&pcb1;
  break;
 case 2:
  p=&pcb2;
  break;
 case 3:
  p=&pcb3;
  break;
 case 4:
  p=&pcb4;
  break;
 case 5:
  p=&pcb5;
  break;
 }

 while (flag==1){
  n=1;
  if((p->RequestTime==0)||(p->RequestTime==p->RunTime)){///要求运行时间为0或要求运行时间=运行时间时status='E'
   p->status='E';
  }
  else{ //否则,运行时间+1
   p->RunTime=p->RunTime+1;
  }
  cout<<"***进程运行情况如下所示:"<<endl<<endl;
  cout<<"***当前正在执行的进程名称为:"<<p->name<<endl<<endl;
  display(); 
  while(n<=PcbNum){
    if((p->RequestTime==0)||(p->RequestTime==p->RunTime)){///要求运行时间为0或要求运行时间=运行时间时status='E'
     p->status='E';
    }
   cout<<"/t"<<p->name<<"/t    "<<p->next->name<<"/t         "<<p->RunTime<<"/t    "<<p->RequestTime;
   cout<<"/t    "<<p->super<<"/t    "<<p->status<<endl;
   cout<<"----------------------------------------------------------------"<<endl;
   cout<<endl;
   if ((p->RunTime==p->RequestTime)&&(n==1)){/////该进程执行完毕
    q=p;
    Number=Number-1;
   }
   p=p->next;//指向下一进程
   n++;
   PcbNum=Number;
  }
 
  if(q!=NULL){
   if(q->RunTime==q->RequestTime){//有一个进程块执行完毕
    q->status='E';
    q->head->next=q->next;
    q->next->head=q->head;
    cout<<"*************************进程"<<q->name<<"已执行完毕!****************************"<<endl<<endl;
    p=q->next;
    q=p;
   }
 
   else{
    p=p->next;
   }
  }
  if(q==NULL){
   p=p->next;
  }
  if(PcbNum!=0){
   flag=0;
   cout<<"***要继续运行程序请按Enter键两次......"<<endl;
   a=getchar();

   if(a==getchar()){
    flag=1;
   }
   else{
    cout<<"***输入错误!!!"<<endl;
    cout<<"********************** 程序结束!*************************"<<endl;
    flag=0;
   }
  }
  if(PcbNum==0){
   flag=0;
   cout<<"*********************进程经已全部执行完毕!**********************"<<endl;
  }
 
 }
}

main()
{
//Value();
// Connect();
 Run();
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 警务通手机丢了怎么办 手机被伪基站覆盖怎么办 听了高频率声音怎么办 qq音乐签到没了怎么办 手机qq音乐不能播放怎么办 台式电脑放歌没有声音怎么办 微信图片上传大愎怎么办 行车记录仪内存卡丢了怎么办 投资项目失败lp的钱怎么办 无线网无ip分配怎么办 为什么电脑的暴风影音打不开怎么办 电枪充电板进水怎么办 捡到一颗子弹该怎么办 防弹衣只保护身体那手臂怎么办? 被子被宝宝尿湿怎么办 眼睛被子弹打了怎么办 gta5买了2套衣服怎么办 gta5车被摧毁了怎么办 gta5车被损坏了怎么办 头盔玻璃磨花了怎么办 浇花喷水壶坏了怎么办 电力专用光缆撞了怎么办 国防电缆挖断了怎么办 国防光缆挖断了怎么办 房门前乱挂光纤线影响住户怎么办 挂断低于限高的光缆怎么办 开大车挂住光缆怎么办 风把树枝挂断压到车该怎么办 货车柴油冻住了怎么办 尖头鞋老是折尖怎么办 打 氟氯西林疼怎么办 多余的十字绣线怎么办 硅胶类的东西沾到蓝药水怎么办? ph计斜率不到90怎么办 ph计斜率低于90怎么办 顾客说衣服起球怎么办 买的手机壳太滑怎么办 硅胶手机壳太滑怎么办 磨砂手机壳太滑怎么办 被热胶棒烫了怎么办 车钢垫子次了怎么办