单处理器系统的进程调度

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

#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();
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现了如下四种调度算法的模拟: (1)时间片轮转调度 (2)优先数调度 (3)最短进程优先 (4)最短剩余时间优先 模拟过程使用了JProgressBar作为进程状态条,更为直观地观察到每个进程的执行状态。 程序用户说明: 1、在上图标号1处输入要创建随机进程的个数,仅可输入正数,非正数会有相关提示。然后点击标号2处的“创建进程”按钮,随进创建的进程显示在程序界面的中央窗口,如标号3所示。 2、创建好随机进程后,在标号4的选框选择将要模拟执行的调度算法,然后点击标号5处的“开始模拟”,程序开始执行。标号3的列表会显示相应的调度变化。 3、模拟过程中,可以继续添加新的进程,操作同上。 4、 一个算法模拟执行完毕之后,可以点击标号6的“复位”按钮,可以重置列表的内容为程序模拟运行前的内容。复位成功后,可以继续选择其他调度算法进行模拟。 5、标号7显示为程序模拟过程中的时间,从1秒开始累计。 6、点击标号8的“清空”按钮,可以清空类别的进程,以便程序的下次执行。 题目要求: 题目四 处理器系统进程调度 一 、 课 程 设 计 目 的 1. 加深对进程概念的理解, 明确进程和程序的区别。 2. 深入了解系统如何组织进程、 创建进程。 3. 进一步认识如何实现处理器调度。 二 、 课 程 设 计 内 容 编写程序完成处理器系统中的进程调度, 要求实现时间片轮转、 优先数、 最短进程优 先和最短剩余时间优先四种调度算法。 实验具体包括: 首先确定进程控制块的内容, 进程控 制块的组成方式; 然后完成进程创建原语和进程调度原语; 最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“ 虚拟 PCB” 进行相应的调度模拟操作, 即每发生“ 调度” 时, 显示出当前运行进程的“ 进程标识符”、“ 优先数”、“ 剩余运行时间” 等, 而不需要对系 统中真正的 PCB 等数据进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值