操作系统实验--进程调度(FCFS,PF,SJF,HRRN)
程序员文章站
2022-03-05 09:54:29
...
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;
#define MAX 10 //进程最多个数
struct JCB{
string name;
float comeTime;//到的时间
float runTime;//运行所需时间
float sTime;//开始运行时间
float eTime;//结束运行时间
int priority;//优先级
int flag;//运行标志
float T;//周转时间
float W;//带权周转时间
};
JCB run[MAX];//最多有10个进程
int num;//实际进程个数
int choice;//算法选择
void input();
void clear_();
int FCFS();//先来先服务
int PS();//优先级调度
int SJF();//短作业优先
int HRRN();//最高响应比优先
void output();
int main()
{
/*
cout<<"请选择算法"<<endl;
cout<<"1--先来先服务"<<endl;
cout<<"2--优先级调度"<<endl;
cout<<"3--短作业优先"<<endl;
cout<<"4--最高响应比优先"<<endl;
cout<<"0--退出"<<endl;
cin>>choice;
input();
switch(choice)
{
case 0: exit(0);
case 1: FCFS(); break;
case 2: PS(); break;
case 3: SJF(); break;
case 4: HRRN(); break;
default: exit(1);
}
output();
*/
input();
do{
clear_();
cout<<"请选择算法"<<endl;
cout<<"1--先来先服务"<<endl;
cout<<"2--优先级调度"<<endl;
cout<<"3--短作业优先"<<endl;
cout<<"4--最高响应比优先"<<endl;
cout<<"0--退出"<<endl;
cin>>choice;
switch(choice)
{
case 0: exit(0);
case 1: FCFS(); break;
case 2: PS(); break;
case 3: SJF(); break;
case 4: HRRN(); break;
default: exit(1);
}
output();
}while(choice!=0);
return 0;
}
void input()
{
cout<<"请输入进程个数(不超过10): ";
cin>>num;
int i;
for(i=0;i<num;i++)
{
cout<<"进程"<<i+1<<"的名字: ";
cin>>run[i].name;
cout<<"进程"<<i+1<<"的到达时间: ";
cin>>run[i].comeTime;
cout<<"进程"<<i+1<<"运行所需时间: ";
cin>>run[i].runTime;
// if(choice==2)
//{
cout<<"进程"<<i+1<<"的优先级: ";
cin>>run[i].priority;
//}
}
if(i==num)
cout<<"输入结束!"<<endl;
}
void clear_()//清除进程标识
{
for(int i=0;i<num;i++)
run[i].flag=0;
}
int FCFS()//先来先服务
{
int temp=run[0].comeTime;
for(int i=0;i<num;i++)
{
if(run[i].comeTime<=temp)
{
run[i].sTime=temp;
run[i].eTime=temp+run[i].runTime;
temp=run[i].eTime;
}
else{
temp=run[i].comeTime;
run[i].sTime=temp;
run[i].eTime=temp+run[i].runTime;
temp=run[i].eTime;
}
}
return 0;
}
int PS()//优先级调度
{
int x=0;//将被调度的进程序号
int max_priority=run[0].priority;
float temp=run[0].comeTime;//当前时间
for(int j=1;j<num;j++)
{
if(run[j].comeTime==run[0].comeTime&&run[j].priority>max_priority)//与第一个进程同时到达的进程,且优先级大于第一个进程
{
max_priority=run[j].priority;
x=j; //求优先级最高的进程序号
}
}
temp=run[x].comeTime;
run[x].sTime=temp;
run[x].eTime=run[x].runTime+temp;
temp=run[x].eTime;
run[x].flag=1;
//确定第一个调度的进程
int counter=1;
int a=0;//在当前时间前到达的进程数目
while(counter<num)
{
max_priority=0;
for(int j=0;j<num;j++)
{
if(run[j].comeTime<=temp&&run[j].flag==0)//在当前时间内到达且未被标记的进程
{
a++;
if(run[j].priority>max_priority)
{
max_priority=run[j].priority;
x=j;//求优先级最高的进程序号
}
}
}
if(a==0)//如果当前时间内没有进程到达,时间跳转
temp=run[x+1].comeTime;
else//当前时间内有进程到达
{
run[x].flag=1;
run[x].sTime=temp;
run[x].eTime=temp+run[x].runTime;
temp=run[x].eTime;
counter++;
}
}
return 0;
}
int SJF()//短作业优先
{
float min_time=run[0].runTime;
float temp=run[0].comeTime;
int x=0;
for(int i=1;i<num;i++)
{
if(run[i].comeTime==temp&&run[i].runTime<min_time)//与第一个进程同时到达的进程,且运行时间小于第一个进程
{
min_time=run[i].runTime;
x=i;//求运行时间最短的进程序号
}
}
temp=run[x].comeTime;
run[x].sTime=temp;
run[x].eTime=temp+run[x].runTime;
temp=run[x].eTime;
run[x].flag=1;
//确定第一个被调度的进程
int counter=1;
int a=0;//当前时间内到达的进程数目
while(counter<num)
{
min_time=100;
for(int i=0;i<num;i++)
{
if(run[i].comeTime<=temp&&run[i].flag==0)//在当前时间内到达且未被标记的进程
{
a++;
if(run[i].runTime<min_time)
{
min_time=run[i].runTime;
x=i;//求最短运行时间的进程序号
}
}
}
if(a==0)//如果当前时间内没有进程到达,时间跳转
temp=run[x+1].comeTime;
else//当前时间内有进程到达
{
run[x].flag=1;
run[x].sTime=temp;
run[x].eTime=temp+run[x].runTime;
temp=run[x].eTime;
counter++;
}
}
return 0;
}