操作系統:SJF算法——c++實現

實現步驟:
1.將進程按到達時間排序;
進程開始運行:
(1)在進程運行結束前到達的進程:
比較運行時間—短的先運行
(2)在進程運行結束前到達的進程:
先到達的運行。

	上源碼:`
#include <iostream>
#include<string>
using namespace std;
class SJF {
public:
	string name;//程序名
	int a_time;//到達時間
	int r_time;//運行時間
	int s_time;//開始時間
	int f_time;//結束時間
	int round_time;//z週轉時間
	double wr_time;//帶權週轉時間
	double ar_time;//平均週轉時間
	double awr_time;//平均帶權週轉時間
};	SJF a[1000];
void sjf() {
	int num, i, j, temp;
	string t;
	cout << "請輸入進程個數 :";
	cin >> num;
	cout << "請輸入" << num << "個進程名字" << endl;
	for (i = 0; i < num; i++) {
		cin >> a[i].name;
		a[i].a_time = (int)rand() % 10 + 1;
		a[i].r_time = (int)rand() % 10 + 1;
	}//隨機生成到達時間和運行時間
	cout << "打印數據.................." << endl;
	cout << "進程名" << " " << "到達時間" << " " << "運行時間" << " " << "開始時間" << " " << "結束時間" << " " << "週轉時間" << " " << "帶權週轉時間" << " " << "平均週轉時間" << " " << "平均帶權週轉時間" << endl;
	for (i = 0; i < num; i++) {
		cout << a[i].name << "\t" << a[i].a_time << "\t" << a[i].r_time << "\t\t" << 0 << "\t" << 0 << "\t" << 0 << "\t" << 0 << "\t" << 0 << "\t" << 0 << endl;
	}
	for (i = 1; i < num; i++) {
		for (j = 0; j < num - i; j++) {
			if (a[j].a_time > a[j + 1].a_time) {
				t = a[j].name;
				a[j].name = a[j + 1].name;
				a[j + 1].name = t;

				temp = a[j].a_time;
				a[j].a_time = a[j + 1].a_time;
				a[j + 1].a_time = temp;

				temp = a[j].r_time;
				a[j].r_time = a[j + 1].r_time;
				a[j + 1].r_time = temp;
			}
		}
	}//按到達時間排序 升序
	for (int k = 0; k < num - 1; k++) {
		if (a[k].a_time == a[k + 1].a_time&&a[k].r_time > a[k + 1].r_time) {
			t = a[j].name;
			a[j].name = a[j + 1].name;
			a[j + 1].name = t;

			temp = a[j].a_time;
			a[j].a_time = a[j + 1].a_time;
			a[j + 1].a_time = temp;

			temp = a[j].r_time;
			a[j].r_time = a[j + 1].r_time;
			a[j + 1].r_time = temp;
		}
	}
	cout << endl;
	cout << "SJF算法。。。。。。。。。" << endl;
	cout << "進程名" << " " << "到達時間" << " " << "運行時間" << "    " << "開始時間" << " " << "結束時間" << " " << "週轉時間" << " " << "帶權週轉時間" << " " << "平均週轉時間" << " " << "平均帶權週轉時間" << endl;

	a[0].s_time = a[0].a_time + a[0].r_time;
	a[0].f_time = a[0].a_time + a[0].r_time;
	a[0].round_time = a[0].f_time - a[0].a_time;
	a[0].wr_time = a[0].round_time / a[0].r_time;
	a[0].ar_time = a[0].round_time;
	a[0].awr_time = a[0].wr_time;
	for (i = 1; i < num; i++) {
		for (j = i; j < num - 1; j++) {
			for (int d = i + 1; d < num; d++) {
				if ((a[i - 1].f_time >= a[j].a_time) && (a[i - 1].f_time >= a[d].a_time) && (a[j].r_time > a[d].r_time)) {
					t = a[j].name;
					a[j].name = a[j + 1].name;
					a[j + 1].name = t;

					temp = a[j].a_time;
					a[j].a_time = a[j + 1].a_time;
					a[j + 1].a_time = temp;

					temp = a[j].r_time;
					a[j].r_time = a[j + 1].r_time;
					a[j + 1].r_time = temp;
				}
			}
		}
		if (a[i].a_time < a[i - 1].f_time) {//當前到達時間在上一個作業結束時間之前
			a[i].f_time = a[i - 1].f_time + a[i].r_time;
			a[i].s_time = a[i - 1].f_time + a[i].r_time;
			a[i].round_time = a[i].f_time - a[i].a_time;
			a[i].wr_time = a[i].round_time / a[i].r_time;
			a[i].ar_time = a[i].round_time / (i + 1);
			a[i].awr_time = a[i].wr_time / (i + 1);
		}
		else {//之後
			a[i].f_time = a[i].a_time + a[i].r_time;
			a[i].s_time = a[i ].a_time + a[i].r_time;
			a[i].round_time = a[i].f_time - a[i].a_time;
			a[i].wr_time = a[i].round_time / a[i].r_time;
			a[i].ar_time = a[i].round_time / (i + 1);
			a[i].awr_time = a[i].wr_time /(i + 1);
		}	
	}
	for (i = 0; i < num; i++) {
		cout << a[i].name << "\t" << a[i].a_time << "\t" << a[i].r_time << "\t\t" << a[i].s_time <<"\t"<<a[i].f_time<< "\t" << a[i].round_time << "\t" << a[i].wr_time<< "\t\t" << a[i].ar_time << "\t\t" << a[i].awr_time << endl;
	}
}//如果到達時間相同就運行時間短的放前邊
int main()
{
	sjf();
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章