#include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
//定义“空”
#define null 0
//定义进程的个数 process_num
int process_num = 0;
//定义时间 current_time
int current_time = 0;
///定义时间片大小 time_slice
int time_slice = 0;
struct process
{
char process_name[40];
int arrive_time;
int sever_time;
int finish_time;
int turnover_time;
float weight_time;
int left_time;
struct process *next;
}*pro;
void init()//初始化
{
int total = 0;
struct process *process_p;
while(total < process_num)
{
struct process *process_temp;
process_temp = (struct process *)malloc(sizeof(struct process));
//printf("请依次输入进程名称、到达时间和服务时间:");
scanf("%s %d %d", process_temp->process_name, &process_temp->arrive_time, &process_temp->sever_time);
//scanf("%s %d", process_temp->process_name, &process_temp->arrive_time);
//process_temp->sever_time = rand()%11;
process_temp->finish_time = -1;
process_temp->turnover_time = -1;
process_temp->weight_time = -1;
process_temp->left_time = process_temp->sever_time;
if(pro == null)
{
pro = process_temp;
process_temp->next = pro;
}
else
{
process_p = pro;
while(process_p->next != pro)
{
process_p = process_p->next;
}
process_p->next = process_temp;
process_temp->next = pro;
}
total++;
}
}
void reset()//重置
{
current_time = 0;
struct process *process_p;
process_p = pro;
while(process_p->next != pro)
{
process_p->finish_time = -1;
process_p->turnover_time = -1;
process_p->weight_time = -1;
process_p->left_time = process_p->sever_time;
process_p = process_p->next;
}
process_p->finish_time = -1;
process_p->turnover_time = -1;
process_p->weight_time = -1;
process_p->left_time = process_p->sever_time;
}
//先来先服务
void FCFS()
{
struct process *process_p;
printf("\n进程执行顺序:");
process_p = pro;
while(process_p->next != pro)
{
if(process_p->arrive_time <= current_time)
{
printf("%s", process_p->process_name);
process_p->finish_time = current_time + process_p->sever_time;
process_p->turnover_time = process_p->finish_time - process_p->arrive_time;
process_p->weight_time = (float)process_p->turnover_time/(float)process_p->sever_time;
process_p->left_time = 0;
current_time = process_p->finish_time;
}
else
{
printf("%s", process_p->process_name);
process_p->finish_time = process_p->arrive_time + process_p->sever_time;
process_p->turnover_time = process_p->finish_time - process_p->arrive_time;
process_p->weight_time = (float)process_p->turnover_time/(float)process_p->sever_time;
process_p->left_time = 0;
current_time = process_p->finish_time;
}
process_p = process_p->next;
}
//做最后一个
if(process_p->arrive_time <= current_time)
{
printf("%s", process_p->process_name);
process_p->finish_time = current_time + process_p->sever_time;
process_p->turnover_time = process_p->finish_time - process_p->arrive_time;
process_p->weight_time = (float)process_p->turnover_time/(float)process_p->sever_time;
process_p->left_time = 0;
current_time = process_p->finish_time;
}
else
{
process_p->finish_time = process_p->arrive_time + process_p->sever_time;
process_p->turnover_time = process_p->finish_time - process_p->arrive_time;
process_p->weight_time = (float)process_p->turnover_time/(float)process_p->sever_time;
process_p->left_time = 0;
current_time = process_p->finish_time;
}
}
//短进程优先
void JPF()
{
struct process *process_p, *process_temp, *process_t;
process_temp = null;
int lefttime = 100;
int flag = 0;//没有可以运行的进程
//printf("\n进程执行顺序:");
process_p = pro;
while(process_p->next != pro)
{
if(process_p->left_time > 0 && process_p->arrive_time <= current_time)
{
//printf("%s", process_p->process_name);
if(process_p->left_time < lefttime)
{
lefttime = process_p->left_time;
process_temp = process_p;
}
else if(process_p->left_time == lefttime)
{
;
}
}
process_p = process_p->next;
}
if(process_p->left_time > 0 && process_p->arrive_time <= current_time)
{
//printf("%s", process_p->process_name);
if(process_p->left_time <= lefttime)
{
lefttime = process_p->left_time;
process_temp = process_p;
}
}
if(process_temp == null)
{
process_t = pro;
while(process_t->next != pro)
{
if(process_t->left_time > 0)
{
flag = 1;
break;
}
process_t = process_t->next;
}
if(process_t->left_time > 0)
{
flag = 1;
}
if(flag == 0)
{
return;
}
else
{
current_time++;
JPF();
}
}
else
{
current_time++;
//修改process_temp数据
process_temp->left_time--;
printf("%s", process_temp->process_name);
if(process_temp->left_time == 0)
{
process_temp->finish_time = current_time;
process_temp->turnover_time = process_temp->finish_time - process_temp->arrive_time;
process_temp->weight_time = (float)process_temp->turnover_time/(float)process_temp->sever_time;
}
JPF();
}
}
void dispaly()//显示输出
{
struct process *process_p;
float turnover_average = 0, weight_average = 0;
printf("\n进程名称: ");
process_p = pro;
while(process_p->next != pro)
{
printf("%s ", process_p->process_name);
process_p = process_p->next;
}
printf("%s 平均\n", process_p->process_name);
printf("到达时间: ");
process_p = pro;
while(process_p->next != pro)
{
printf("%d ", process_p->arrive_time);
process_p = process_p->next;
}
printf("%d\n", process_p->arrive_time);
printf("服务时间: ");
process_p = pro;
while(process_p->next != pro)
{
printf("%d ", process_p->sever_time);
process_p = process_p->next;
}
printf("%d\n", process_p->sever_time);
printf("完成时间: ");
process_p = pro;
while(process_p->next != pro)
{
printf("%d ", process_p->finish_time);
process_p = process_p->next;
}
printf("%d\n", process_p->finish_time);
printf("周转时间: ");
process_p = pro;
while(process_p->next != pro)
{
printf("%d ", process_p->turnover_time);
turnover_average += process_p->turnover_time;
process_p = process_p->next;
}
turnover_average += process_p->turnover_time;
turnover_average /= (float)process_num;
printf("%d %.2f\n", process_p->turnover_time, turnover_average);
printf("带权周转: ");
process_p = pro;
while(process_p->next != pro)
{
printf("%.2f ", process_p->weight_time);
weight_average += process_p->weight_time;
process_p = process_p->next;
}
weight_average += process_p->weight_time;
weight_average /= (float)process_num;
printf("%.2f %.2f\n", process_p->weight_time, weight_average);
}
int main(int argc, char* argv[])
{
char filename[10];
//int choice;
printf("\n ----------- 进程调度算法模拟 -----------\n\n");
printf("请输入进程初始化文件:");
scanf("%s", filename);
//判断文件是否为空
if(freopen(filename,"r",stdin)==null){
printf("读入文件不存在,请确定后重新运行程序!\n");
exit(0);
}
scanf("%d", &process_num);
init();
printf("\n先来先服务:\n");
FCFS();
printf("\n");
dispaly();
reset();
printf("\n短进程优先:\n");
printf("\n进程执行顺序:");
JPF();
printf("\n");
dispaly();
fclose(stdin);
return 0;
}