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


                               实验三 进程调度模拟程序   

                    专业:物联网工程   姓名:黄淼  学号:201306104145

    一、 实验目的和要求

    目的:

    用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

    实验要求

    设计一个有 NN不小于5)个进程并发执行的进程调度模拟程序。

    进程调度算法:时间片轮转法调度算法对N个进程进行调度。 

     

    二、实验内容

    完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。

        1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 

        2) 每个进程的状态可以是就绪 rready)、运行RRunning)、或完成FFinished)三种状态之一。

        3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

        4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。

        5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。   

    6) 重复以上过程,直到所要进程都完成为止。

     

     三、实验原理及核心算法:

    轮转法有简单轮转法、多级反馈队列调度算法。

        (1). 简单轮转法的基本思想是:

    所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片长度相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。

        (2). 多级反馈队列调度算法的基本思想是:

    将就绪队列分为N级(N35),每个就绪队列优先数不同并且分配给不同的时间片:队列级别越高,优先数越低,时间片越长;级别越小,优先数越高,时间片越短。

    系统从第一级调度,当第一级为空时,系统转向第二级队列,.....当处于运行态的进程用完一个时间片,若未完成则放弃CPU,进入下一级队列。

    当进程第一次就绪时,进入第一级队列。 

     四、实验环境

    自主选择实验环境。可以选用Turbo C作为开发环境。也可以选用Windows下的可视化环境,利用各种控件较为方便。

     

    五、实验方法、步骤及结果测试

    1.源程序名:压缩包文件(rar或zip)中源程序名 hm.c

    可执行程序名:hm.exe

    2.原理分析及流程图

       采用数组来存储功能,在之前做过的作业调度的基础上改的。

     

     

    3.主要程序段及其解释:

    #include<stdio.h>

    #include<string.h>

    #include<conio.h>

    #include<stdlib.h>

    int i,k,num,m,n;

    #define N 25

    struct JCB{

            char name[10];      //进程名

            float AT;           //到达时间  

            float RT;           //运行时间  

            float S;            //开始时间       

            float F;            //完成时刻  

            float CT;     //已用CPU时间

    char status[25];       //状态

            float p;            //优先级

    }jcb[N],temp;

    void input()                //用户输入模块

    {

        int i;  

        do{

            printf(" 请输入作业数(3-24):");

            scanf("%d",&num); 

            printf(" ");

            if(num<3||num>24)

    {

                printf("输入错误,请重新输入! ");

            }

        }

        while(num<3||num>24);

        for(i=0;i<num;i++)

    {

            strcpy(jcb[i].status,"r");   //在调度之前所有的进程的状态都是等待

            printf("%d个作业名:",i+1);   

            scanf("%s",&jcb[i].name);   

            printf(" 提交时间:");   

            scanf("%f",&jcb[i].AT);   

            printf(" 运行时间:");   

            scanf("%f",&jcb[i].RT); 

            printf(" ");

        }

    }

    void output()             //输出模块

    {

        printf("************************************* ");

        printf(" 作业名 到达时间 运行时间 已用CPU时间 ");

        for(i=0;i<num;i++)

        {

            printf("   %-9s%-9.0f%-9.0f%-10.0f% ",jcb[i].name,jcb[i].AT,jcb[i].RT,jcb[i].CT);

        }

        printf("************************************* ");

    }

    void simple()     //简单轮转法

    {

    int time=1,m=0,ge=0;     //time代表时间

    int i,j;

    int a[25];

    while(1)

    {

            for(j=0;j<num;j++)

            {

                if(jcb[j].AT>=time)//判断当时有多少作业到达 

    {               

       a[m]=j;

          m++;

    }

            }

    for(i=0;i<m;i++)      //m个为一个循环

    {

    if(strcmp(jcb[a[i]].status,"f")==0) continue;//已调度完毕的则不需要再调度

                else jcb[a[i]].CT++;             //CPU时间加一

    if(jcb[a[i]].CT==jcb[a[i]].RT)  //如果该进程的使用CPU时间等于运行时间,则它的状态为完成。

    strcpy(jcb[a[i]].status,"f");

    time++;

    output();

    }

    for(i=0;i<num;i++)     //判断是否所有调度都完成 是则退出while

    {

    if(strcmp(jcb[a[i]].status,"f")==0) ge++;

    if(ge==num) break;

    }

    if(ge==num) break;

       

    }

    }

    main()

    {

        int n;  

        do{

    input();

    printf("进程调度模拟程序 ");  

    printf("0:exit退出 "); 

    scanf("%d",&n);

    printf(" ");

    if(n==0) continue;

    else simple();

    }

    while(n!=0);  

    }

     4.运行结果及分析

    输入模块:

     

    运行结果:

     

     

     

     

    六、实验总结

       本来还要写多级反馈队列调度,可是不会写,只写了简单轮转法,并实现了该算法的运算结果以及显示了该过程,还有待进步。

     

      

     

  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/hm12/p/5014234.html
Copyright © 2020-2023  润新知