进程调度模拟

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);*/
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值