1.时间片轮转法
设计程序模拟进程的时间片轮转调度算法。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度。 计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
C语言程序如下:
#include <cstdio>
#include <cstring>
#include<string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
using namespace std;
struct PCB {
char id;
char name; //进程名字
int arrive; //到达时间
int serve; //服务时间
int finish; //完成时刻
//排序优先参考到达时间,其次是服务时间
bool operator< (const PCB &t) const{
if(arrive != t.arrive) return arrive < t.arrive;
return serve < t.serve;
};
};
const int N = 10; //最多10个进程
const int M = 100; //最长100个时间单位
PCB pcb_list[N]; //进程列表
vector<PCB> table[M]; //进程时刻表
deque<PCB> que; //进程队列
int n,t,q,sjp; //进程数,总计时,固定时间片,运转时间片
int max_time; //最大时间
void query() { //查询当前是否有进程到达,有则入队
//将当前时刻的所有进程入队
for(int i = 0; i < table[t].size(); i++)
que.push_front(table[t][i]);
}
void run() {
//cout << "当前时刻\t" << "运行进程\t" << "剩余服务时间" << endl;
PCB cur = pcb_list[0]; //初始化当前进程
sjp = q; //初始化时间片
for(t = 0; t <= max_time; t++) { //跑时间
//记录队列中队首的进程
deque<PCB>::iterator it;
it = que.begin();
query(); //当前是否有进程到达,有则入队
if(que.empty()) continue; //如果队列空,跳过
if(!sjp || !cur.serve) { //时间片用完了 或 当前进程运行完了,则调度
sjp = q; //恢复时间片
que.erase(it); //删除之前记录的进程(相当于把那个进程出队)
if(cur.serve) que.push_back(cur); //如果当前进程没有运行完,则移到队尾
else pcb_list[cur.id].finish = t; //运行完了,设置完成时刻
if(!que.empty()) cur = que.front(); //取新的队首
else continue; //已经空了,跳过
}
sjp--,cur.serve--; //时间片-1,当前进程服务时间-1
}
}
void set_max_time() {
for(int i = 0; i < n; i++) {
max_time += pcb_list[i].serve;
}
}
int main() {
double sum_zzsj=0;
double sum_dqzzsj=0;
printf("请输入进程数:");
cin >> n ; //输入进程数和时间片时长
printf("请输入每个进程的进程名 到达时间 服务时间\n");
for(int i = 0; i < n; i++)
cin >&g