前言 :
最近刚开始学操作系统,刚好要做实验便记录一下实验内容,首先要理解FCFS的基本概念,它是以提交时间为核心的一种调度算法
基本思路:
题目已知提交时间与运行时间要我们得出所有作业的开始、完成、周转、带权周转、平均周转、平均带权周转时间。
题目关键在于求出上一作业的完成时间后与下一作业的提交时间相比较,以此来判断开始时间是等于本作业的提交时间还是上一次作业的完成时间
#include<iostream>
#include <iomanip>//保留小数用到
using namespace std;
struct Fcfs
{
int N;
double Htime;//提交时间
double Rtime;//运行时间
double Stime;//开始时间
double Ctime;//完成时间
double Ztime;//周转时间
double DZtime;//带权周转时间
};
#define t 4//作业数量
double sumZtime;//总周转时间
double sumDZtime;//总带权周转时间
void Fin();
void Px();
void Get();
void print();
struct Fcfs F[t],temp;
void Fin() {//输入所有作业的提交与执行时间
for (int i = 0; i < t; i++) {
cout << "请输入提交时间: ";
cin >> F[i].Htime;
cout << "请输入执行时间: ";
cin >> F[i].Rtime;
}
cout << endl;
}
void Px() { //冒泡升序排序(提交时间)
for (int i = 0; i < t - 1; i++) {
for (int j = 0; j < t - i-1; j++) {
if (F[j + 1].Htime < F[j].Htime) {
temp = F[j + 1]; //temp = F[j + 1].Htime;
F[j + 1] = F[j]; //F[j + 1].Htime = F[j].Htime
F[j] = temp; //F[j].Htime = temp
//以上注释如此填写会只交换Htime而不交换Rtime
}
}
}
}
void Get() { //先把第一个作业所有数据得出
F[0].Stime = F[0].Htime;
F[0].Ctime = F[0].Stime + F[0].Rtime;
F[0].Ztime = F[0].Ctime - F[0].Htime;
F[0].DZtime = F[0].Ztime / F[0].Rtime;
sumZtime= F[0].Ztime;
sumDZtime= F[0].DZtime;
for (int i = 1; i < t; i++) { //根据第一个数据求开始时间
if (F[i].Htime < F[i - 1].Ctime) { //如果提交时间小于上一个作业的完成时间
F[i].Stime = F[i - 1].Ctime; //开始时间等于上一个作业的完成时间
}
else
F[i].Stime = F[i].Htime; //开始时间等于本作业的提交时间
//-----------------------------------------------------------------------
//公共部分求出剩下数据:
F[i].Ctime = F[i].Stime + F[i].Rtime; //完成=开始+运行
F[i].Ztime = F[i].Ctime - F[i].Htime; //周转=完成-提交
F[i].DZtime = F[i].Ztime / F[i].Rtime; //带权周转=周转/运行
sumZtime += F[i].Ztime; //循环累加
sumDZtime += F[i].DZtime; //循环累加
}
}
void print() {
cout << setiosflags(ios::fixed) << setprecision(2); //保留2位小数
cout << "FCFS调度算法:" << endl;
cout << "作业\t 提交时间\t 执行时间\t 开始时间\t 完成时间\t 周转时间\t 带权周转时间\t "<<endl;
for (int i = 0; i < t; i++) {
F[i].N = i + 1;
cout << F[i].N << "\t\t" << F[i].Htime << "\t\t" << F[i].Rtime << "\t\t" <<
F[i].Stime << "\t\t" << F[i].Ctime << "\t\t" << F[i].Ztime << "\t\t" << F[i].DZtime << "\n";
}
cout << setiosflags(ios::fixed) << setprecision(3); //保留3位小数
cout << "平均周转时间: ";
cout << sumZtime/t << endl;
cout << "平均带权周转时间: ";
cout << sumDZtime/t << endl;
}
int main() {
Fin();
Px();
Get();
print();
}
输入:9.00 0.10
8.00 2.00
8.50 0.50
9.50 0.20