一、实验内容
编程实现先来先服务算法、短作业优先算法、高响应比算法,并求出每个作业的完成时间、周转时间、带权周转时间,及平均周转时间、平均带权周转时间。
二、实验要求
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算法的平均等待时间、平均周转时间最少