运行环境 VS 2010
// 进程调度.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<stdio.h>
#include<string.h>
const int block_time=10; //定义时间片的长度为10秒
const int MAXPCB=100; //定义最大进程数
typedef struct node //定义进程结构体
{ char name[20];
int status;
int time;
int privilege;
int finished;
int wait_time;
}pcb;
pcb pcbs[MAXPCB];
int quantity;
void initial()//初始化函数
{ int i;
for(i=0;i<MAXPCB;i++)
{ strcpy(pcbs[i].name,"");
pcbs[i].status=0;
pcbs[i].time=0;
pcbs[i].privilege=0;
pcbs[i].finished=0;
pcbs[i].wait_time=0;
}
quantity=0;
}
int readData()//读数据函数
{ FILE *fp=NULL;
char fname[20];
int i;
printf("请输入进程流文件名:");
scanf("%s",fname);
if((fp=fopen(fname,"r"))==NULL) printf("错误,文件打不开,请检查文件名!\n");
else{
while(!feof(fp))
{ fscanf(fp,"%s %d %d %d",pcbs[quantity].name,&pcbs[quantity].status,
&pcbs[quantity].time,&pcbs[quantity].privilege);
quantity++;
}
printf("输出所读入的数据:\n");
printf("进程名 进程状态 所需时间 优先数\n");
for(i=0;i<quantity;i++)
{printf(" %s %d %d %d\n",pcbs[i].name,pcbs[i].status,pcbs[i].time,pcbs[i].privilege);
}
return(1);
}
return(0);
}
void init()//重置数据,以供另一个算法使用
{ int i;
for(i=0;i<MAXPCB;i++)
{ pcbs[i].finished=0; pcbs[i].wait_time=0;
}
}
void FIFO() //先进先出算法
{ //printf("请编写代码,实现"先进先出算法"!\n");
double sum=0;
for(int i=0;i<quantity;i++){
if(i==0)
pcbs[i].wait_time=pcbs[i].time;
else
pcbs[i].wait_time=pcbs[i].time+pcbs[i-1].wait_time;
pcbs[i].finished=1;
sum+=pcbs[i].wait_time;
}
printf("FIFO算法执行流\n");
for(int i=0;i<quantity;i++){
printf("%s wait_time=%d\n",pcbs[i].name,pcbs[i].wait_time);
}
printf("平均等待时间:%lf\n",sum/quantity);
/
}
void privilege()//优先数调度算法
{ //printf("请编写代码,实现"优先数调度算法"!\n");
int sign,k,time=0;
double sum=0;
printf("privilege算法执行流\n");
/
for(int i=0;i<quantity;i++){
sign=10;
for(int j=0;j<quantity;j++){
if(pcbs[j].finished==0){
if(pcbs[j].privilege<sign){
sign=pcbs[j].privilege;
k=j;
}
}
}
pcbs[k].finished=1;
time+=pcbs[k].time;
pcbs[k].wait_time=time;
sum+=pcbs[k].wait_time;
printf("%s wait_time=%d\n",pcbs[k].name,pcbs[k].wait_time);
}
printf("平均等待时间:%lf\n",sum/quantity);
}
void timer()//时间片轮转调度算法
{ int i,j,number,flag=1;
int passed_time=0;
int max_time=0;
int round=0;
int queue[1000];
int total=0;
while(flag==1)
{ flag=0;
number=0;
for(i=0;i<quantity;i++){
if(pcbs[i].finished==0) {
number++;
j=i;
}
}
if(number==1) {
queue[total]=j; total++; pcbs[j].finished=1;
}
if(number>1)
{ for(i=0;i<quantity;i++)
{ if(pcbs[i].finished==0)
{ flag=1;
queue[total]=i;
total++;
if(pcbs[i].time<=block_time*(round+1)) { pcbs[i].finished=1; }
}//if
} //for
} //if
round++;
} //while
if(queue[total-1]==queue[total-2]) { total--; }
printf("\n*******************************************************\n");
printf("时间片轮转调度执行流:\n");
for(i=0;i<total;i++) printf(" %s \n",pcbs[queue[i]].name);
}
void main()//主函数
{ int flag;
printf(" /********************* 进程调度 ********************/ \n");
initial();
flag=readData();
if(flag==1)
{ FIFO();
init();
privilege();
init();
timer();
}
}
读取文件为data.txt