c++ 实现时间片轮转调度算法

本算法实现原理

本实验是模拟进程调度中的时间片轮转算法,每个进程的状态可以是就绪、运行两种状态之一,就绪队列进程按照FCFS算法思想获得CPU后都只能运行一个时间片长,如果一个时间片后(最后一次可能小于时间片长),进程的己占用CPU时间达到所需要的运行时间,则撤消该进程,如果一个时间片后进程的己占用CPU时间还未达所需要的运行时间,此时应分配时间片给就绪队列中排在该进程之后的进程,并将它重新插入到就绪队列队尾。每进行一次调度,程序都打印一次当前正在运行的进程和就绪队列中各个进程的PCB信息,以便进行检查。重复以上过程,直到所有进程都完成为止,最后再输出所有进程的相关信息。

本算法实现代码数据结构:

typedef struct  data

{

    int hour;

    int min;

}time;

typedef struct node

{

    int id;//进程编号

    char name[20];//进程名

    time arrive;//到达就绪队列时间

    int zx;//执行时间

    time start;//开始执行时间

    time finish;//执行完成时间

    int zz;//周转时间=执行完成时间-到达就绪队列时间

    float zzxs;//带权周转时间=周转时间/执行时间

    struct node* next;

}linklist;

代码实现

#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>

using namespace std;

class Time {
public:
	int hour;
	int minute;
	bool operator<(const Time& t) const {
		int t1 = this->hour * 60 + this->minute, t2 = t.hour * 60 + t.minute;
		if (t1 < t2)return true;
		return false;
	}
	bool operator>(const Time& t) const{
		int t1 = this->hour * 60 + this->minute, t2 = t.hour * 60 + t.minute;
		if (t1 > t2)return true;
		return false;
	}
	bool operator<=(const Time& t) const{
		if (*this > t)return false;
		return true;
	}
	void operator+=(const int dur) {
		this->minute += dur;
		if (this->minute >= 60) {
			this->hour += this->minute / 60;
			this->minute %= 60;
		}
		return;
	}
	void operator=(const Time& t) {
		this->hour = t.hour;
		this->minute = t.minute;
	}
	
	/*void func() const{ ; }*/
};
int operator-(const Time& t1, const Time& t2) {
	return (t1.hour - t2.hour) * 60 + t1.minute - t2.minute;
}
istream& operator>>(istream& in, Time& t) {
	char c;
	in >> t.hour >> c >> t.minute;
	return in;
}
class Process {
public:
	int id;//进程编号 
	string name;//进程名 
	Time arrive;//到达就绪队列的时间 
	int zx;//执行时间 

	Time start;//开始执行时间 
	Time finish;//执行完成时间 
	int zz;//周转时间=执行完成时间-到达就绪队列时间 
	double zzxs;//带权周转时间=周转时间/执行时间 
	Time current;//当前进程开始执行的时间 
	int ywcsj;//进程已经完成的时间 
	int sysj; //当前进程的剩余时间 
};
class Arrive_greater {
public:
	bool operator()(const Process* p1, const Process* p2) {
		if (p1->arrive > p2->arrive) {
			return true;
		}
		return false;
	}
};
class Op_system {
public:
	int pcs_num = 100;
	int tm_s = 8;
	Time now;
	vector<Process*> pcs_arr;
	deque<Process*> pcs_que;
	vector<Process*> done;
	Op_system() {
		
		cout << "请输入进程数量:";
		cin >> pcs_num;
		pcs_arr.reserve(pcs_num);
		done.reserve(pcs_num);
		cout << "请输入时间片时间:";
		cin >> tm_s;
		Process* tmp = NULL;
		cout << "请输入进程的参数:\n";
		cout << "id" << "    " << "名字" << "    " << "到达时间" << "    " << " 执行时间" << endl;
		for (int i = 0; i < pcs_num; i++) {
			tmp = new Process;
			cin >> tmp->id >> tmp->name >> tmp->arrive >> tmp->zx;
			tmp->current.hour = 0; tmp->current.minute = 0;
			tmp->ywcsj = 0;
			tmp->sysj = tmp->zx;
			pcs_arr.push_back(tmp);
		}
		sort(pcs_arr.begin(), pcs_arr.end(), Arrive_greater());//按到达时间从大到小排序
		now = pcs_arr.back()->arrive;
	}
	void show_que() {
		cout << "ID号" << "    " << "名字" << "    " << "到达时间" << "    " << "总执行时间" <<
			"    " << "当前开始时间" << "    " << "已完成时间" << "    " << "剩余完成时间" << endl;
		Process* tmp = pcs_que[0];
		cout << tmp->id << "     " << tmp->name << "\t" << flush;
		printf("%02d:%02d          %2d           %02d:%02d            %2d             %2d\n", tmp->arrive.hour,
			tmp->arrive.minute, tmp->zx, tmp->current.hour, tmp->current.minute, tmp->ywcsj, tmp->sysj);
		
		for (int i = 1; i < pcs_que.size(); i++) {
			tmp = pcs_que[i]; 
			cout << tmp->id << "     " << tmp->name << "\t" << flush;
			printf("%02d:%02d          %2d           00:00            %2d             %2d\n", tmp->arrive.hour,
				tmp->arrive.minute, tmp->zx, tmp->ywcsj, tmp->sysj);
		}
	}
	void show_done() {
		double sum_zzxs = 0;
		double sum_zz = 0;
		cout << "ID号" << "    " << "名字" << "    " << "到达时间" << "    " << "执行时间" <<
			"    " << "首次开始时间" << "    " << "完成时间" << "    " << "周转时间" << "   " << "带权周转系数" << endl;
		Process* tmp = done[0];
		for (int i = 0; i < done.size(); i++) {
			tmp = done[i];
			cout << tmp->id << "     " << tmp->name << "\t" << flush;
			printf("%02d:%02d          %2d         %02d:%02d         %02d:%02d         %2d          %2.2lf\n", tmp->arrive.hour,
				tmp->arrive.minute, tmp->zx, tmp->start.hour,tmp->start.minute, tmp->finish.hour,tmp->finish.minute,tmp->zz,tmp->zzxs);
			sum_zzxs += tmp->zzxs;
			sum_zz += tmp->zz;
		}
		printf("系统平均周转时间为:%.2lf\n", sum_zz / done.size());
		printf("系统平均周转系数为:%.2lf\n", sum_zzxs / done.size());
	}
	void run_pcs() {
		int cnt = 1;
		
		while (!pcs_arr.empty() || !pcs_que.empty()) {
			if (pcs_que.empty() && !pcs_arr.empty()) {
				now = pcs_arr.back()->arrive;
			}
			while (!pcs_arr.empty() && pcs_arr.back()->arrive <= now) {
				pcs_que.push_back(pcs_arr.back());
				pcs_arr.pop_back();
			}
			Process* que_front = pcs_que.front();
			int zx = 0;
			if ((que_front->sysj) < tm_s) {
				zx = que_front->sysj;
				que_front->finish = now;
				que_front->finish += zx;
				que_front->zz = que_front->finish - que_front->arrive;
				que_front->zzxs = 1.0 * que_front->zz / que_front->zx;
			}else {
				zx = tm_s;
			}
			if (que_front->ywcsj == 0) {
				que_front->start = now;
			}
			que_front->ywcsj += zx;
			que_front->sysj -= zx;
			que_front->current = now;
			cout << "第" << cnt++ << "轮执行和就绪队列结果:" << endl;
			
			now += zx;
			if (pcs_que.empty() && !pcs_arr.empty()) {
				now = pcs_arr.back()->arrive;
			}
			while (!pcs_arr.empty() && pcs_arr.back()->arrive <= now) {
				pcs_que.push_back(pcs_arr.back());
				pcs_arr.pop_back();
			}
			show_que();
			if (que_front->sysj == 0)
				done.push_back(que_front);
			else 
				pcs_que.push_back(que_front);
			pcs_que.pop_front();
		}
		cout << "模拟进程时间片轮转进程调度过程输出结果:" << endl;
		show_done();
		del_done();
	}
	void del_done() {
		for (int i = done.size() - 1; i >= 0; i--) {
			delete done[i];
			done.pop_back();
		}
	}
};

int main() {
	int flag = 1;
	while (true) {
		cout << "请输入操作:(1:开始进程;0:结束进程):";
		cin >> flag;
		if (flag == 0)break;
		Op_system sys;
		sys.run_pcs();
	}
	
	system("pause");
	return 0;
}

预期结果
在这里插入图片描述

  • 2
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于C++时间片轮转算法的简单模拟实现: ```cpp #include<iostream> #include<queue> using namespace std; struct Process { string name; // 进程名 int arrivalTime; // 到达时间 int burstTime; // 执行时间 int remainingTime; // 剩余执行时间 }; int main() { int n, timeQuantum; queue<Process> readyQueue; cout << "请输入进程个数:"; cin >> n; cout << "请输入时间片大小:"; cin >> timeQuantum; for (int i = 1; i <= n; i++) { Process p; cout << "请输入第" << i << "个进程的信息:" << endl; cin >> p.name >> p.arrivalTime >> p.burstTime; p.remainingTime = p.burstTime; readyQueue.push(p); } int currentTime = 0; while (!readyQueue.empty()) { Process currentProcess = readyQueue.front(); readyQueue.pop(); if (currentProcess.remainingTime <= timeQuantum) { // 进程执行完毕 currentTime += currentProcess.remainingTime; cout << currentProcess.name << " 执行完毕,完成时间:" << currentTime << endl; } else { // 进程未执行完毕,重新加入就绪队列 currentTime += timeQuantum; currentProcess.remainingTime -= timeQuantum; readyQueue.push(currentProcess); } } return 0; } ``` 该程序首先会要求用户输入进程个数和时间片大小,然后依次输入每个进程的名称、到达时间和执行时间,程序会自动计算出每个进程的剩余执行时间,并将进程加入就绪队列中。接下来程序会不断从就绪队列中取出进程并执行,如果进程执行完毕则输出完成时间,否则将进程重新加入就绪队列中等待下一次执行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值