处理器调度算法

#include <bits/stdc++.h>
using namespace std;
ifstream infile;
ofstream outfile; 
int n, k;//进程个数n 时间片长度k
struct pcb{	
	int id; // 进程编号
	int st; // 到达时间
	int len; // 运行时间
	int res; // 剩余运行时间 
};
struct result{
	int id, ariv, len, st, end, t1, t2;// 编号 到达时间 运行时间 开始时间 结束时间 周转时间 等待时间
	double t3; // 带权周转时间
};
struct cmp1{
	bool operator()(const pcb& a, const pcb& b) {
		return a.len > b.len;
	}
};
struct cmp2{
	bool operator()(const pcb& a, const pcb& b) {
		return a.res > b.res;
	}
};
vector<pcb> arr;
//先来先服务
void FCFS() {
	outfile << "FCFS算法:\n";
	queue<pcb> q; //阻塞队列
	vector<result> rec;
	int pre = arr[0].st;
	for(int i = 1; i < n; i++) {
		q.push(arr[i]);
	}
	auto& u = arr[0];
	rec.push_back({u.id, u.st, u.len, pre, pre + u.len, pre + u.len - u.st, pre - u.st, (pre + u.len - u.st) /(double)u.len}), pre += u.len; 
	while(!q.empty()) {
		auto u = q.front();
		q.pop();
		rec.push_back({u.id, u.st, u.len, pre, pre + u.len, pre + u.len - u.st, pre - u.st, (pre + u.len - u.st) /(double)u.len}), pre += u.len; 
	}
	outfile << "进程名 " << ' ' << "到达时间" << ' ' << "运行时间" << ' ' << "开始时间" << ' ' << "结束时间" << ' ' << "周转时间" << ' ' << "等待时间" << ' ' << "带权周转时间" << '\n';
	double sum = 0;
	for(auto& x : rec) {
		outfile << 'P' << x.id << "\t\t" << x.ariv << "\t\t" << x.len << "\t \t" << ' ' << x.st << "\t\t" << " " << x.end  << "\t\t" << " " << x.t1 << "\t\t" << " " << x.t2 << "\t\t" << " " << x.t3 << '\n';
		sum += x.t3;
	}
	outfile << "平均带权周转时间:" << sum / n << '\n';
}
//短进程优先(不可抢占)
void spf() {
	outfile << "SPF算法:\n";
	priority_queue<pcb, vector<pcb>, cmp1> q;
	vector<result> rec;
	int idx = 0, pre = arr[idx].st;
	q.push(arr[idx++]);
	while(!q.empty()) {
		auto u = q.top();
		q.pop();
		rec.push_back({u.id, u.st, u.len, pre, pre + u.len, pre + u.len - u.st, pre - u.st, (pre + u.len - u.st) /(double)u.len}), pre += u.len; 
		while(idx < n && arr[idx].st <= pre) {
			q.push(arr[idx++]);
		}
	}
	double sum = 0;
	outfile << "进程名 " << ' ' << "到达时间" << ' ' << "运行时间" << ' ' << "开始时间" << ' ' << "结束时间" << ' ' << "周转时间" << ' ' << "等待时间" << ' ' << "带权周转时间" << '\n';
	for(auto& x : rec) {
		outfile << 'P' << x.id << "\t\t" << x.ariv << "\t\t" << x.len << "\t \t" << ' ' << x.st << "\t\t" << " " << x.end  << "\t\t" << " " << x.t1 << "\t\t" << " " << x.t2 << "\t\t" << " " << x.t3 << '\n';
		sum += x.t3;
	}
	outfile << "平均带权周转时间:" << sum / n << '\n';
}
//最短剩余时间算法(可抢占)
void srt() {
	outfile << "SRT算法:\n";
	priority_queue<pcb, vector<pcb>, cmp2> q;
	vector<result> rec;
	unordered_map<int, int> mp; //记录每个进程的开始时间
	int pre = arr[0].st;
	auto u = arr[0]; // u是当前正在运行的进程
	mp[u.id] = pre;
	for(int i = 1; i < n;) {
		int t = u.res - (arr[i].st - pre);
		if(t > arr[i].len) {
			outfile << 'P' << u.id << ":[" << pre << ", " << arr[i].st << "] ";
			u.res -= (arr[i].st - pre);
			pre = arr[i].st;
			q.push(u);
			u = arr[i++];
			mp[u.id] = u.st;
		} else {
			outfile << 'P' << u.id << ":[" << pre << ", " << pre + u.res << "] ";
			rec.push_back({u.id, u.st, u.len, mp[u.id], pre + u.res, pre + u.res - u.st, pre + u.res - u.st - u.len, (pre + u.res - u.st) /(double)u.len}); 
			pre += u.res;
			if(!q.empty() && arr[i].len > q.top().res) {
				u = q.top();
				q.pop();
			} else u = arr[i++], mp[u.id] = max(u.st, pre), pre = mp[u.id];
		}
	}
	q.push(u);
	while(!q.empty()) {
		u = q.top();
		q.pop();
		outfile << 'P' << u.id << ":[" << pre << ", " << pre + u.res << "] ";
		rec.push_back({u.id, u.st, u.len, mp[u.id], pre + u.res, pre + u.res - u.st, pre + u.res - u.st - u.len, (pre + u.res - u.st) /(double)u.len}); 
		pre += u.res;
	}
	double sum = 0;
	outfile << '\n' << "进程名 " << ' ' << "到达时间" << ' ' << "运行时间" << ' ' << "开始时间" << ' ' << "结束时间" << ' ' << "周转时间" << ' ' << "等待时间" << ' ' << "带权周转时间" << '\n';
	for(auto& x : rec) {
		outfile << 'P' << x.id << "\t\t" << x.ariv << "\t\t" << x.len << "\t \t" << ' ' << x.st << "\t\t" << " " << x.end  << "\t\t" << " " << x.t1 << "\t\t" << " " << x.t2 << "\t\t" << " " << x.t3 << '\n';
		sum += x.t3;
	}
	outfile << "平均带权周转时间:" << sum / n << '\n';
}
//时间片轮转算法
void rr() {
	outfile << "RR算法:\n";
	queue<pcb> q;
	vector<result> rec;
	unordered_map<int, int> mp; //记录每个进程的开始时间
	int pre = arr[0].st, idx = 0;
	mp[arr[0].id] = arr[0].st;
	q.push(arr[idx++]);
	while(!q.empty()) {
		auto u = q.front();
		q.pop();
		if(!mp.count(u.id)) mp[u.id] = pre;
		while(idx < n && arr[idx].st <= pre + k) {
			q.push(arr[idx++]);
		}
		if(u.res - k > 0) {
			u.res -= k;
			q.push(u);
			outfile << 'P' << u.id << ":[" << pre << ", " << pre + k << "] ";
			pre += k;
		} else {
			outfile << 'P' << u.id << ":[" << pre << ", " << pre + u.res << "] ";
			rec.push_back({u.id, u.st, u.len, mp[u.id], pre + u.res, 0,0,0});
			pre += u.res;
		}
	}
	outfile << '\n' << "进程名 " << ' ' << "到达时间" << ' ' << "运行时间" << ' ' << "开始时间" << ' ' << "结束时间" << '\n';
	for(auto& x : rec) {
		outfile << 'P' << x.id << "\t\t" << x.ariv << "\t\t" << x.len << "\t \t" << ' ' << x.st << "\t\t" << " " << x.end << '\n';
	}
}
int main() {
	infile.open("input.txt", ios::in);
	outfile.open("output.txt", ios::out);
	infile >> n >> k;
	for(int i = 0; i < n ; i++) {
		pcb p;
		infile >> p.id >> p.st >> p.len;
		p.res = p.len;
		arr.push_back(p);
	}
	sort(arr.begin(), arr.end(), [&](auto& a, auto& b) {
		if(a.st != b.st) return a.st < b.st;
		return a.len < b.len;
	});
	FCFS();

	spf();

	srt();

	rr();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
处理器调度算法是指通过一定的策略来决定哪个进程可以获得 CPU 的调度,从而达到最优的利用 CPU 资源的目的。常见的处理器调度算法有以下几种: 1. 先来先服务(FCFS,First-Come-First-Served)算法 2. 短作业优先(SJF,Shortest-Job-First)算法 3. 优先级调度算法 4. 时间片轮转调度算法 5. 多级反馈队列调度算法 下面是一个使用 C++ 实现的先来先服务(FCFS)算法的示例代码: ```c++ #include <iostream> #include <queue> using namespace std; struct Process { int pid; // 进程 ID int arrival_time; // 到达时间 int burst_time; // 运行时间 }; bool cmp(Process a, Process b) { return a.arrival_time < b.arrival_time; } int main() { int n, total_time = 0, wait_time = 0, turnaround_time = 0; double avg_wait_time, avg_turnaround_time; queue<Process> q; cout << "请输入进程数:"; cin >> n; Process p[n]; cout << "请输入每个进程的到达时间和运行时间:" << endl; for (int i = 0; i < n; i++) { cout << "进程 " << i << ":"; cin >> p[i].arrival_time >> p[i].burst_time; p[i].pid = i; } sort(p, p + n, cmp); q.push(p[0]); for (int i = 1; i < n; i++) { if (q.back().arrival_time < p[i].arrival_time) { q.push(p[i]); } else { while (!q.empty()) { Process temp = q.front(); q.pop(); wait_time += total_time - temp.arrival_time; turnaround_time += total_time - temp.arrival_time + temp.burst_time; total_time += temp.burst_time; if (q.empty() || q.back().arrival_time < p[i].arrival_time) { q.push(p[i]); break; } } } } while (!q.empty()) { Process temp = q.front(); q.pop(); wait_time += total_time - temp.arrival_time; turnaround_time += total_time - temp.arrival_time + temp.burst_time; total_time += temp.burst_time; } avg_wait_time = (double)wait_time / n; avg_turnaround_time = (double)turnaround_time / n; cout << "平均等待时间:" << avg_wait_time << endl; cout << "平均周转时间:" << avg_turnaround_time << endl; return 0; } ``` 该代码实现了先来先服务(FCFS)算法,通过输入每个进程的到达时间和运行时间,计算出每个进程的平均等待时间和平均周转时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值