一、實驗內容
編程實現先來先服務算法、短作業優先算法、高響應比算法,並求出每個作業的完成時間、周轉時間、帶權周轉時間,及平均周轉時間、平均帶權周轉時間。
二、實驗要求
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算法的平均等待時間、平均周轉時間最少