自学内容网 自学内容网

#自定义数据类型-模拟进程执行

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


原文地址:https://blog.csdn.net/2401_86982397/article/details/144413069

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!