zoukankan      html  css  js  c++  java
  • 实验三进程调度模拟程序

    1. 目的和要求

    实验目的

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

    实验要求

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

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

     

    2. 实验内容

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

     

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

    2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。

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

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

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

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

     

    3. 实验原理及核心算法 

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

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

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

     

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

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

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

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

     

    主要程序:

    /*****时间片轮转法进行CPU调度算法********/
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #define N 10  //定义最大进程数
    #define TIME 2//定义时间片大小
    typedef struct pcb{
        char id[10];//进程标识数
        int arrivetime;//到达时间
        int runtime;//进程已经占用的cpu时间
        int needtime;//进程还需要的时间
        char state[12];//进程运行状态:wait or runing
        struct pcb *next;
    }pcb,*PCB;
    PCB head;//设置全局变量用来修改就绪队列
    PCB tail;
    int count=0;//记录就绪队列中进程数
    void CreatProcess(){
        //创建进程
        PCB p,q;//进程的头尾指针都有
        int num;//记录要创建的进程数
        int i,j;
        int arrive[N];
        head=tail=(PCB)malloc(sizeof(pcb));
        head->next=NULL;
        p=head;
        printf("输入你要创建的进程数:");
        scanf("%d",&num);
        count=num;
        printf("********按照进程到达时间从小到大创建就绪队列******
    ");
        //初始对其排序来创建就绪队列
        for(i=1;i<=num;i++){
            p->next=(PCB)malloc(sizeof(pcb));
            p=p->next;
            tail=p;
            printf("输入进程%d的标示符:",i);
            scanf("%s",p->id);
            printf("输入进程%d的到达时间:",i);
            scanf("%d",&p->arrivetime);
            printf("输入进程%d已占用的cpu时间:",i);
            scanf("%d",&p->runtime);
            printf("输入进程%d还需要的cpu时间:",i);
            scanf("%d",&p->needtime);
            printf("输入进程%d当前状态:(run 或者wait):",i);
            scanf("%s",p->state);
        }
        tail->next=p->next=NULL;
    }
    void RR_RunProcess(){
        //运行进程,简单轮转法Round Robin
        PCB p,q,temp;
        p=head->next;
        while(1){
        if(head->next==NULL)
        {
            printf("此时就绪队列中已无进程!
    ");
                return ;
        }
        else 
        {
            while(p){
                if((p->needtime>0)&&!(strcmp(p->state,"wait"))){
                    printf("进程%s开始,
    ",p->id );
                    strcpy(p->state,"run");
                    p->runtime+=TIME;
                    p->needtime-=TIME;  
                    if(p->needtime<0)
                        p->needtime=0;
                }
                temp=p;//把该时间片内运行完的进程存到临时temp中
                //把temp接到链表尾部,销毁P; 
                if(temp->needtime>0){//把该时间片内运行完的进程接到就绪队列的尾部
                    if(count>1){
                    head->next=temp->next;
                    tail->next=temp;
                    tail=tail->next;
                    strcpy(tail->state,"wait");
                    tail->next=NULL;
                    }
                    else if(count==1){//当只有一个进程等待时,分开讨论
                        head->next=temp;
                        tail=temp;
                        strcpy(tail->state,"wait");
                        tail->next=NULL;
     
                    }
                      
                }
                if(temp->needtime==0){//销毁就绪队列中已经结束的进程
                    count--;//此时就绪队列中进程数减1
                    printf("进程%s结束.
    ",p->id);
                    head->next=temp->next;
                    free(temp);//撤销就绪队列中已经结束的进程
     
                }
     
                p=head->next;
     
            }
     
        }
        }
    }
    void main(){
        printf("**************进程的初始状态!**************
    ");
        CreatProcess();
        printf("*******************************************
    		程序运行结果如下:
    
    ");
        printf("*******************************************
    ");
        RR_RunProcess();//简单轮转法Round Robin
      
    }

    截图:

    总结:

    这次作业有一定难度,多级没有写出来。时间片调度算法没有进程执行过程,直接给了结果。这一块存在一定缺陷。

  • 相关阅读:
    HDOJ 3547 DIY Cube 解题报告
    一些经典的期望问题

    人生
    BZOJ 4341 [CF253 Printer] 解题报告
    BZOJ 4302 Buildings 解题报告
    OI 回忆录
    PyQt实现测试工具
    PyQt:eg4
    pyQt: eg3
  • 原文地址:https://www.cnblogs.com/hyj950502/p/5013244.html
Copyright © 2011-2022 走看看