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