先来先服务,短作业优先,高响应比进程调度算法的实现

一、实验内容

编程实现先来先服务算法、短作业优先算法、高响应比算法,并求出每个作业的完成时间、周转时间、带权周转时间,及平均周转时间、平均带权周转时间。

二、实验要求

1.任选一种高级语言实现;

2.选择FCFS、SJF、HRRN调度算法;

3.能够输入进程的基本信息,如进程名、提交时间、预估运行时间等;

4.根据选择的调度算法显示进程调度顺序;

5.显示完成调度后每个进程的开始时间、完成时间呢、周转时间,带权周转时间;

6.计算平均周转时间和平均带权周转时间;

三、实验过程

1、 设计思想

FCFS算法对提交时间进行排序,按提交时间从小到大的顺序调度,SJF算法从第二个进程开始计算找出当前处在就绪等待队列的进程,并找出其中运行时间最短的作为下次调度的进程,HRRN算法从第二个进程开始计算找出当前处在就绪等待队列的进程,并找出其中响应比最小的作为下次调度的进程

2.运行结果

四、实验代码

#include<iostream>
#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define N 5
using namespace std;



struct Mystruct
{
	float arrivetime;
	float runtime;
	float starttime;
	float waittime;
	float endtime;
	float turnaroundtime;
	float rightturnaroundtime;

}Thread[N];



void sort(struct Mystruct Thread[]) {//按进程到达时间排序

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N - 1; j++) {
			if (Thread[j].arrivetime > Thread[j + 1].arrivetime) {
				float t1 = Thread[j + 1].arrivetime;
				Thread[j + 1].arrivetime = Thread[j].arrivetime;
				Thread[j].arrivetime = t1;
				float t2 = Thread[j + 1].runtime;
				Thread[j + 1].runtime = Thread[j].runtime;
				Thread[j].runtime = t2;
			}
		}
	}



}

float JRR(float i, float j, float k) {//计算响应比

	float s = (i - j + k) / k;
	//cout << i << " " << j << " " << k << "响应比" << s << endl;
	return s;
}

void RRsort(int i) {//找出最小响应比进程的下标与下次要运行的进程交换次序,使处在就绪状态响应比最小的进程下次运行
	int next = 0;
	float min = 30;
	for (int j = i + 1; j < N; j++)
	{
		if (Thread[j].arrivetime <= Thread[i].endtime) {
			float RR;
			//			cout << Thread[i].endtime << endl;
			if (i != 4)
				RR = JRR(Thread[i].endtime, Thread[j].arrivetime, Thread[j].runtime);

			if (RR < min)//找出最小响应比
			{

				min = RR;
				next = j;

			}
		}


	}
	
	
	Mystruct temp;
	temp = Thread[i + 1];
	Thread[i + 1] = Thread[next];
	Thread[next] = temp;
}

void FCFS() {
	int count = 0;
	cout << "==========================先来先服务算法调度==========================" << endl;
	sort(Thread);
	float avewaittime = 0,aveturnaroundtime=0,averightturnaroundtime=0;
	cout <<  "作业号" << "\t" << "提交时间" << "\t" << "运行时间" << "\t" << "开始时间" << "\t" << "等待时间" << "\t" << "完成时间"<<"\t"  << "周转时间" << "\t" << "带权周转时间" << endl;
	for (int i = 0; i < N; i++)
	{
		count++;
		
		if (count == 1)Thread[i].starttime = Thread[i].arrivetime; else Thread[i].starttime=Thread[i-1].starttime+Thread[i-1].runtime;
		if (Thread[i].starttime<Thread[i].arrivetime)
		{
			Thread[i].starttime = Thread[i].arrivetime;
		}
		Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;
		Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;
		Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;
		Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;
		avewaittime += Thread[i].waittime; aveturnaroundtime += Thread[i].turnaroundtime; averightturnaroundtime += Thread[i].rightturnaroundtime;
		cout <<count<<"\t"  <<Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;
	}
	cout << "平均等待时间:" << avewaittime / N << "\t" << "平均周转时间:" << aveturnaroundtime/N << "\t" << "平均带权周转时间:" << averightturnaroundtime / N << endl;
	
}



void SJF(struct Mystruct Thread[])
{
	float avewaittime = 0, aveturnaroundtime = 0, averightturnaroundtime = 0;

	for (int m = 0; m < N - 1; m++)
	{
		if (m == 0)
			Thread[m].endtime = Thread[m].arrivetime + Thread[m].runtime;
		else
		{
			if (Thread[m - 1].endtime >= Thread[m].arrivetime)
			{
				Thread[m].starttime = Thread[m - 1].endtime;
			}
			else
			{
				Thread[m].starttime = Thread[m].arrivetime;
			}
			Thread[m].endtime = Thread[m].starttime + Thread[m].runtime;
		}
		int i = 0;
		for (int n = m + 1; n <= N - 1; n++)
		{
			if (Thread[n].arrivetime <= Thread[m].endtime)
				i++;
		}



		//按运行时间排序
		float min = Thread[m + 1].runtime;
		int next = m + 1;//m+1=n
		for (int k = m + 1; k < m + i; k++)
		{
			if (Thread[k + 1].runtime < min)
			{
				min = Thread[k + 1].runtime;
				next = k + 1;
			}
			
		}
//		cout << min << endl;
		Mystruct temp;
		temp = Thread[m + 1];
		Thread[m + 1] = Thread[next];
		Thread[next] = temp;
	}

	int count = 0;
	cout << "==========================短作业优先算法调度==========================" << endl;
	cout << "作业号" << "\t" << "提交时间" << "\t" << "运行时间" << "\t" << "开始时间" << "\t" << "等待时间" << "\t" << "完成时间" << "\t" << "周转时间" << "\t" << "带权周转时间" << endl;
	for (int i = 0; i < N; i++)
	{
		count++;
		if (count == 1)
		{
			Thread[i].starttime = Thread[i].arrivetime;
			Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;
			Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;
			Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;
			Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;
			cout << count << "\t" << Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;
		}
		else
		{
			Thread[i].starttime = Thread[i - 1].starttime + Thread[i - 1].runtime;
			if (Thread[i].starttime < Thread[i].arrivetime)
			{
				Thread[i].starttime = Thread[i].arrivetime;
			}
			Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;
			Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;
			Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;
			Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;
			avewaittime += Thread[i].waittime; aveturnaroundtime += Thread[i].turnaroundtime; averightturnaroundtime += Thread[i].rightturnaroundtime;
			cout << count << "\t" << Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;


		}
	}
	cout << "平均等待时间:" << avewaittime / N << "\t" << "平均周转时间:" << aveturnaroundtime / N << "\t" << "平均带权周转时间:" << averightturnaroundtime / N << endl;
}




void HRRN(struct Mystruct Thread[])

{
	int count = 0;
	float avewaittime = 0, aveturnaroundtime = 0, averightturnaroundtime = 0;
	
	cout << "==========================高响应比算法调度==========================" << endl;

	
	cout << "作业号" << "\t" << "提交时间" << "\t" << "运行时间" << "\t" << "开始时间" << "\t" << "等待时间" << "\t" << "完成时间" << "\t" << "周转时间" << "\t" << "带权周转时间" << endl;
	for (int i = 0; i < N; i++)
	{
		
		
		count++;
		if (count == 1)Thread[i].starttime = Thread[i].arrivetime; else Thread[i].starttime = Thread[i - 1].starttime + Thread[i - 1].runtime;

		if (Thread[i].starttime < Thread[i].arrivetime)
		{
			Thread[i].starttime = Thread[i].arrivetime;
		}
		Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;
		
		RRsort(i);//找出处在等待的最小响应比的进程下次运行
		

		Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;
		Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;
		Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;
		avewaittime += Thread[i].waittime; aveturnaroundtime += Thread[i].turnaroundtime; averightturnaroundtime += Thread[i].rightturnaroundtime;

		cout << count << "\t" << Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;
	}


	
	cout << "平均等待时间:" << avewaittime / N << "\t" << "平均周转时间:" << aveturnaroundtime / N << "\t" << "平均带权周转时间:" << averightturnaroundtime / N << endl;

}

	





	int main() {

		srand((int)time(0));
		for (int i = 0; i < N; i++) {

			Thread[i].arrivetime = rand() % 20;
			Thread[i].runtime = rand() % 20 + 1;

		}


		FCFS();
		SJF(Thread);

		HRRN(Thread);



		return 0;



	}
		


五、实验总结

通过本次实验我更加了解了先来先服务算法、短作业优先算法、高响应比算法,通过带权周转时间的计算知道了FCFS算法对长作业有利,对短作业不利,SJF算法对短作业有利,对长作业不利,在所有进程同时可运行是采用SJF算法的平均等待时间、平均周转时间最少

posted @ 2021-05-16 15:04  乐茶茶  阅读(1921)  评论(0编辑  收藏  举报