C++模拟进程轮转调度算法

 

#include<iostream>
#include<queue>
using namespace std;
struct Process
{
	string id;
	int arrival_time/*到达时间*/, service_time/*服务时间*/, run_time/*已运行时间*/, over_time/*完成时间*/, turn_time;/*周转时间*/
	bool isRun = false;		//进程是否已启动
};
class ProcessQueue
{
public:
	ProcessQueue(int ts);
	void pushProcess(Process* p);		//添加作业
	void autoRun();						//进行调度
	void showTrack();					//显示调度轨迹
	void showProcessTabe();
	~ProcessQueue();

private:
	queue<Process*> q;
	int time , time_slice;
	vector<Process*> process;
	vector<string> track;//运行轨迹
};

ProcessQueue::ProcessQueue(int ts){
	time = 0;
	time_slice = ts;
}
void ProcessQueue::pushProcess(Process* p) {
	process.push_back(p);
}
void ProcessQueue::autoRun() {
	time = 0;
	for (auto& it : process) {
		if (!it->isRun && it->arrival_time <= time && it->run_time == 0) {
			q.push(it);
			it->isRun = true;
		}
	}
	while (true) {
		if (q.empty())
			break;
		Process *tmp = q.front();
		q.pop();
		if (tmp->service_time-tmp->run_time > time_slice) {
			time += time_slice;
			tmp->run_time += time_slice;
		}
		else {
			time += tmp->service_time - tmp->run_time;
			tmp->over_time = time;
			tmp->turn_time = time - tmp->arrival_time;
			tmp->run_time = tmp->service_time;
		}
		for (auto&it : process) {
			if (!it->isRun&&it->arrival_time <= time && it->run_time == 0) {
				q.push(it);
				it->isRun = true;
			}
		}
		if (tmp->service_time != tmp->run_time) 
			q.push(tmp);
		track.push_back(tmp->id);		
	}
}
void ProcessQueue::showTrack()
{
	cout << "进程调度轨迹:";
	for (int i = 0; i < track.size(); i++)
		cout << track[i] << (i != track.size() - 1 ? "->" : "\n");
}
void ProcessQueue::showProcessTabe()
{
	printf("进程名\t到达时间\t服务时间\t完成时间\t周转时间\n");
	for (int i = 0; i < process.size(); i++) {
		printf("%6s\t%8d\t%8d\t%8d\t%8d\n", process[i]->id.c_str(), process[i]->arrival_time, process[i]->service_time, process[i]->over_time, process[i]->turn_time);
	}
}
ProcessQueue::~ProcessQueue(){}
int main() {
	ProcessQueue pq(1);		//参数为时间片长度
	Process process[] = { { "A",0,4 },{ "B",1,3 },{"C",2,4 },{ "D",3,2 },{ "E",4,4 } };		//{进程名称,到达时间,要求服务时间}
	for (int i = 0; i < 5; i++)
		pq.pushProcess(&process[i]);
	pq.autoRun();
	pq.showTrack();
	pq.showProcessTabe();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值