博主在进行Linux0.11实验六的时候发现了py文件不会用的情况,所以自己写了个c来进行Linux调度算法性能的实现
#include<stdio.h>
#define NR_TASKS 64
#define state_N 0
#define state_J 1
#define state_R 2
#define state_W 3
#define state_E 4
struct Process {
int turnaround[500];
int waiting[500];
int cpu_burst[500];
double weight[500];
int num;//该进程的调用次数
int time[5];
}pro[NR_TASKS];
int find_max(int pid) {//查找进程pid的上一个状态
int max = 0;
int maxi = 0;
for (int i = 0; i < 5; i++) {
if (pro[pid].time[i] > max) {
max = pro[pid].time[i];
maxi = i;
}
}
return maxi;
}
int main() {
FILE* fp1, *fp2;
/*if ((fp1 = fopen("D:\\Documents\\mlfq_log.txt", "r")) == NULL) {
printf("open failure");
}*/
fp1 = fopen("LOG.TXT", "r");
//fp2 = fopen("D:\\Documents\\mlfq_out.txt", "w");
fp2 = fopen("out.txt", "w");
for (int i = 0; i < NR_TASKS; i++) {
pro[i].num = 0;
pro[i].time[0] = pro[i].time[1] = pro[i].time[2] = pro[i].time[3] = pro[i].time[4] = 0;
}
int pid, jiffies;
char state;
while (!feof(fp1)) {
fscanf(fp1, "%d %c %d", &pid, &state, &jiffies) == 1;
int last_state = find_max(pid);
switch (state) {
case 'N':
pro[pid].time[0] = jiffies;
pro[pid].cpu_burst[pro[pid].num] = pro[pid].waiting[pro[pid].num] = 0;
break;
case 'J':
switch (last_state) {
case 0:
pro[pid].waiting[pro[pid].num] += (jiffies - pro[pid].time[0]);
break;
case 3:
pro[pid].waiting[pro[pid].num] += (jiffies - pro[pid].time[3]);
break;
case 2:
pro[pid].cpu_burst[pro[pid].num] += (jiffies - pro[pid].time[2]);
break;
}
pro[pid].time[1] = jiffies;
break;
case 'R':
switch (last_state) {
case 2:
pro[pid].cpu_burst[pro[pid].num] += (jiffies - pro[pid].time[2]);
break;
case 1:
pro[pid].waiting[pro[pid].num] += (jiffies - pro[pid].time[1]);
break;
}
pro[pid].time[2] = jiffies;
break;
case 'W':
switch (last_state) {
case 2:
pro[pid].cpu_burst[pro[pid].num] += (jiffies - pro[pid].time[2]);
break;
}
pro[pid].time[3] = jiffies;
break;
case 'E':
pro[pid].time[4] = jiffies;
pro[pid].turnaround[pro[pid].num] = pro[pid].time[4] - pro[pid].time[0];
if (pro[pid].cpu_burst[pro[pid].num] == 0)
pro[pid].weight[pro[pid].num] = 0;
else
pro[pid].weight[pro[pid].num] = pro[pid].turnaround[pro[pid].num] * 1.0 / pro[pid].cpu_burst[pro[pid].num];
pro[pid].num++;
break;
}
}
double turnaround_aver = 0;
double waiting_aver = 0;
double weight_aver = 0;
int process_num = 0;
double throughput;
for (int i = 0; i < NR_TASKS; i++) {
for (int j = 0; j < pro[i].num; j++) {
waiting_aver += pro[i].waiting[j];
turnaround_aver += pro[i].turnaround[j];
weight_aver += pro[i].weight[j];
process_num++;
}
}
turnaround_aver /= (process_num * 100.0);
waiting_aver /= (process_num * 100.0);
weight_aver /= (process_num * 100.0);
throughput = process_num * 100.0 / jiffies * 1.0;
//fprintf(fp2, "Performance scheduling indicators for multi-level feedback queues:\n");
fprintf(fp2, "Performance scheduling indicators for original:\n");
fprintf(fp2, "averge turnaround time = %lfs\n", turnaround_aver);
fprintf(fp2, "averge waiting time = %lfs\n", waiting_aver);
fprintf(fp2, "averge weighted time = %lfs\n", weight_aver);
fprintf(fp2, "system throughput = %lf/s\n", throughput);
fclose(fp1);
fclose(fp2);
return 0;
}