优化后
此代码使用vs编辑器编写,其中使用到头文件的引用
下面有源码可以直接复制使用,另外底面有源码文件链接
代码不符条件的bug,请直接评论指出,会尽快修改,合作愉快
2018/11/28 修复总时间无法到达到达时间
修复进程到达时间相同
#define _CRT_SECURE_NO_WARNINGS
#define NUMBER 5
#include
#include
char process_name[NUMBER] = { 'A', 'B', 'C', 'D', 'E' };
int arrive_time[NUMBER] = { 0, 2, 2, 3, 4 };
int server_time[NUMBER] = { 1, 3, 5, 2, 4 };
int fcfs_finished[NUMBER];
int fcfs_work[NUMBER];
double a_fcks_work[NUMBER];
typedef struct name_server{
char process_name;
int arrive_time;
int server_time;
int finished;
int work;
double a_work;
double prioprity;
int is_finished;//代表轮转周期结束时,当前进程是否结束
};
void init_data(name_server *init_data);
void chang_position(name_server *temp_name_server, int index, int temp_value);
void calc_work_or_a_work(name_server *new_name_server_psa);
void print(name_server print_struct[5]);
void recovery_order(name_server *new_name_server, name_server *old_name_server);
void fcfs();
void sjf();
void psa();
//先来先服务
void fcfs() {
name_server name_server_fcfs[NUMBER];
//初始化
init_data(name_server_fcfs);
int is_true = 1;
int temp_sum = 0;
int is_wait = 0;
while (is_true){
//完成时间
int is_finished = 0;
for (int i = 0; i
//当时间无法达到到达时刻时执行
if (is_wait > NUMBER+1) {
temp_sum++;
is_wait = 0;
break;
}
//判断是否到达
if (name_server_fcfs[i].arrive_time > temp_sum) {
is_wait++;
continue;
}
if (name_server_fcfs[i].is_finished == 1){
is_finished++;
is_wait++;
if (is_finished == NUMBER){
is_true = 0;
break;
}
continue;
}
//完成时间
name_server_fcfs[i].finished = temp_sum + name_server_fcfs[i].server_time;
temp_sum += name_server_fcfs[i].server_time;
name_server_fcfs[i].is_finished = 1;
is_wait = 0;
break;
}
}
calc_work_or_a_work(name_server_fcfs);
}
//短作业优先
void sjf() {
//初始化一个进程名与服务时间有关的结构体
name_server name_server_sjf[NUMBER];
//初始化数据
init_data(name_server_sjf);
//完成时间的计算
int