#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
//定义一个名为process的结构体,用于表示进程相关信息
//包含进程名、进程ID、进程优先级、进程状态、进程所需CPU时间、进程描述等成员
struct process
{
string pName;
int pID;
int pPriority;
int pState;
int pCPU;
string pDescription;
};
//函数声明,用于判断应该执行哪个进程,并返回其在数组中的下标
int judge(process arr[]);
//函数声明,用于检验全部进程是否结束,返回布尔值表示结果
bool check(int a, int b, int c, int d);
//函数声明,用于输出全部进程信息,接收当前时间和进程数组作为参数
void printAll(int time, process P[]);
int main()
{
//创建一个包含4个process结构体元素的数组P,并初始化每个元素的各个成员值
//分别表示不同进程的相关信息,如进程名、ID、优先级等
process P[4] = {
{ "chrome.exe", 101, 10, 1, 3, "google chrome" },
{ "360.exe", 102, 7, 1, 1, "360 safe protect" },
{ "QQ.exe", 103, 5, 1, 4, "tencet QQ" },
{ "CPPIDE.exe", 104, 3, 1, 2, "CFree 5.0" }
};
int time = 0;
Begin: //定义一个标签,用于后续的goto语句跳转
//调用judge函数,判断当前应该执行哪个进程,返回该进程在数组中的下标
int i = judge(P);
//如果该进程所需的CPU时间大于0,说明进程还未执行完,进入以下逻辑处理
if (P[i].pCPU > 0)
{
//时间变量自增,表示经过了一个时间单位
time++;
//将当前要执行的进程状态设置为2(进入执行状态)
P[i].pState = 2;
//遍历所有进程
for (int j = 0; j < 4; j++)
{
//如果进程状态不是3(这里可推测3表示已结束状态)且进程所需CPU时间不为0
//则将其优先级加1,模拟优先级调整机制
if (P[j].pState!= 3 && P[j].pCPU!= 0)
P[j].pPriority++;
//如果进程的CPU时间已经消耗完(等于0),则将其状态设置为3,表示已结束
if (P[j].pCPU == 0)
P[j].pState = 3;
}
//将当前正在执行的进程优先级减4,总共相当于减少了3
P[i].pPriority -= 4;
//当前正在执行的进程所需的CPU时间减1,表示消耗了一个单位的CPU时间
P[i].pCPU--;
//调用printAll函数,输出当前所有进程的信息
printAll(time, P);
//将当前执行完一次的进程状态设置为1(再次进入就绪状态)
P[i].pState = 1;
cout << '\n';
}
// 调用check函数,检查所有进程是否都已经结束(即所需CPU时间都为0)
if (check(P[0].pCPU, P[1].pCPU, P[2].pCPU, P[3].pCPU))
//如果还有进程未结束,则跳转到Begin标签处,继续下一轮的进程调度处理
goto Begin;
return 0;
}
//判断应该执行哪个进程,并返回其下标
//逻辑是遍历进程数组,找到优先级最高且CPU时间还未消耗完的进程,返回其下标
int judge(process arr[])
{
int index = 2; //初始化一个默认下标值,这里可随意选取一个初始参考值
for (int i = 0; i < 4; i++)
{
//如果当前进程的优先级大于参考进程的优先级,并且当前进程的CPU时间还未消耗完
if (arr[i].pPriority > arr[index].pPriority && arr[i].pCPU!= 0)
{
//更新参考下标为当前进程的下标
index = i;
}
}
return index;
}
//检验全部进程是否结束
//通过判断传入的四个进程的CPU时间是否都为0来确定,只要有一个不为0则返回true,表示未结束
bool check(int a, int b, int c, int d)
{
return a!= 0 || b!= 0 || c!= 0 || d!= 0;
}
//输出全部进程信息
//遍历进程数组,按照指定格式输出当前时间、进程名、进程ID、进程优先级、
//进程状态、剩余CPU时间以及进程描述信息
void printAll(int time, process P[])
{
for (int i = 0; i < 4; i++)
{
cout << setw(2) << setfill(' ') << left << time
<< ":" << left << setw(12) << P[i].pName
<< setw(5) << P[i].pID
<< setw(3) << P[i].pPriority
<< setw(3) << P[i].pState
<< setw(3) << P[i].pCPU
<< setw(3) << P[i].pDescription
<< "\n";
}
}