#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#define getpch(type)(type*)malloc(sizeof(type))
/*
作者:顾金帅
本程序采用模块化设计,模拟在单处理器多进程操作系统的cpu调度,方便维护
*/
typedef struct pcb PCB;
// 定义进程控制块
struct pcb
{
int id; //标识符/优先权
char name[10]; //名称
int time_start; //到达时间
int time_need; //运行时间
int time_left; //剩余运行时间
int time_used; //已使用时间
char condit; //进程状态
};
//设置数据
int num=6; //进程数量
PCB pcbdata[6]={
{1000,"A04",0,4,4,0,'R'},
{1001,"B23",2,3,3,0,'R'},
{1002,"C15",1,5,5,0,'R'},
{1003,"D42",4,2,2,0,'R'},
{1004,"E37",3,7,7,0,'R'},
{1005,"F59",5,9,9,0,'R'},
};
int ready[10]; //就绪队列,存放进程在pcbdata中的位置
double order[10]; //记录排序使用哪个数值作为排序对象
//输入
void input()
{
int i;
printf("进程总数为:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
pcbdata[i].id=1000+i;
printf("输入第%d个进程名:",i+1);
scanf("%s",&pcbdata[i].name);
printf("输入第%d个进程到达时间:",i+1);
scanf("%d",&pcbdata[i].time_start);
printf("输入第%d个进程服务时间:",i+1);
scanf("%d",&pcbdata[i].time_need);
pcbdata[i].time_left=pcbdata[i].time_need;
printf("\n");
pcbdata[i].time_used=0;
pcbdata[i].condit='R';
}
}
//***********************调度函数
//先来先服务算法
void FCFS()
{
int i,j,temp;
double k;
char p;
printf("是否对进程重新赋值(y/n):");
scanf("%s",&p);
if(p == 'y') input();
for(i=0;i<num;i++)
{
order[i]=pcbdata[i].time_start;
ready[i]=i;
}
for(i=0;i<num;i++) //按照到达时间排序
for(j=i+1;j<num;j++)
{
if(order[i]>order[j])
{
temp=order[i];
order[i]=order[j];
order[j]=temp;
temp=ready[i];
ready[i]=ready[j];
ready[j]=temp;
}
}
printf("\n***************先来先去算法调度:***************\n");
//到达时间初始赋值
temp=pcbdata[ready[0]].time_start;
for(i=0;i<num;i++)
{
printf("第%d个进程:%s,",i+1,pcbdata[ready[i]].name);
printf("本进程正在运行......");
printf("运行完毕\n");
temp+=pcbdata[ready[i]].time_need;
j=temp-pcbdata[ready[i]].time_start;//周转时间
k=(float)j/pcbdata[ready[i]].time_need;//带权周转时间
printf("完成时间:%d,周转时间:%d,带权周转时间:%.1f\n",temp,j,k);
}
printf("******************所有进程调度完毕******************\n\n");
}
//短作业优先算法
void SJF()
{
int i,j,c,m,temp;
double k;
char p;
printf("是否对进程重新赋值(y/n):");
scanf("%s",&p);
if(p == 'y') input();
for(i=0;i<num;i++)
{
order[i]=pcbdata[i].time_need;
ready[i]=i;
}
for(i=0;i<num;i++) //按照运行时间长短排序
for(j=i+1;j<num;j++)
{
if(order[i]>order[j])
{
temp=order[i];
order[i]=order[j];
order[j]=temp;
temp=ready[i];
ready[i]=ready[j];
ready[j]=temp;
}
}
printf("\n**************短作业优先算法调度:**************\n");
//到达时间初始赋值
temp=pcbdata[0].time_start;
for(i=0;i<num-1;i++)
{
if(pcbdata[i].time_start<temp)
{
m=i;
temp=pcbdata[i].time_start;
}
}
for(i=0;i<num;i++)
{
for(j=i+1;j<num-1;j++)
{
if(pcbdata[ready[i]].time_start>temp)
{
c=order[j];
order[j]=order[i];
order[i]=c;
c=ready[j];
ready[j]=ready[i];
ready[i]=c;
}
}
printf("第%d个进程:%s,",i+1,pcbdata[ready[i]].name);
printf("本进程正在运行......");
printf("运行完毕\n");
temp+=pcbdata[ready[i]].time_need;
j=temp-pcbdata[ready[i]].time_start;//周转时间
k=(float)j/pcbdata[ready[i]].time_need;//带权周转时间
printf("完成时间:%d,周转时间:%d,带权周转时间:%.1f\n",temp,j,k);
}
printf("******************所有进程调度完毕******************\n\n");
}
//优先级调度算法
void PSA()
{
int i,j,m,c,temp;
double k;
char p;
printf("是否对进程重新赋值(y/n):");
scanf("%s",&p);
if(p == 'y') input();
for(i=0;i<num;i++)
{
order[i]=pcbdata[i].id;
ready[i]=i;
}
for(i=0;i<num;i++) //按照优先权排序
for(j=i+1;j<num;j++)
{
if(order[i]>order[j])
{
temp=order[i];
order[i]=order[j];
order[j]=temp;
temp=ready[i];
ready[i]=ready[j];
ready[j]=temp;
}
}
printf("\n*******************优先级调度:*******************\n");
//到达时间初始赋值
temp=pcbdata[0].time_start;
for(i=0;i<num-1;i++)
{
if(pcbdata[i].time_start<temp)
{
m=i;
temp=pcbdata[i].time_start;
}
}
for(i=0;i<num;i++)
{
for(j=i+1;j<num-1;j++)
{
if(pcbdata[ready[i]].time_start>temp)
{
c=order[j];
order[j]=order[i];
order[i]=c;
c=ready[j];
ready[j]=ready[i];
ready[i]=c;
}
}
printf("第%d个进程:%s,",i+1,pcbdata[ready[i]].name);
printf("本进程正在运行......");
printf("运行完毕\n");
temp+=pcbdata[ready[i]].time_need;
j=temp-pcbdata[ready[i]].time_start;//周转时间
k=(float)j/pcbdata[ready[i]].time_need;//带权周转时间
printf("完成时间:%d,周转时间:%d,带权周转时间:%.1f\n",temp,j,k);
}
printf("******************所有进程调度完毕******************\n\n");
}
//高响应比优先调度算法
void HRRN()
{
int i,j,temp,c,d,m=0,n=0;
int arr[num];
double k,b;
char p;
printf("是否对进程重新赋值(y/n):");
scanf("%s",&p);
if(p == 'y') input();
for(i=0;i<num;i++)
arr[i]=-1;
printf("\n***************高响应比优先调度:***************\n");
//到达时间初始赋值
temp=pcbdata[0].time_start;
for(i=0;i<num-1;i++)
{
if(pcbdata[i].time_start<temp)
{
m=i;
temp=pcbdata[i].time_start;
}
}
order[0]=(double)(temp+pcbdata[m].time_need)/pcbdata[m].time_need;
arr[n]=m;
n++;
printf("第1个进程:%s,",pcbdata[ready[0]].name);
printf("本进程正在运行......");
printf("运行完毕\n");
temp+=pcbdata[ready[0]].time_need;
j=temp-pcbdata[ready[0]].time_start;//周转时间
k=(float)j/pcbdata[ready[0]].time_need;//带权周转时间
printf("响应比为:%.1f\n",order[0]);
printf("完成时间:%d,周转时间:%d,带权周转时间:%.1f\n",temp,j,k);
order[0]=0;
//按照高响应比排序调度
for(i=1;i<num;i++)
{
//重新赋值高响应比
for(j=0;j<num;j++)
{
for(d=0;d<num;d++)
{
if(j==arr[d]||pcbdata[j].time_start>temp)
{
order[j]=0;
break;
}
else
{
order[j]=(double)(temp-pcbdata[j].time_start+pcbdata[j].time_need)/pcbdata[j].time_need;
ready[j]=j;
}
}
}
//调度
b=0.0;
for(j=0;j<num;j++)
{
if(order[j]>b)
{
c=j;
b=order[j];
}
}
printf("order[c=%d]=%f ",c,order[c]);
printf("\n第%d个进程:%s,",i+1,pcbdata[ready[c]].name);
printf("本进程正在运行......");
printf("运行完毕\n");
temp+=pcbdata[ready[c]].time_need;
j=temp-pcbdata[ready[c]].time_start;//周转时间
k=(float)j/pcbdata[ready[c]].time_need;//带权周转时间
printf("响应比为:%.1f\n",order[c]);
printf("完成时间:%d,周转时间:%d,带权周转时间:%.1f\n",temp,j,k);
arr[n]=c;
n++;
}
printf("******************所有进程调度完毕******************\n\n");
}
int main()
{
int sch=1;
while(sch!=0)
{
printf("请选择算法:\n");
printf("(1)先来先去 FCFS\n");
printf("(2)短作业优先 SJF\n");
printf("(3)优先级 PSA\n");
printf("(4)高响应比优先 HRRN\n");
printf("(0)退出\n");
printf("请输入上述的一个数字:");
scanf("%d",&sch);
switch(sch)
{
case 1:FCFS();
break;
case 2:SJF();
break;
case 3:PSA();
break;
case 4:HRRN();
break;
case 0:printf("退出程序");
break;
}
}
return 0;
}
/*
void dis_pcb(PCB*pr)
{
printf("%s的PCB:\n",pr->name);
printf("标识符--%d,状态--%c,到达时间--%d\n",pr->id,pr->condit,pr->time_start);
printf("服务时间--%d,剩余运行时间%d,已用时间--%d\n",pr->time_need,pr->time_left,pr->time_used);
printf("*********************\n");
}
void dis_pcb_all()
{
int i;
printf("****当前所有进程状态****");
for(i=
- 1
- 2
- 3
- 4
前往页