操作系统//进程状态转换模拟(STLqueue、时间片轮转)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<queue>
using namespace std;
//设置时间片
int timeSlice = 3;    //自定义时间片的长度
//CPU最大数量
int cpu_size = 2;//CPU容量
//设置进程数目
int number = 0;        //进程的数目

//节点的作业控制块PCB信息
typedef struct PCB {
    int Name;            //进程的名称
    int Time;            //进程需要运行的时间
}PCB;
//创建队列
queue<PCB>readyqueue;
queue<PCB>runqueue;
queue<PCB>blockqueue;


//就绪态队列(往就绪态里放进程)
void SetReadyQueue()
{
    number++;//进程数量上限为100
    if (number > 100)
    {
        return;
    }
    PCB readyQ;//创建进程
    cout << "请输入进程名称:" << endl;
    cin >> readyQ.Name;
    cout << "请输入进程所需运行时间:" << endl;
    cin >> readyQ.Time;
    readyqueue.push(readyQ);
}

//就绪态->运行态
void ReadyToRun()
{
    while (cpu_size-- && !readyqueue.empty())//当满足CPU大小且就绪态不为空时
    {
        PCB runQ = readyqueue.front();//获得就绪态中最在前的进程
        readyqueue.pop();//就绪态弹出进程
        runqueue.push(runQ);
        cout << "运行态进程信息:" << "  " << "进程名称:" << runQ.Name << " " << "进程所需运行时间:" << runQ.Time << endl;
    }
    cpu_size = 2;//每次都要刷新定义cpu容量
}

//运行态到阻塞态
void RunToBlock()
{
    while (!runqueue.empty())//当运行态不为空时
    {
        PCB blockQ = runqueue.front();
        runqueue.pop();//弹出运行态进程
        blockqueue.push(blockQ);
        cout << "阻塞态进程信息:" << "  " << "进程名称:" << blockQ.Name << " " << "进程所需运行时间:" << blockQ.Time << endl;
    }
}

//阻塞态到就绪态
void BlockToReady()
{
    while (!blockqueue.empty())
    {
        PCB readyQ_1 = blockqueue.front();
        blockqueue.pop();//弹出阻塞态进程
        readyqueue.push(readyQ_1);
    }
}
//输出队列进程信息
void PrintReadyQueue(queue<PCB> q)
{
    while (!q.empty())
    {
        cout << "就绪态进程信息:" << "  " << "进程名称:" << q.front().Name << " " << "进程所需运行时间:" << q.front().Time << endl;
        q.pop();
    }
}

//时间片轮转(就绪到运行->判断时间片->回到就绪or运行结束)
void RunToReady()
{
    while (!runqueue.empty())//当运行态不为空时
    {
        if (runqueue.front().Time > timeSlice)//若时间片不够
        {
            runqueue.front().Time = runqueue.front().Time - timeSlice;
            PCB readyQ_1 = runqueue.front();//获得更改后的进程
            readyqueue.push(readyQ_1);
            runqueue.pop();//弹出转移回就绪态的进程
            cout << "时间片用完,回到就绪态" << endl;
        }
        else
        {
            cout << "运行态中的进程运行完毕!" << endl;
            runqueue.pop();//弹出小于时间片的进程
        }
    }
}


int main()
{

    int t = 0;//用于选择执行那哪一条过程
    while (t != 7)
    {
        cout << "============================================" << endl;
        cout << "进程状态转换模拟" << endl;
        cout << "============================================" << endl;
        cout << "1:创建就绪态" << endl;
        cout << "2:就绪态->运行态" << endl;
        cout << "3:运行态->阻塞态" << endl;
        cout << "4:阻塞态->就绪态  " << endl;
        cout << "5:运行态->就绪态或运行完毕 " << endl;
        cout << "6:时间片轮转  " << endl;
        cout << "7:退出程序 " << endl;
        cout << "------------------------------------------------------------------" << endl;
        cout << "请选择(1~7):" << endl;
        cin >> t;
        switch (t) {
        case 1:
            SetReadyQueue();
            break;
        case 2:
            ReadyToRun();
            break;
        case 3:
            RunToBlock();
            break;
        case 4:
            BlockToReady();
            PrintReadyQueue(readyqueue);
            break;
        case 5:
            RunToReady();
            PrintReadyQueue(readyqueue);
            break;
        case 6:
            while (!readyqueue.empty())
            {
                ReadyToRun();
                cout << endl;
                RunToReady();
                PrintReadyQueue(readyqueue);
                cout << endl;
            }
            break;
        case 7:
            cout << "模拟过程结束!感谢使用 scuec" << endl;
            exit(0);
            break;
        }
    }
    return 0;

}


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值