对Linux0.11计算调度算法的性能

博主在进行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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值