先來先服務,短作業優先,高響應比進程調度算法的實現


一、實驗內容

編程實現先來先服務算法、短作業優先算法、高響應比算法,並求出每個作業的完成時間、周轉時間、帶權周轉時間,及平均周轉時間、平均帶權周轉時間。

二、實驗要求

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算法的平均等待時間、平均周轉時間最少


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM