一个简单的模拟进程调度的C++程序

Posted dilthey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的模拟进程调度的C++程序相关的知识,希望对你有一定的参考价值。

这是我们操作系统实验课的一个实验程序,模拟简单的若干个进程在执行态和就绪态之间的变动。

我根据实验指导书上给出的程序进行了一点修改。

 

#include<cstdio>
#include<cstdlib>

struct PCB
{
    char name[10];
    char state; //状态
    int super; //优先级
    int ntime; //预计运行时间
    int rtime; //实际运行时间
    PCB *link;
}*ready=NULL, *p;

void disp(PCB *pr) /*建立进程显示函数,用于显示当前进程 */
{
    printf("\n qname \t state \t super \t ntime \t rtime \n");
    printf("|%s \t ",pr->name);
    printf("|%c \t ",pr->state);
    printf("|%d \t ",pr->super);
    printf("|%d \t ",pr->ntime);
    printf("|%d \t ",pr->rtime);
    printf("\n");
}

void check() /* 建立进程查看函数 */
{
    printf("\n ******** 当前正在运行的进程是:%s",p->name); /* 显示当前运行进程 */
    disp(p);

    printf("\n ******** 当前就绪队列状态为:\n"); /* 显示就绪队列状态 */
    PCB *pr=ready;
    while(pr!=NULL) disp(pr), pr=pr->link;
}

void sort() /* 建立对进程进行优先级排列函数 */
{
    if(ready==NULL || (p->super)>(ready->super)) /* 优先级最大者,插入队首 */
    {
        p->link=ready;
        ready=p;
    }
    else /* 进程比较优先级,插入适当的位置中 */
    {
        PCB *first=ready, *second=first->link;
        while(second!=NULL)
        {
            if((p->super)>(second->super)) /* 若插入进程比当前进程优先数大,插入到当前进程前面 */
            {
                first->link=p;
                p->link=second;
                return;
            }

            first=first->link;
            second=second->link;
        }
        first->link=p;
    }
}

void input() /* 建立进程控制块函数 */
{
    system("cls");

    printf("\n 请输入进程数目?");
    int num; scanf("%d",&num);

    for(int i=0;i<num;i++)
    {
        printf("\n 进程号 No.%d:\n",i);
        p=(PCB *)malloc(sizeof(PCB));

        printf("\n 输入进程名:");
        scanf("%s",p->name);

        printf("\n 输入进程优先数:");
        scanf("%d",&(p->super));

        printf("\n 输入进程运行时间:");
        scanf("%d",&(p->ntime));

        printf("\n");

        p->rtime=0;
        p->state=w;
        p->link=NULL;

        sort(); /* 调用 sort 函数 */
    }

    system("cls");
    printf("\n ******** 进程创建如下:\n");
    PCB *pr=ready;
    while(pr!=NULL) disp(pr), pr=pr->link;
}

inline void destroy() /*建立进程撤消函数(进程运行结束,撤消进程) */
{
    printf("\n 进程 [%s] 已完成.\n",p->name), free(p);
}

inline void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态) */
{
    (p->rtime)++;
    if(p->rtime==p->ntime)
        destroy(); /* 调用 destroy 函数 */
    else
        --(p->super), p->state=w, sort();
}

int main() /*主函数*/
{
    input();

    int h=0;
    while(ready!=NULL)
    {
        getchar();
        printf("\n The execute number:%d \n",++h);

        p=ready;
        ready=p->link;
        p->link=NULL;
        p->state=r;

        check();
        running();

        printf("\n 按任意键继续......"), getchar();
    }

    printf("\n\n 进程已经全部完成.\n");
    getchar();

    return 0;
}

/*
3
A
3
5
B
2
3
C
1
4
*/

 

以上是关于一个简单的模拟进程调度的C++程序的主要内容,如果未能解决你的问题,请参考以下文章

会的帮做下!

模拟处理机进程调度-简单循环轮转调度算法

Ubuntu编制模拟一个简单的进程管理子系统,由进程建立模块进程撤消模块进程控制表组成,并包括进程切换和调度模块

进程调度模拟程序

实验三进程调度模拟程序

实验三进程调度模拟程序2.0