进程调度实验代码——C语言实现
本人理解较为浅显可能有些地方走了弯路
简单实现了几个调度算法
不多说代码如下
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct {
char name;
int beginTime;
int finshTime;
int arriveTime;
int serveTime;
int rountime;
double priority;
double value;
int start_flag=0;
int run_flag=0;
bool inMemory=false;//是否写入内存
bool Isfinish=false;//是否完成
}PCBfc;
typedef struct queue{
int data[5];
int front;
int rear;
}queue;
queue* create(){
queue *q;
q=(queue *)malloc(sizeof(queue));
q->front=0;
q->rear=0;
return q;
}
void enter(queue *q,int x){
q->data[q->rear]=x;
q->rear=(q->rear+1)%5;
}
int out(queue *q){
int x=q->data[q->front];
q->front=(q->front+1)%5;
return x;
}
int get(queue *q){
int x=q->data[q->front];
}
void firstComefirstServe(PCBfc *temp,int number);
void shortComefirstServe(PCBfc *temp,int number);
void highRespfirstServe(PCBfc *temp,int number);
void timeRountServe(PCBfc *temp,int number);
void printSc(PCBfc *temp,int number);
//int charge(PCBfc *temp,int number);
int main()
{
PCBfc pcb[200];
int choice;
char dopoint;
while(1)
{
cout<<"\t如果要开始演示程序请输入'y'否则输入'n'"<<endl;
cin>>dopoint;
if(dopoint=='n')
break;
cout<<"\t输入进程数据"<<endl;
for(int i=0;i<5;i++)
{
cin>>pcb[i].name;
cin>>pcb[i].arriveTime;
cin>>pcb[i].serveTime;
}
cout<<"\t1.初始化"<<endl;
cout<<"\t2.先来先服务算法"<<endl;
cout<<"\t3.短作业优先算法"<<endl;
cout<<"\t4.高响应比算法"<<endl;
cout<<"\t5.时间片轮转算法"<<endl;
cout<<"\t请输入算法号"<<endl;
cin>>choice;
switch (choice)
{
case 2: firstComefirstServe(pcb,5);
printSc(pcb,5);
break;
case 3: shortComefirstServe(pcb,5);
printSc(pcb,5);break;
case 4: highRespfirstServe(pcb,5);
printSc(pcb,5);break;
case 5: timeRountServe(pcb,5);
printSc(pcb,5);break;
default:break;
}
}
}
void firstComefirstServe(PCBfc *temp,int number)
{
double vt=0.0;//带权周转
double rt=0.0;//周转时间
temp[0].finshTime=temp[0].arriveTime+temp[0].serveTime; //初始化第一个进程
temp[0].rountime=temp[0].finshTime-temp[0].arriveTime;
temp[0].value=temp[0].rountime/temp[0].serveTime;
rt+=temp[0].rountime;
vt+=temp[0].value;
for(int i=1;i<number;i++)
{
if(temp[i].arriveTime<temp[i-1].finshTime) //比较到达时间和上一个进程完成的时间
temp[i].finshTime=temp[i-1].finshTime+temp[i].serveTime;
else
temp[i].finshTime=temp[i].arriveTime+temp[i].serveTime;
temp[i].rountime=temp[i].finshTime-temp[i].arriveTime;
temp[i].value=1.0*temp[i].rountime/temp[i].serveTime;
rt+=temp[i].rountime;
vt+=temp[i].value;
}
int begin=0;
int last=0;
while(begin<=temp[number-1].finshTime)
{
for(int i=0;i<number;i++)
{
if(begin==temp[i].arriveTime)
printf("%2d 进程%c到达内存\n\n",begin,temp[i].name);
if(last>=temp[i].arriveTime&&begin==temp[i-1].finshTime)
{
printf("%2d 进程%c开始执行\n\n",last,temp[i].name);
last=temp[i].finshTime;
}
if(begin==temp[i].finshTime)
printf("%2d 进程%c结束!\n\n",begin,temp[i].name);
}
begin++;
}
printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number);
}
void shortComefirstServe(PCBfc *temp,int number)
{
double rt=0.0;
double vt=0.0;
int time=0;//接受上一个进程完成时间
int count=0;
int time1=0;//接受最后一个进程完成的时间
int sortSc[number]={0};//存入进程运行的顺序
int sc=1;//从第二个开始
temp[0].finshTime=temp[0].arriveTime+temp[0].serveTime;
temp[0].rountime=temp[0].finshTime-temp[0].arriveTime;
temp[0].value=temp[0].rountime/temp[0].serveTime;
time=temp[0].finshTime;
rt+=temp[0].rountime;
vt+=temp[0].value;
for(int i=1;i<number;i++)
{ //将此时进入内存的标志为true
for(int j=i;j<number;j++)
{
if(temp[j].arriveTime<=time&&temp[j].inMemory==false)
{
temp[j].inMemory=true;
}
}
int Pass;//临时变量
int min=99;
for(int k=1;k<number;k++)
{
//在没写入内存并且服务时间最小且没有完成的进程里面比较出最小的服务时间进程
if(temp[k].inMemory==true&&temp[k].serveTime<min&&temp[k].Isfinish==false)
{
min=temp[k].serveTime;
Pass=k;
}
}
temp[Pass].finshTime=time+temp[Pass].serveTime;
time=temp[Pass].finshTime;
temp[Pass].Isfinish=true;
temp[Pass].rountime=temp[Pass].finshTime-temp[Pass].arriveTime;
temp[Pass].value=1.0*temp[Pass].rountime/temp[Pass].serveTime;
sortSc[sc++]=Pass;
rt+=temp[Pass].rountime;
vt+=temp[Pass].value;
time1=time;
}
int begin=0;//当前时间
int last=0;//上一个完成的时间
while(begin<=time1)
{
for(int i=0;i<sc;i++)
{
if(begin==temp[sortSc[i]].arriveTime)
printf("%2d 进程%c到达内存\n\n",begin,temp[sortSc[i]].name);
if(begin==temp[0].arriveTime&&i==0) //第一个进程
{
printf("%2d 进程%c开始执行\n\n",begin,temp[0].name);
last=temp[0].finshTime;
}
if(begin==last&&i!=0&&last>=temp[sortSc[i]].arriveTime&&begin==temp[sortSc[i-1]].finshTime)
{
printf("%2d 进程%c开始执行\n\n",last,temp[sortSc[i]].name);
last=temp[sortSc[i]].finshTime;
}
if(begin==temp[sortSc[i]].finshTime)
printf("%2d 进程%c结束!\n\n",begin,temp[sortSc[i]].name);
}
begin++;
}
printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number);
}
void highRespfirstServe(PCBfc *temp,int number)
{
int time=0;
int time1=0;
double rt=0;
double vt=0.0;
int sortSc[number]={0};
int sc=1;
temp[0].finshTime=temp[0].arriveTime+temp[0].serveTime;
temp[0].rountime=temp[0].finshTime-temp[0].arriveTime;
temp[0].value=temp[0].rountime/temp[0].serveTime;
time=temp[0].finshTime;
rt+=temp[0].rountime;
vt+=temp[0].value;
for(int i=1;i<number;i++)
{
for(int j=i;j<number;j++)
{
if(temp[j].arriveTime<=time&&temp[j].inMemory==false)
{
temp[j].inMemory=true;
}
}
int Pass;
double pr=0.0;
for(int k=1;k<number;k++)
{
temp[k].priority=1.0*(time-temp[k].arriveTime+temp[k].serveTime)/temp[k].serveTime;
if(temp[k].inMemory==true&&temp[k].priority>pr&&temp[k].Isfinish==false)
{
pr=temp[k].priority;
Pass=k;
}
}
temp[Pass].finshTime=time+temp[Pass].serveTime;
time=temp[Pass].finshTime;
temp[Pass].Isfinish=true;
temp[Pass].rountime=temp[Pass].finshTime-temp[Pass].arriveTime;
temp[Pass].value=1.0*temp[Pass].rountime/temp[Pass].serveTime;
sortSc[sc++]=Pass;
rt+=temp[Pass].rountime;
vt+=temp[Pass].value;
time1=time;
}
int begin=0;
int last=0;
while(begin<=time1)
{
for(int i=0;i<sc;i++)
{
if(begin==temp[sortSc[i]].arriveTime)
printf("%2d 进程%c到达内存\n\n",begin,temp[sortSc[i]].name);
if(begin==temp[0].arriveTime&&i==0)
{
printf("%2d 进程%c开始执行\n\n",begin,temp[0].name);
last=temp[0].finshTime;
}
if(begin==last&&i!=0&&last>=temp[sortSc[i]].arriveTime&&begin==temp[sortSc[i-1]].finshTime)
{
printf("%2d 进程%c开始执行\n\n",last,temp[sortSc[i]].name);
last=temp[sortSc[i]].finshTime;
}
if(begin==temp[sortSc[i]].finshTime)
printf("%2d 进程%c结束!\n\n",begin,temp[sortSc[i]].name);
}
begin++;
}
printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number);
}
void timeRountServe(PCBfc *temp,int number)
{
int t;
double vt=0.0;
double rt=0.0;
int finish[number],run[number];
int i=0,j=0,time=0,flag=0;
queue *que;
que=create();
printf("请输入时间片长度: ");
scanf("%d",&t);
for(i=0;i<number;i++)
{
run[i]=0;
}
enter(que,0);//第一个进程进入就绪队列
while(flag<number)//
{
if(que->front!=que->rear )
{
i=out(que);
if(run[i]+t>=temp[i].serveTime)
{
time=time+(temp[i].serveTime-run[i]);
finish[i]=time;
flag++;
}
else
{
run[i]=run[i]+t;//已经运行时间加上时间片长度
for(j=0;j<number;j++)
if(temp[j].arriveTime>time&&t+time>=temp[j].arriveTime)//在temp[j]运行期间到达
{
enter(que,j);
}
time=time+t;
enter(que,i);
}
printf("当前就绪队列为:");
j=que->front;
while(j!=que->rear)
{
printf("%c ",temp[que->data[j]].name);
j=(j+1)%number;
}
printf("\n");
}
else time=time+t;
}
for(int i=0;i<number;i++)
{
temp[i].finshTime=finish[i];
temp[i].rountime=temp[i].finshTime-temp[i].arriveTime;
temp[i].value=1.0*temp[i].rountime/temp[i].serveTime;
rt+=temp[i].rountime;
vt+=temp[i].value;
}
printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number);
}
void printSc(PCBfc *temp,int number)
{
cout<<"\t进程名 到达时间 服务时间 完成时间 周转时间 带权周转"<<endl;
for(int i=0;i<number;i++)
{
printf("\t %c\t %d\t %d\t %d\t %d\t %.2lf\n",temp[i].name,temp[i].arriveTime,temp[i].serveTime,temp[i].finshTime,temp[i].rountime,temp[i].value);
}
}
/*
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
*/
这里简单的实现了先来先服务,短作业优先,高响应比,时间片轮转这
几个算法