操作系统实验2——进程调度算法的模拟实现

实验目的

1.本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。

2.利用程序设计语言编写算法,模拟实现先到先服务算法FCFS、轮转调度算法RR、最短作业优先算法SJF、优先级调度算法PRIOR、最短剩余时间优先算法SRTF。

3.进行算法评价,计算平均等待时间和平均周转时间。

实验内容及结果

1.先来先服务算法

2.轮转调度算法

3. 优先级调度算法

4. 最短时间优先算法

5. 最短剩余时间优先算法

实验总结

在此次模拟过程中,将SRTF单独拿了出来用指针表示,而其余均用数组表示。

//
【Process.cpp代码如下:】
#include<iostream>
#include<string>
using namespace std;

class Process
{
public:
string ProcessName;  // 进程名字
 int Time;  //  进程需要时间
 int leval; //  进程优先级
 int LeftTime; // 进程运行一段时间后还需要的时间
}; 

void Copy ( Process proc1, Process proc2); // 把proc2赋值给proc1
void Sort( Process  pr[], int size) ; // 此排序后按优先级从大到小排列
void sort1(Process  pr[], int size) ; //  此排序后按需要的cpu时间从小到大排列
void Fcfs( Process pr[], int num, int Timepice); // 先来先服务算法
void TimeTurn( Process process[], int num, int Timepice); // 时间片轮转算法
void Priority( Process process[], int num, int Timepice); // 优先级算法

void main()
{  
 int a;
 cout<<endl;
 cout<<"  选择调度算法:"<<endl;
 cout<<"  1: FCFS  2: 时间片轮换 3: 优先级调度 4: 最短作业优先 5: 最短剩余时间优先"<<endl;
 cin>>a; 
const int Size =30;
 Process   process[Size] ;
 int num;
 int TimePice;  
cout<<" 输入进程个数:"<<endl;
 cin>>num;
 cout<<" 输入此进程时间片大小: "<<endl;
 cin>>TimePice;
for( int i=0; i< num; i++)
 {  
  string name;
  int CpuTime;
  int Leval;
  cout<<" 输入第"<< i+1<<" 个进程的名字、cpu时间和优先级:"<<endl;
  cin>>name;
  cin>> CpuTime>>Leval;
  process[i].ProcessName =name;
  process[i].Time =CpuTime;
  process[i].leval =Leval;
  cout<<endl;
}
for ( int k=0;k<num;k++)
  process[k].LeftTime=process[k].Time ;//对进程剩余时间初始化
  cout<<" ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级!! )";
  cout<<endl;   cout<<endl;
  cout<<"进程名字"<<"共需占用CPU时间 "<<" 还需要占用时间 "<<" 优先级"<<"   状态"<<endl;
if(a==1)
     Fcfs(process,num,TimePice);
else if(a==2)
  TimeTurn(  process,   num,   TimePice);
else if(a==3)
{
 Sort( process, num);
    Priority(   process ,  num,  TimePice);
}
 else   //  最短作业算法,先按时间从小到大排序,再调用Fcfs算法即可
 {
  sort1(process,num);
  Fcfs(process,num,TimePice);
 }
}

void Copy ( Process proc1, Process proc2)
{
 proc1.leval =proc2.leval ;
 proc1.ProcessName =proc2.ProcessName ;
 proc1.Time =proc2.Time ;
}

void Sort( Process  pr[], int size)  //以进程优先级高低排序
{//  直接插入排序
 for( int i=1;i<size;i++)
 {
 Process temp;
     temp = pr[i];
     int j=i;  
     while(j>0 && temp.leval<pr[j-1].leval)
  {
       pr[j] = pr[j-1];
   j--;
  }
    pr[j] = temp;
} // 直接插入排序后进程按优先级从小到大排列
 for( int d=size-1;d>size/2;d--)
 {
  Process temp;
  temp=pr [d];
     pr [d] = pr [size-d-1];
  pr [size-d-1]=temp;
}  // 此排序后按优先级从大到小排列
}
/* 最短作业优先算法的实现*/
void sort1 ( Process  pr[], int size)  // 以进程时间从低到高排序
{//  直接插入排序
 for( int i=1;i<size;i++)
 {
 Process temp;
     temp = pr[i];
     int j=i;  
     while(j>0 && temp.Time < pr[j-1].Time )
  {
       pr[j] = pr[j-1];
   j--;
  }
    pr[j] = temp;
}  
}
/*  先来先服务算法的实现*/
void Fcfs( Process process[], int num, int Timepice)
{  // process[] 是输入的进程,num是进程的数目,Timepice是时间片大小
while(true)
 {
  if(num==0)
  {
   cout<<" 所有进程都已经执行完毕!"<<endl;
   exit(1);
  }
    if(process[0].LeftTime==0)
    {
  cout<<" 进程"<<process[0].ProcessName<< " 已经执行完毕!"<<endl;
     for (int i=0;i<num;i++)
     process[i]=process[i+1];
          num--;
    }
    else if(process[num-1].LeftTime==0)
  {
     cout<<" 进程"<<process[num-1].ProcessName<< " 已经执行完毕!"<<endl;
     num--;
  }
  else
  {
          cout<<endl;  //输出正在运行的进程
             process[0].LeftTime=process[0].LeftTime- Timepice;
             process[0].leval =process[0].leval-1;
             cout<<" "<<process[0].ProcessName <<"          "<<process[0].Time <<"                 ";
             cout<<process[0].LeftTime <<"                 "<<process[0].leval<<"      运行"; 
          cout<<endl;  
    for(int s=1;s<num;s++)
     {
      cout<<" "<<process[s].ProcessName <<"          "<<process[s].Time <<"                 ";
     cout<<process[s].LeftTime    <<"                 "<<process[s].leval<<"      等待"<<endl; ; 
         
         }
  }  // else
  cout<<endl;
  system(" pause");
  cout<<endl;
      
 } // while 
}
/* 时间片轮转调度算法实现*/
void TimeTurn( Process process[], int num, int Timepice)
{
while(true)
 {
  if(num==0)
  {
   cout<<" 所有进程都已经执行完毕!"<<endl;
   exit(1);
  }
    if(process[0].LeftTime==0)
    {
  cout<<" 进程"<<process[0].ProcessName<< " 已经执行完毕!"<<endl;
     for (int i=0;i<num;i++)
     process[i]=process[i+1];
          num--;
    }
     if( process[num-1].LeftTime ==0 )
  {
        cout<<" 进程" << process[num-1].ProcessName <<" 已经执行完毕! "<<endl;
         num--;
  }
  else if(process[0].LeftTime > 0)
    {
          cout<<endl;  //输出正在运行的进程
             process[0].LeftTime=process[0].LeftTime- Timepice;
             process[0].leval =process[0].leval-1;
             cout<<" "<<process[0].ProcessName <<"          "<<process[0].Time <<"                 ";
             cout<<process[0].LeftTime <<"                 "<<process[0].leval<<"      运行"; 
          cout<<endl;  
    for(int s=1;s<num;s++)
     {
      cout<<" "<<process[s].ProcessName <<"          "<<process[s].Time <<"                 ";
     cout<<process[s].LeftTime    <<"                 "<<process[s].leval; 
          if(s==1)
     cout<<"      就绪"<<endl;
    else
     cout<<"      等待"<<endl;
         
         }
  Process temp;
    temp = process[0];
    for( int j=0;j<num;j++)
     process[j] = process[j+1];
    process[num-1] = temp;
  } // else 
   
  cout<<endl;
  system(" pause");
  cout<<endl;
} // while 
}
/*  优先级调度算法的实现*/
void Priority( Process process[], int num, int Timepice)
{
 while( true)
 {
  if(num==0)
  {
   cout<< "所有进程都已经执行完毕!"<<endl;
      exit(1);
  }
if(process[0].LeftTime==0)
 {
  cout<<" 进程" << process[0].ProcessName <<" 已经执行完毕! "<<endl;
  for( int m=0;m<num;m++) 
    process[m] = process[m+1]; //一个进程执行完毕后从数组中删除
  num--; // 此时进程数目减少一个
 }
 if( num!=1 && process[num-1].LeftTime ==0 )
  {
   cout<<" 进程" << process[num-1].ProcessName <<" 已经执行完毕! "<<endl;
    num--;
 }
if(process[0].LeftTime > 0)
  {
    cout<<endl;  //输出正在运行的进程
 process[0].LeftTime=process[0].LeftTime- Timepice;
    process[0].leval =process[0].leval-1;
    cout<<" "<<process[0].ProcessName <<"          "<<process[0].Time <<"                 ";
    cout<<process[0].LeftTime <<"                 "<<process[0].leval<<"     运行"; 
cout<<endl;                  // 输出其他进程
   for(int s=1;s<num;s++)
  {
    cout<<" "<<process[s].ProcessName <<"          "<<process[s].Time <<"                 ";
    cout<<process[s].LeftTime    <<"                 "<<process[s].leval ; 
   if(s==1)
    cout<<"     就绪"<<endl;
   else
    cout<<"     等待 "<<endl;
   } 
} // else
  Sort(process, num);
  cout<<endl;
  system(" pause");
  cout<<endl;
} // while
}

 选择调度算法:

  1: FCFS  2: 时间片轮换 3: 优先级调度 4: 最短作业优先 5: 最短剩余时间优先

1

 输入进程个数:

3

 输入此进程时间片大小:

10

 输入第1 个进程的名字、cpu时间和优先级:

P1 10 1

 输入第2 个进程的名字、cpu时间和优先级:

P2 10 2

 输入第3 个进程的名字、cpu时间和优先级:

P3 10 3

 ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级!! )

进程名字共需占用CPU时间  还需要占用时间  优先级   状态

 P1          10                 0                 0      运行

 P2          10                 10                 2      等待

 P3          10                 10                 3      等待

请按任意键继续. . .

 进程P1 已经执行完毕!

请按任意键继续. . .

 P2          10                 0                 1      运行

 P3          10                 10                 3      等待

请按任意键继续. . .

 进程P2 已经执行完毕!

请按任意键继续. . .

 P3          10                 0                 2      运行

请按任意键继续. . .

 进程P3 已经执行完毕!

请按任意键继续. . .

 所有进程都已经执行完毕!

Press any key to continue

  选择调度算法:

  1: FCFS  2: 时间片轮换 3: 优先级调度 4: 最短作业优先 5: 最短剩余时间优先

2

 输入进程个数:

2

 输入此进程时间片大小:

10

 输入第1 个进程的名字、cpu时间和优先级:

P1 10 1

 输入第2 个进程的名字、cpu时间和优先级:

P2 10 2

 ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级!! )

进程名字共需占用CPU时间  还需要占用时间  优先级   状态

 P1          10                 0                 0      运行

 P2          10                 10                 2      就绪

请按任意键继续. . .

 进程P1 已经执行完毕!

请按任意键继续. . .

 P2          10                 0                 1      运行

请按任意键继续. . .

 进程P2 已经执行完毕!

请按任意键继续. . .

 所有进程都已经执行完毕!

Press any key to continue

  选择调度算法:

  1: FCFS  2: 时间片轮换 3: 优先级调度 4: 最短作业优先 5: 最短剩余时间优先

2

 输入进程个数:

2

 输入此进程时间片大小:

10

 输入第1 个进程的名字、cpu时间和优先级:

P1 10 1

 输入第2 个进程的名字、cpu时间和优先级:

P2 10 2

 ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级!! )

进程名字共需占用CPU时间  还需要占用时间  优先级   状态

 P1          10                 0                 0      运行

 P2          10                 10                 2      就绪

请按任意键继续. . .

 进程P1 已经执行完毕!

请按任意键继续. . .

 P2          10                 0                 1      运行

请按任意键继续. . .

 进程P2 已经执行完毕!

请按任意键继续. . .

 所有进程都已经执行完毕!

Press any key to continue

  选择调度算法:

  1: FCFS  2: 时间片轮换 3: 优先级调度 4: 最短作业优先 5: 最短剩余时间优先

2

 输入进程个数:

2

 输入此进程时间片大小:

10

 输入第1 个进程的名字、cpu时间和优先级:

P1 10 1

 输入第2 个进程的名字、cpu时间和优先级:

P2 10 2

 ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级!! )

进程名字共需占用CPU时间  还需要占用时间  优先级   状态

 P1          10                 0                 0      运行

 P2          10                 10                 2      就绪

请按任意键继续. . .

 进程P1 已经执行完毕!

请按任意键继续. . .

 P2          10                 0                 1      运行

请按任意键继续. . .

 进程P2 已经执行完毕!

请按任意键继续. . .

 所有进程都已经执行完毕!

Press any key to continue

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值