using namespace std;
#include <iostream>
#include <bits/stdc++.h>
#include<math.h>
#include<queue>
struct Node {
string a;
int arr; //到达时间
int need; //需要时间
int done=0; //已占用CPU时间
int priority; //优先级
char status='U'; //进程状态 有R W U三种分别为运行 等待 未到达,其实就是个标记,反正不会显示
};
Node in[11];
int n;
int Time = 0;
int finish = 0;
int pNum = 0;//已到达的数量
Node pre[11];
double ans1 = 0;
double ans2 = 0;
bool cmp(Node x, Node y)
{
return x.arr < y.arr;
}
bool cmpP(Node x, Node y)
{
return x.priority > y.priority;
}
bool cmpSJF(Node x, Node y)
{
return x.need < y.need;
}
void init() {
cout << "\t请输入进程个数(最大10个) ";
cin >> n;
cout << "\t请输入 进程名称 到达时间 运行时间 优先级" << endl;
for (int k = 1;k <= n;k++) { cout << "\t";cin >> in[k].a >> in[k].arr >> in[k].need >> in[k].priority; }
sort(in+1,in+n+1,cmp);
cout << "\n\n";
}
void runtable() {//by Max
for (int k = 1;k <= pNum;k++) {
if (pre[k].status == 'R')
cout << "本次运行结果:\n\t" << pre[k].a << "\t" << pre[k].arr << "\t" << pre[k].need << "\t" << pre[k].done << "\t" << pre[k].priority << "\t" << "运行\n\n" << endl;
}
}
void pretable() {
cout << " 进程名称 到达时间 所需时间 已运行时间 优先级 当前状态" << endl;
for (int k = 1;k <= pNum;k++) {
if (pre[k].status == 'R') cout << "\t" << pre[k].a << "\t" << pre[k].arr << "\t" << pre[k].need << "\t" << pre[k].done << "\t" << pre[k].priority << "\t" << "运行" << endl;
else if (pre[k].status == 'W') cout << "\t" << pre[k].a << "\t" << pre[k].arr << "\t" << pre[k].need << "\t" << pre[k].done << "\t" << pre[k].priority << "\t" << "等待" << endl;
}
}
void PSA() {
while (finish<n) {//完成个数小于总个数
finish = 0;
for (int k = 1;k <= n;k++) {//循环一遍,将准备好的进程复制到新数组,没有的话就将time++再来一次
if (in[k].arr == Time&&in[k].status=='U') { in[k].status = 'W';pre[pNum + 1] = in[k];pNum++; }
if (pNum - finish <= 0) { Time++; k = 0;continue; }
}
sort(pre + 1, pre + 1 + pNum, cmpP);//将pre数组准备好的进程按照优先级排列
for (int k = 1;k <= pNum;k++) {
if (pre[k].done == pre[k].need)finish++;
if (pre[k].done < pre[k].need) {
pre[k].status = 'R';
cout << " *****************************************************" << endl;
cout << "\n当前时刻为:" << Time<<endl;
pretable();
pre[k].done++;
runtable();
Time++;
pre[k].status = 'W';
if (pre[k].done == pre[k].need) { pre[k].status = 'F'; ans1 += (Time - pre[k].arr);ans2 += (double)(Time - pre[k].arr) / (double)pre[k].need;
}
break;
}
}
}
cout << "\n\t\t***********";
cout << "\n\t\t运行结束";
cout << "\n\t\t平均周转时间为:" << ans1 / n;
cout << "\n\t\t平均带权周转时间为:" << ans2 / n;
}
void FCFS() {
while (finish < n) {//完成个数小于总个数
finish = 0;
for (int k = 1;k <= n;k++) {//循环一遍,将准备好的进程复制到新数组,没有的话就将time++再来一次
if (in[k].arr == Time && in[k].status == 'U') { in[k].status = 'W';pre[pNum + 1] = in[k];pNum++; }
if (pNum - finish <= 0) { Time++; k = 0;continue; }
}
for (int k = 1;k <= pNum;k++) {
if (pre[k].done == pre[k].need)finish++;
if (pre[k].done < pre[k].need) {
pre[k].status = 'R';
cout << "\n当前时刻为:" << Time<<endl;
pretable();
pre[k].done++; //已运行时间+1
runtable();
Time++; //时间片+1
pre[k].status = 'W'; //重新等待ing
if (pre[k].done == pre[k].need) { pre[k].status = 'F'; ans1 += (Time - pre[k].arr);ans2 += (double)(Time - pre[k].arr)/ (double)pre[k].need;
}
break;
}
}
}
cout << "\n\t\t***********";
cout << "\n\t\t运行结束";
cout << "\n\t\t平均周转时间为:" << ans1 / n;
cout << "\n\t\t平均带权周转时间为:" << ans2 / n;
}
void MFQ() {
queue<Node> q1;
queue<Node> q2;
queue<Node> q3;
Node temp;
Node x;
while ((!q1.empty() || !q2.empty() || !q3.empty()) || Time <= in[n].arr) {//完成个数小于总个数
finish = 0;
for (int k = 1;k <= n;k++) {//循环一遍,将准备好的进程复制到新数组,没有的话就将Time++再来一次
if (in[k].arr == Time && in[k].status == 'U') { in[k].status = 'W';q1.push(in[k]); }
if (q1.empty() && q2.empty() && q3.empty()) { Time++; continue; }
}
if (!q1.empty()) {
x = q1.front();
if (x.done < x.need) {
x.status = 'R';
cout << "\n第一队列:";
cout << "\n当前时刻为:" << Time << endl;
//此处添加函数 将队列转化为数组输出
pNum = q1.size();pre[1] = x;q1.push(x);q1.pop();
for (int kk = 2;kk <= q1.size();kk++) {
temp = q1.front();
pre[kk] = temp;
q1.push(temp);
q1.pop();
}
pretable();
x.done++;
pre[1].done++;
runtable();
Time++;
x.status = 'W';
if (x.done == x.need) {
q1.pop();
ans1 += (Time - x.arr);ans2 += (double)(Time - x.arr) / (double)x.need;
}
else {
q2.push(x);
q1.pop();
}
}
}
if (q1.empty() && !q2.empty()) {
x = q2.front();
if (x.done < x.need) {
int flag = 0;
for (int kk = 1;kk <= 2;kk++) {
x.status = 'R';
cout << "\n第二队列:";
cout << "\n当前时刻为:" << Time << endl;
//此处添加函数 将队列转化为数组输出
pNum = q2.size();pre[1] = x;q2.push(x);q2.pop();
for (int kk = 2;kk <= q2.size();kk++) {
temp = q2.front();
pre[kk] = temp;
q2.push(temp);
q2.pop();
}
pretable();
x.done++;
pre[1].done++;
runtable();
Time++;
x.status = 'W';
if (x.done == x.need) {
break;
}
for (int k = 1;k <= n;k++) if (in[k].arr == Time && in[k].status == 'U') flag = 1;
if (flag == 1) {
break;
}
}
if (flag == 1) {
q2.push(x);
q2.pop();
continue;
}
if (x.done == x.need) {
ans1 += (Time - x.arr);ans2 += (double)(Time - x.arr )/ (double)x.need;
q2.pop();
}
else {
q3.push(x);
q2.pop();
}
}
}//第er队列结束,第三队列开始
if (q1.empty() && q2.empty() && !q3.empty()) {
x = q3.front();
int flag = 0;
for (int kk = 1;kk <= 3;kk++) {
x.status = 'R';
cout << "\n第三队列:";
cout << "\n当前时刻为:" << Time << endl;
//此处添加函数 将队列转化为数组输出
pNum = q3.size();pre[1] = x;q3.push(x);q3.pop();
for (int kk = 3;kk <= q3.size();kk++) {
temp = q3.front();
pre[kk] = temp;
q3.push(temp);
q3.pop();
}
pretable();
x.done++;
pre[1].done++;
runtable();
Time++;
x.status = 'W';
if (x.done == x.need) {
break;
}
for (int k = 1;k <= n;k++) if (in[k].arr == Time && in[k].status == 'U') flag = 1;
if (flag == 1) {
break;
}
}
if (flag == 1) {
q3.push(x);
q3.pop();
continue;
}
if (x.done == x.need) {
ans1 += (Time - x.arr);ans2 += (double)(Time - x.arr )/ (double)x.need;
q3.pop();
}
else {
q3.push(x);
q3.pop();
}
}
}
cout << "\n\t\t***********";
cout << "\n\t\t运行结束";
cout << "\n\t\t平均周转时间为:" << ans1 / n;
cout << "\n\t\t平均带权周转时间为:" << ans2 / n;
}
void SJF() {
while (finish < n) {//完成个数小于总个数
finish = 0;
for (int k = 1;k <= n;k++) {//循环一遍,将准备好的进程复制到新数组,没有的话就将time++再来一次
if (in[k].arr == Time && in[k].status == 'U') { in[k].status = 'W';pre[pNum + 1] = in[k];pNum++; }
if (pNum - finish <= 0) { Time++; k = 0;continue; }
}
sort(pre + 1, pre + 1 + pNum, cmpSJF);//将pre数组准备好的进程按照短到长级排列
for (int k = 1;k <= pNum;k++) {
if (pre[k].done == pre[k].need)finish++;
if (pre[k].done < pre[k].need) {
pre[k].status = 'R';
cout << "\n当前时刻为:" << Time << endl;
pretable();
pre[k].done++;
runtable();
Time++;
pre[k].status = 'W';
if (pre[k].done == pre[k].need) {
pre[k].status = 'F'; ans1 += (Time - pre[k].arr);ans2 += (double)(Time - pre[k].arr )/ (double)pre[k].need;
}
break;
}
}
}
cout << "\n\t\t***********";
cout << "\n\t\t运行结束";
cout << "\n\t\t平均周转时间为:" << ans1/ n;
cout << "\n\t\t平均带权周转时间为:" << ans2 / n;
}
int main()
{
int menu;
int t = 1;
printf("\n ------------------\n");
printf(" | |\n");
printf(" |进程调度模拟实验| \n");
printf(" | |\n");
printf(" ------------------\n\n");
printf(" |1:PSA\n");
printf(" |2:FCFS\n");
printf(" |3:MFQ\n");
printf(" |4:SJF\n");
printf(" |其他任意键:退出\n");
printf(" |那么您的选择是---> ");
cin >> menu;
while(t--)
if (menu == 1) {
init();//初始化
PSA();
}
else if (menu==2) {
init();
FCFS();
}
else if (menu==3) {
init();
MFQ();
}
else if (menu==4) {
init();
SJF();
}
else {
cout << "输入错误" << endl;
}
return 0;
}
模拟进程调度
最新推荐文章于 2024-10-02 08:00:00 发布