模拟进程调度


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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值