19级南师软工——操作系统实验
前言
实验任务
例如模拟sjf
-
ArivalEvent的处理
-
FinishEvent处理
一、FCFS算法与RR算法的实现代码
先到先得算法:谁先到达,则谁先加入就绪列,直接按照到达的顺序运行
时间片轮流算法:将目前到达的工作,按照顺序依次运行一个时间片单位
#include<iostream>
#include<queue>
#include<algorithm>
#include<windows.h>
#include<time.h>
#include <iomanip>
#include<vector>
using namespace std;
struct work {
int id;
int arrive_time;
int run_time;
int start_time;
int finish_time;
int worked_time;
};
queue<work> w;
work job[20];
vector<work> answer;
void CreateWork(int n)
{
for (int i = 0; i < n; i++)
{
job[i].id = i;
cout << "请输入作业到达时间" << endl;
cin >> job[i].arrive_time;
cout << "请输入作业工作时间" << endl;
cin >> job[i].run_time;
job[i].start_time = -1;
job[i].worked_time = 0;
job[i].finish_time = -1;
}
}
bool ArrivalEvent(bool cpu, work& wtest, int t)
{
if (cpu == false && wtest.arrive_time <= t)
{
wtest.start_time = t;
cpu = true;
cout << "时间" << t << ": cpu被作业" << wtest.id << "占用" << endl;
return cpu;
}
return cpu;
}
bool FinishiEvent(bool& cpu, work& wtest, int t)
{
if (wtest.run_time <= wtest.worked_time)
{
wtest.finish_time = t;
cpu = false;
cout << "时间" << t << ": 作业" << wtest.id << "结束进程" << endl;
return true;
}
return false;
}
bool TimeEvent(work& wtest, int Timepice, int t, bool cpu)
{
if (wtest.run_time - wtest.worked_time <= Timepice)
{
wtest.finish_time = t + wtest.run_time - wtest.worked_time;
wtest.worked_time = wtest.run_time;
return false;
}
cout << "运行" << endl;
wtest.worked_time += Timepice;
return true;
}
void PrintWork(int n)
{
cout << "作业id " << "作业到达时间 " << "作业开始时间 " << "作业结束时间 " << endl;
for (int i = 0; i < n; i++)
{
cout << answer[i].id<<" " << answer[i].arrive_time << " " << answer[i].start_time << " " << answer[i].finish_time<<endl;
}
}
int MeCmp(work& w1, work& w2)
{
if (w1.arrive_time == w2.arrive_time)
return w1.run_time < w2.run_time;
return w1.arrive_time < w2.arrive_time;
}
void FCFS(int n)
{
sort(job, job + n, MeCmp);
for (int i = 0; i < n; i++)
{
w.push(job[i]);
}
bool cpu = false; int time = 0;
while (w.empty() != true)
{
work wtest = w.front();
w.pop();
cout << time<<endl;
if (time < wtest.arrive_time)
{
time = wtest.arrive_time;
}
cpu = ArrivalEvent(cpu, wtest, time);
wtest.worked_time = wtest.run_time;
time = time + wtest.run_time;
FinishiEvent(cpu, wtest, time);
answer.push_back(wtest);
}
}
void RR(int n, int Timepice)
{
int isfinish = 0;//申请一个记录当前工作是否全部完成的工作
sort(job, job + n, MeCmp);//先要将作业从开始到达的时间排序
bool cpu = false; int time = 0;
while (isfinish < n)
{
cpu = false;
for (int i = 0; i < n; i++)
{
if (job[i].arrive_time == time)
{
w.push(job[i]);
cout << "add job" << i << endl;
}
}
if (w.empty()==true)
{
cout << "add" << endl;
time += Timepice;
}
else
{
work wtest = w.front();
w.pop();
if (wtest.worked_time == 0)
{
cout << "arrival" << endl;
ArrivalEvent(false, wtest, time);
wtest.worked_time += Timepice;
}
else
{
cout << "run" << endl;
TimeEvent(wtest, Timepice, time, false);
}
if (wtest.run_time > wtest.worked_time)
{
cout << "push" << endl;
w.push(wtest);
}
else
{
cout << "finishwork" << endl;
answer.push_back(wtest);
isfinish++;
}
time += Timepice;
}
}
}
int main()
{
int i, timepice;//记录work的个数
cout << "请输入时间片大小" << endl;
cin >> timepice;
cout << "请输入作业的个数" << endl;
cin >> i;
CreateWork(i);
FCFS(i);
cout << "FCFS调度算法结果:" << endl;
PrintWork(i);
/* RR(i, timepice);
cout << "RR调度算法结果:" << endl;
PrintWork(i);*/
}
、