操作系统 作业调度(先来先服务、最短作业优先、最高响应比优先)

该实验通过编程模拟了三种作业调度算法:先来先服务(FCFS)、最短作业优先(SJF)和最高响应比优先(HRN),旨在理解作业管理的过程和这些算法的工作原理。代码实现了读取作业数据,计算并输出调度结果,包括等待时间、周转时间和响应比等关键指标。实验总结提到,使用类来组织数据可能会比二维数组更优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的

        模拟作业调度算法,学习作业在操作系统中的调度过程,加深对作业管理的理解。

二、实验内容

        本实验模拟单处理器系统的作业调度,加深对作业调度算法的理解。用某种语言编程实现先 来先服务、短作业优先和最高响应比优先算法。有一些简单的界面,能够运行,仿真操作系统中 作业调度的原理和过程。

(1)按照先来先服务

(2)按照最短作业优先

 

 (3)按照最高响应比优先

三、实验原理

        作业调度算法主要有先来先服务法 FCFS、短作业优先法 SJF、最高响应比优先法、定时轮转 法等。本实验响应比计算公式为:RP = (等待时间+要求服务时间)/要求服务时间。

四、代码实现

(1)先来先服务

​
void fcfs(int num) //先来先服务
{
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < 12; j++) {
			workfcfs[i][j] = work[i][j];
		}
	}
	int i = 0;
	//开始时间
	workfcfs[i][4] = workfcfs[i][1];
	workfcfs[i][5] = workfcfs[i][2];
	//完成时间
	workfcfs[i][6] = workfcfs[i][4] + (workfcfs[i][5] + workfcfs[i][3]) / 60;
	workfcfs[i][7] = (workfcfs[i][5] + workfcfs[i][3]) % 60;
	//等待时间
	workfcfs[i][8] = 0;
	//周转时间
	workfcfs[i][9] = (workfcfs[i][6] * 60 + workfcfs[i][7]) - (workfcfs[i][1] * 60 + workfcfs[i][2]);
	//周转系数
	workfcfs[i][10] = (workfcfs[i][9]) * 1.0 / (workfcfs[i][3]);
	i++;
	for (; i < num; i++) {
		if ((workfcfs[i][1] * 60 + workfcfs[i][2]) >= (workfcfs[i - 1][6] * 60 + workfcfs[i - 1][7])) {
			workfcfs[i][4] = workfcfs[i][1];
			workfcfs[i][5] = workfcfs[i][2];
		}
		else
		{
			workfcfs[i][4] = workfcfs[i-1][6];
			workfcfs[i][5] = workfcfs[i-1][7];
		}
		//完成时间
		workfcfs[i][6] = workfcfs[i][4] + (workfcfs[i][5] + workfcfs[i][3]) / 60;
		workfcfs[i][7] = (workfcfs[i][5] + workfcfs[i][3]) % 60;
		//等待时间
		workfcfs[i][8] = (workfcfs[i][4] * 60 + workfcfs[i][5]) - (workfcfs[i][1] * 60 + workfcfs[i][2]);
		//周转时间
		workfcfs[i][9] = (workfcfs[i][6] * 60 + workfcfs[i][7]) - (workfcfs[i][1] * 60 + workfcfs[i][2]);
		//周转系数
		workfcfs[i][10] = (workfcfs[i][9]) * 1.0 / (workfcfs[i][3]);
	}
}

void printfcfs(int num) //输出先来先服务
{
	float pjzz = 0;//平均周转时间
	float dqpjzz = 0;//平均带权周转时间
	printf("\n模拟进程FCFS(先来先服务)调度的输出结果:\n");
	printf("作业编号  作业名称  提交时间  要求服务运行时间 开始时间 完成时间  等待时间      周转时间\n");
	for (int i = 0; i < num; i++) {
		printf("%d%12s        %02d:%02d        %d(分钟)\t ", workfcfs[i][0], workname[i],workfcfs[i][1],workfcfs[i][2],workfcfs[i][3]);
		printf("%02d:%02d   %02d:%02d\t  %d(分钟)\t%d(分钟)\n",workfcfs[i][4],workfcfs[i][5],workfcfs[i][6],workfcfs[i][7],workfcfs[i][8],workfcfs[i][9]);
		pjzz += workfcfs[i][9];
		dqpjzz += workfcfs[i][10];
	}
	printf("平均周转时间为:%.2f", pjzz /num);
	printf("\n平均带权周转时间为:%.2f\n\n", dqpjzz /num);
}

​

(2)输出最短作业优先

int findshort(int now,int num) //寻找已经到达的最短作业
{
	int shortID = worksjf[0][0]-1;
//先寻找已经到达的作业中有没有符合要求的
	for (int i = 1; i < num; i++) {
		if (worksjf[i][1] * 60 + worksjf[i][2] <= now && worksjf[i][3] <= maxtime&&worksjf[i][11]==0) {
			shortID = worksjf[i][0]-1;
		}
	}
//假如已到达时间内没有作业,就找到达时间外的
	if(shortID==worksjf[0][0]-1){
		for (int j = 1; j < num; j++) {
			if (worksjf[j][3] <=maxtime && worksjf[j][11] == 0) {
				shortID = worksjf[j][0]-1;
			}
		}
	}
//如果都没找到,就返回一个不存在的值,可以自己调
	if (shortID ==0)return 6;
	worksjf[shortID][11] = 1;
	return shortID;
}

void sjf(int num) //最短作业优先
{
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < 12; j++) {
			worksjf[i][j] = work[i][j];
		}
	}
	int i = 0;
	//开始时间
	worksjf[i][4] = worksjf[i][1];
	worksjf[i][5] = worksjf[i][2];
	//完成时间
	worksjf[i][6] = worksjf[i][4] + (worksjf[i][5] + worksjf[i][3]) / 60;
	worksjf[i][7] = (worksjf[i][5] + worksjf[i][3]) % 60;
	//等待时间
	worksjf[i][8] = 0;
	//周转时间
	worksjf[i][9] = (worksjf[i][6] * 60 + worksjf[i][7]) - (worksjf[i][1] * 60 + worksjf[i][2]);
	//周转系数
	worksjf[i][10] = (worksjf[i][9]) * 1.0 / (worksjf[i][3]);
	worksjf[i][11] = 1;
	worksjfid[i]=worksjf[i][0]-1;
	int ID = i;
	int now= worksjf[i][6] * 60 + worksjf[i][7];
	i++;
	for (; i < num; i++) {
		int lastID = ID;
		ID = findshort(now, num);
		worksjfid[i] = ID;
		if ((worksjf[ID][1] * 60 + worksjf[ID][2]) >= (worksjf[lastID][6] * 60 + worksjf[lastID][7])) {
			worksjf[ID][4] = worksjf[ID][1];
			worksjf[ID][5] = worksjf[ID][2];
		}
		else
		{
			worksjf[ID][4] = worksjf[lastID][6];
			worksjf[ID][5] = worksjf[lastID][7];
		}
		//完成时间
		worksjf[ID][6] = worksjf[ID][4] + (worksjf[ID][5] + worksjf[ID][3]) / 60;
		worksjf[ID][7] = (worksjf[ID][5] + worksjf[ID][3]) % 60;
		now = worksjf[ID][6] * 60 + worksjf[ID][7];
		//等待时间
		worksjf[ID][8] = (worksjf[ID][4] * 60 + worksjf[ID][5]) - (worksjf[ID][1] * 60 + worksjf[ID][2]);
		//周转时间
		worksjf[ID][9] = (worksjf[ID][6] * 60 + worksjf[ID][7]) - (worksjf[ID][1] * 60 + worksjf[ID][2]);
		//周转系数
		worksjf[ID][10] = (worksjf[ID][9]) * 1.0 / (worksjf[ID][3]);
	}
}

void printsjf(int num) {
	float pjzz = 0;//平均周转时间
	float dqpjzz = 0;//平均带权周转时间
	printf("\n模拟进程SJF(最短作业优先)调度的输出结果:\n");
	printf("作业编号  作业名称  提交时间  要求服务运行时间 开始时间 完成时间  等待时间      周转时间\n");
	for (int k = 0; k < num; k++) {
		int i = worksjfid[k];
		printf("%d%12s        %02d:%02d        %d(分钟)\t ", worksjf[i][0],workname[i], worksjf[i][1], worksjf[i][2], worksjf[i][3]);
		printf("%02d:%02d   %02d:%02d\t  %d(分钟)\t%d(分钟)\n", worksjf[i][4], worksjf[i][5], worksjf[i][6], worksjf[i][7], worksjf[i][8], worksjf[i][9]);
		pjzz += worksjf[i][9];
		dqpjzz += worksjf[i][10];
	}
	printf("平均周转时间为:%.2f", pjzz / num);
	printf("\n平均带权周转时间为:%.2f\n\n", dqpjzz / num);
}

(3)按照最高响应比优先

int findmh(int now, int num,int lastID) //寻找已经到达的最高响应比作业
{
	int starttime = 0, waittime = 0;
	float high = 0;
	int ID = 6;
	for (int i = 1; i < num; i++) {
		if (workmh[i][11] == 0) {
//先计算开始时间
			if ((workmh[i][1] * 60 + workmh[i][2]) >= (workmh[lastID][6] * 60 + workmh[lastID][7])) {
				starttime = workmh[i][1] * 60 + workmh[i][2];
			}
			else
			{
				starttime = workmh[lastID][6] * 60 + workmh[lastID][7];
			}
//计算等待时间
			waittime = starttime - (workmh[i][1] * 60 + workmh[i][2]);
//计算最高响应比并记录当前ID
            float d=(waittime + workmh[i][3])*(1.0) / workmh[i][3];
			if (d > high) {
				high = d;
				ID = i;
			}
		}
	}
	if (ID == 6)return 6;
	workmh[ID][11] = 1;
	return ID;
}

void mostxy(int num) //最高响应比优先
{
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < 12; j++) {
			workmh[i][j] = work[i][j];
		}
	}
	int i = 0;
	//开始时间
	workmh[i][4] = workmh[i][1];
	workmh[i][5] = workmh[i][2];
	//完成时间
	workmh[i][6] = workmh[i][4] + (workmh[i][5] + workmh[i][3]) / 60;
	workmh[i][7] = (workmh[i][5] + workmh[i][3]) % 60;
	//等待时间
	workmh[i][8] = 0;
	//周转时间
	workmh[i][9] = (workmh[i][6] * 60 + workmh[i][7]) - (workmh[i][1] * 60 + workmh[i][2]);
	//周转系数
	workmh[i][10] = (workmh[i][9]) * 1.0 / (workmh[i][3]);
	workmh[i][11] = 1;
	workmhid[i] = workmh[i][0] - 1;
	int ID = i;
	int now = workmh[i][6] * 60 + workmh[i][7];
	i++;
	for (; i < num; i++) {
		int lastID = ID;
		ID = findmh(now, num,lastID);
		workmhid[i] = ID;
		if ((workmh[ID][1] * 60 + workmh[ID][2]) >= (workmh[lastID][6] * 60 + workmh[lastID][7])) {
			workmh[ID][4] = workmh[ID][1];
			workmh[ID][5] = workmh[ID][2];
		}
		else
		{
			workmh[ID][4] = workmh[lastID][6];
			workmh[ID][5] = workmh[lastID][7];
		}
		//完成时间
		workmh[ID][6] = workmh[ID][4] + (workmh[ID][5] + workmh[ID][3]) / 60;
		workmh[ID][7] = (workmh[ID][5] + workmh[ID][3]) % 60;
		now = workmh[ID][6] * 60 + workmh[ID][7];
		//等待时间
		workmh[ID][8] = (workmh[ID][4] * 60 + workmh[ID][5]) - (workmh[ID][1] * 60 + workmh[ID][2]);
		//周转时间
		workmh[ID][9] = (workmh[ID][6] * 60 + workmh[ID][7]) - (workmh[ID][1] * 60 + workmh[ID][2]);
		//周转系数
		workmh[ID][10] = (workmh[ID][9]) * 1.0 / (workmh[ID][3]);
	}
}

void printmh(int num) {
	float pjzz = 0;//平均周转时间
	float dqpjzz = 0;//平均带权周转时间
	printf("\n模拟进程最高响应比调度的输出结果:\n");
	printf("作业编号  作业名称  提交时间  要求服务运行时间 开始时间 完成时间  等待时间      周转时间\n");
	for (int k = 0; k < num; k++) {
		int i = workmhid[k];
		printf("%d%12s        %02d:%02d        %d(分钟)\t ", workmh[i][0], workname[i], workmh[i][1], workmh[i][2], workmh[i][3]);
		printf("%02d:%02d   %02d:%02d\t  %d(分钟)\t%d(分钟)\n", workmh[i][4], workmh[i][5], workmh[i][6], workmh[i][7], workmh[i][8], workmh[i][9]);
		pjzz += workmh[i][9];
		dqpjzz += workmh[i][10];
	}
	printf("平均周转时间为:%.2f", pjzz / num);
	printf("\n平均带权周转时间为:%.2f\n\n", dqpjzz / num);
}

五、实验总结

        这个实验用的二维数组存储数据,比较笨重,可以自定义一个类存储数据再用数组存储类,这样更好操作,而且类里面的名字也会比二维数组更好辨识,本文更多的是提供思路,希望有所帮助qwq。

整个代码如下:

#include<iostream>
using namespace std;

int work[10][20];//存放作业数据
int workfcfs[10][20];//fcfs数据
int worksjf[10][20];//sjf数据
int workmh[10][20];//mh数据
char workname[10][10];//存放作业名字
int worksjfid[20];//sjfid顺序
int workmhid[20];//mhid顺序
int maxtime=0;//作业中最长进程时间

/*
work[][0]作业编号
work[][1] work[][2]提交时间
work[][3]要求服务运行时间
work[][4] work[][5]开始时间
work[][6] work[][7]完成时间
work[][8]等待时间
work[][9]周转时间
work[][10]周转系数
work[][11]记录作业是否已调用
*/

int input() {
	FILE* file = fopen("作业调度.txt", "rt");
	printf("作业编号  作业名称  提交时间  要求服务运行时间(分钟)\n");
	int i = 0;
	while (1) {
		if (EOF == fscanf(file, "%d %s %d:%d %d", &work[i][0],&workname[i],&work[i][1], &work[i][2], &work[i][3]))break;
		printf("%d%13s       %02d:%02d %8d\n", work[i][0], workname[i], work[i][1], work[i][2], work[i][3]);
		work[i][11] = 0;//当前未执行
		if (work[i][3] > maxtime)maxtime = work[i][3];
		i++;
	}
	return i;
}

void fcfs(int num) //先来先服务
{
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < 12; j++) {
			workfcfs[i][j] = work[i][j];
		}
	}
	int i = 0;
	//开始时间
	workfcfs[i][4] = workfcfs[i][1];
	workfcfs[i][5] = workfcfs[i][2];
	//完成时间
	workfcfs[i][6] = workfcfs[i][4] + (workfcfs[i][5] + workfcfs[i][3]) / 60;
	workfcfs[i][7] = (workfcfs[i][5] + workfcfs[i][3]) % 60;
	//等待时间
	workfcfs[i][8] = 0;
	//周转时间
	workfcfs[i][9] = (workfcfs[i][6] * 60 + workfcfs[i][7]) - (workfcfs[i][1] * 60 + workfcfs[i][2]);
	//周转系数
	workfcfs[i][10] = (workfcfs[i][9]) * 1.0 / (workfcfs[i][3]);
	i++;
	for (; i < num; i++) {
		if ((workfcfs[i][1] * 60 + workfcfs[i][2]) >= (workfcfs[i - 1][6] * 60 + workfcfs[i - 1][7])) {
			workfcfs[i][4] = workfcfs[i][1];
			workfcfs[i][5] = workfcfs[i][2];
		}
		else
		{
			workfcfs[i][4] = workfcfs[i-1][6];
			workfcfs[i][5] = workfcfs[i-1][7];
		}
		//完成时间
		workfcfs[i][6] = workfcfs[i][4] + (workfcfs[i][5] + workfcfs[i][3]) / 60;
		workfcfs[i][7] = (workfcfs[i][5] + workfcfs[i][3]) % 60;
		//等待时间
		workfcfs[i][8] = (workfcfs[i][4] * 60 + workfcfs[i][5]) - (workfcfs[i][1] * 60 + workfcfs[i][2]);
		//周转时间
		workfcfs[i][9] = (workfcfs[i][6] * 60 + workfcfs[i][7]) - (workfcfs[i][1] * 60 + workfcfs[i][2]);
		//周转系数
		workfcfs[i][10] = (workfcfs[i][9]) * 1.0 / (workfcfs[i][3]);
	}
}

void printfcfs(int num) {
	float pjzz = 0;//平均周转时间
	float dqpjzz = 0;//平均带权周转时间
	printf("\n模拟进程FCFS(先来先服务)调度的输出结果:\n");
	printf("作业编号  作业名称  提交时间  要求服务运行时间 开始时间 完成时间  等待时间      周转时间\n");
	for (int i = 0; i < num; i++) {
		printf("%d%12s        %02d:%02d        %d(分钟)\t ", workfcfs[i][0], workname[i],workfcfs[i][1],workfcfs[i][2],workfcfs[i][3]);
		printf("%02d:%02d   %02d:%02d\t  %d(分钟)\t%d(分钟)\n",workfcfs[i][4],workfcfs[i][5],workfcfs[i][6],workfcfs[i][7],workfcfs[i][8],workfcfs[i][9]);
		pjzz += workfcfs[i][9];
		dqpjzz += workfcfs[i][10];
	}
	printf("平均周转时间为:%.2f", pjzz /num);
	printf("\n平均带权周转时间为:%.2f\n\n", dqpjzz /num);
}

int findshort(int now,int num) //寻找已经到达的最短作业
{
	int shortID = worksjf[0][0]-1;
	for (int i = 1; i < num; i++) {
		if (worksjf[i][1] * 60 + worksjf[i][2] <= now && worksjf[i][3] <= maxtime&&worksjf[i][11]==0) {
			shortID = worksjf[i][0]-1;
		}
	}
	if(shortID==worksjf[0][0]-1){
		for (int j = 1; j < num; j++) {
			if (worksjf[j][3] <=maxtime && worksjf[j][11] == 0) {
				shortID = worksjf[j][0]-1;
			}
		}
	}
	if (shortID ==0)return 6;
	worksjf[shortID][11] = 1;
	return shortID;
}

void sjf(int num) //最短作业优先
{
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < 12; j++) {
			worksjf[i][j] = work[i][j];
		}
	}
	int i = 0;
	//开始时间
	worksjf[i][4] = worksjf[i][1];
	worksjf[i][5] = worksjf[i][2];
	//完成时间
	worksjf[i][6] = worksjf[i][4] + (worksjf[i][5] + worksjf[i][3]) / 60;
	worksjf[i][7] = (worksjf[i][5] + worksjf[i][3]) % 60;
	//等待时间
	worksjf[i][8] = 0;
	//周转时间
	worksjf[i][9] = (worksjf[i][6] * 60 + worksjf[i][7]) - (worksjf[i][1] * 60 + worksjf[i][2]);
	//周转系数
	worksjf[i][10] = (worksjf[i][9]) * 1.0 / (worksjf[i][3]);
	worksjf[i][11] = 1;
	worksjfid[i]=worksjf[i][0]-1;
	int ID = i;
	int now= worksjf[i][6] * 60 + worksjf[i][7];
	i++;
	for (; i < num; i++) {
		int lastID = ID;
		ID = findshort(now, num);
		worksjfid[i] = ID;
		if ((worksjf[ID][1] * 60 + worksjf[ID][2]) >= (worksjf[lastID][6] * 60 + worksjf[lastID][7])) {
			worksjf[ID][4] = worksjf[ID][1];
			worksjf[ID][5] = worksjf[ID][2];
		}
		else
		{
			worksjf[ID][4] = worksjf[lastID][6];
			worksjf[ID][5] = worksjf[lastID][7];
		}
		//完成时间
		worksjf[ID][6] = worksjf[ID][4] + (worksjf[ID][5] + worksjf[ID][3]) / 60;
		worksjf[ID][7] = (worksjf[ID][5] + worksjf[ID][3]) % 60;
		now = worksjf[ID][6] * 60 + worksjf[ID][7];
		//等待时间
		worksjf[ID][8] = (worksjf[ID][4] * 60 + worksjf[ID][5]) - (worksjf[ID][1] * 60 + worksjf[ID][2]);
		//周转时间
		worksjf[ID][9] = (worksjf[ID][6] * 60 + worksjf[ID][7]) - (worksjf[ID][1] * 60 + worksjf[ID][2]);
		//周转系数
		worksjf[ID][10] = (worksjf[ID][9]) * 1.0 / (worksjf[ID][3]);
	}
}

void printsjf(int num) {
	float pjzz = 0;//平均周转时间
	float dqpjzz = 0;//平均带权周转时间
	printf("\n模拟进程SJF(最短作业优先)调度的输出结果:\n");
	printf("作业编号  作业名称  提交时间  要求服务运行时间 开始时间 完成时间  等待时间      周转时间\n");
	for (int k = 0; k < num; k++) {
		int i = worksjfid[k];
		printf("%d%12s        %02d:%02d        %d(分钟)\t ", worksjf[i][0],workname[i], worksjf[i][1], worksjf[i][2], worksjf[i][3]);
		printf("%02d:%02d   %02d:%02d\t  %d(分钟)\t%d(分钟)\n", worksjf[i][4], worksjf[i][5], worksjf[i][6], worksjf[i][7], worksjf[i][8], worksjf[i][9]);
		pjzz += worksjf[i][9];
		dqpjzz += worksjf[i][10];
	}
	printf("平均周转时间为:%.2f", pjzz / num);
	printf("\n平均带权周转时间为:%.2f\n\n", dqpjzz / num);
}

int findmh(int now, int num,int lastID) //寻找已经到达的最高响应比作业
{
	int starttime = 0, waittime = 0;
	float high = 0;
	int ID = 6;
	for (int i = 1; i < num; i++) {
		if (workmh[i][11] == 0) {
			if ((workmh[i][1] * 60 + workmh[i][2]) >= (workmh[lastID][6] * 60 + workmh[lastID][7])) {
				starttime = workmh[i][1] * 60 + workmh[i][2];
			}
			else
			{
				starttime = workmh[lastID][6] * 60 + workmh[lastID][7];
			}
			waittime = starttime - (workmh[i][1] * 60 + workmh[i][2]);
			if ((waittime + workmh[i][3]) / workmh[i][3] > high) {
				high = (waittime + workmh[i][3]) / workmh[i][3];
				ID = i;
			}
		}
	}
	if (ID == 6)return 6;
	workmh[ID][11] = 1;
	return ID;
}

void mostxy(int num) //最高响应比优先
{
	for (int i = 0; i < num; i++) {
		for (int j = 0; j < 12; j++) {
			workmh[i][j] = work[i][j];
		}
	}
	int i = 0;
	//开始时间
	workmh[i][4] = workmh[i][1];
	workmh[i][5] = workmh[i][2];
	//完成时间
	workmh[i][6] = workmh[i][4] + (workmh[i][5] + workmh[i][3]) / 60;
	workmh[i][7] = (workmh[i][5] + workmh[i][3]) % 60;
	//等待时间
	workmh[i][8] = 0;
	//周转时间
	workmh[i][9] = (workmh[i][6] * 60 + workmh[i][7]) - (workmh[i][1] * 60 + workmh[i][2]);
	//周转系数
	workmh[i][10] = (workmh[i][9]) * 1.0 / (workmh[i][3]);
	workmh[i][11] = 1;
	workmhid[i] = workmh[i][0] - 1;
	int ID = i;
	int now = workmh[i][6] * 60 + workmh[i][7];
	i++;
	for (; i < num; i++) {
		int lastID = ID;
		ID = findmh(now, num,lastID);
		workmhid[i] = ID;
		if ((workmh[ID][1] * 60 + workmh[ID][2]) >= (workmh[lastID][6] * 60 + workmh[lastID][7])) {
			workmh[ID][4] = workmh[ID][1];
			workmh[ID][5] = workmh[ID][2];
		}
		else
		{
			workmh[ID][4] = workmh[lastID][6];
			workmh[ID][5] = workmh[lastID][7];
		}
		//完成时间
		workmh[ID][6] = workmh[ID][4] + (workmh[ID][5] + workmh[ID][3]) / 60;
		workmh[ID][7] = (workmh[ID][5] + workmh[ID][3]) % 60;
		now = workmh[ID][6] * 60 + workmh[ID][7];
		//等待时间
		workmh[ID][8] = (workmh[ID][4] * 60 + workmh[ID][5]) - (workmh[ID][1] * 60 + workmh[ID][2]);
		//周转时间
		workmh[ID][9] = (workmh[ID][6] * 60 + workmh[ID][7]) - (workmh[ID][1] * 60 + workmh[ID][2]);
		//周转系数
		workmh[ID][10] = (workmh[ID][9]) * 1.0 / (workmh[ID][3]);
	}
}

void printmh(int num) {
	float pjzz = 0;//平均周转时间
	float dqpjzz = 0;//平均带权周转时间
	printf("\n模拟进程最高响应比调度的输出结果:\n");
	printf("作业编号  作业名称  提交时间  要求服务运行时间 开始时间 完成时间  等待时间      周转时间\n");
	for (int k = 0; k < num; k++) {
		int i = workmhid[k];
		printf("%d%12s        %02d:%02d        %d(分钟)\t ", workmh[i][0], workname[i], workmh[i][1], workmh[i][2], workmh[i][3]);
		printf("%02d:%02d   %02d:%02d\t  %d(分钟)\t%d(分钟)\n", workmh[i][4], workmh[i][5], workmh[i][6], workmh[i][7], workmh[i][8], workmh[i][9]);
		pjzz += workmh[i][9];
		dqpjzz += workmh[i][10];
	}
	printf("平均周转时间为:%.2f", pjzz / num);
	printf("\n平均带权周转时间为:%.2f\n\n", dqpjzz / num);
}

int main()
{
	int num=input();//作业个数
	int choose;
	while (1) {
		printf("请选择遵循的优先级(1、先来先服务;2、最短作业优先;3、最高响应比优先;4、退出:");
		scanf("%d", &choose);
		switch (choose)
		{
		case 1:
			fcfs(num);
			printfcfs(num);
			break;
		case 2:
			sjf(num);
			printsjf(num);
			break;
		case 3:
			mostxy(num);
			printmh(num);
			break;
		case 4:
			exit(0);
		default:
			break;
		}
	}
	return 0;
}

所用文本文件(作业调度.txt)如下:

1 JA 02:40 20
2 JB 02:50 30
3 JC 02:55 10
4 JD 03:00 24
5 JE 03:05 6

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值