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

    13物联网      201306104107      黄鸿佳

    1. 目的和要求

    实验目的   13物联网      201306104107      黄鸿佳

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

    实验要求

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

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

     

    2. 实验内容

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

     

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

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

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

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

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

     

    3. 实验原理及核心算法 

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

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

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

     

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

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

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

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

     

    源代码

    #include<stdio.h>
    #include<stdlib.h>
    #define getpch(type)(type*)malloc(sizeof(type))
    #define NULL 0
    
    struct pcb{   //定义进程控制块PCB
        char name[10];   //进程名
        char state;   //状态
        int priority;   //优先级
        int needtime;   //运行所需时间
        int rtime;   //到达时间
        struct pcb* link;
    }*ready=NULL,*p;
    typedef struct pcb PCB;
    sort()    //建立对进程进行优先级排列顺序
    {
        PCB *first,*second;
        int insert=0;
        if((ready==NULL)||((p->priority)>(ready->priority)))  //优先级最大者,插入队首
        {
            p->link=ready;
            ready=p;
        }
        else   //进程比较优先级,插入适当的位置中
        {
            first=ready;
            second=first->link;
            while(second!=NULL)
            {
                if((p->priority)>(second->priority))  //若插入进程比当前进程优先数大,插入到当前进程前面
                {
                    p->link=second;
                    first->link=p;
                    second=NULL;
                    insert=1;
                }
                else   //插入进程优先数最低,则插入到队尾
                {
                    first=first->link;
                    second=second->link;
                }
            }
            if(insert==0)
                first->link=p;
        }
    }
    input()   //建立进程控制块函数
    {
        int i,num,t;
        printf("
     请输入进程数:");
        scanf("%d",&num);
           printf("请输入时间片大小t:");
        scanf("%d",&t);
        for(i=0;i<num;i++)
        {
            printf("
     进程号No.%d:
    ",i);
            p=getpch(PCB);
            printf("
     输入进程名:");
            scanf("%s",p->name);
    
            printf("
     输入进程优先数:");
            scanf("%d",&p->priority);
            printf("
     输入进程运行时间:");
            scanf("%d",&p->needtime);
            printf("
    ");
            p->rtime=0;
            p->state='W';
            p->link=NULL;
            sort();   //调用sort函数
        }
    }
    
    int space()
    {
        int l=0;
        PCB *pr=ready;
        while(pr!=NULL)
        {
            l++;
            pr=pr->link;
        }
        return(l);
    }
    disp(PCB *pr)   //建立进程显示函数,用于显示当前进程
    {
        printf("
     name	 state	 priority	 needtime	 runtime 
    ");
        printf(" %s	",pr->name);
        printf("  %c	",pr->state);
        printf("   %d		",pr->priority);
        printf("   %d		",pr->needtime);
        printf("   %d	",pr->rtime);
        printf("
    ");
    }
    check()   //建立进程查看函数
    {
        PCB *pr;
        printf("
     当前正在运行的进程是:%s",p->name);   //显示当前运行进程
        disp(p);
        pr=ready;
        printf("
     当前就绪队列状态为:
    ");   //显示就绪队列状态
        while(pr!=NULL)
        {
            disp(pr);
            pr=pr->link;
        }
    }
    destroy()   //建立进程撤销函数(进程运行结束,撤销进程)
    {
        printf("
     进程[%s] 已完成。
    ",p->name);
        free(p);
    }
    running()   //建立进程就绪函数(进程运行时间到,置就绪状态)
    {
        (p->rtime)++;
        if(p->rtime==p->needtime)
            destroy();   //调用destroy函数
        else
        {
            (p->priority)--;
            p->state='W';
            sort();  // 调用sort函数
        }
    }
    main()   //主函数
    {
        int len,h=0;
        char ch;
        input();
        len=space();
        while((len!=0)&&(ready!=NULL))
        {
            ch=getchar();
            h++;
            printf("
     The execute number:%d 
    ",h);
            p=ready;
            ready=p->link;
            p->link=NULL;
            p->state='R';
            check();
            running();
            
        }
        printf("
    
     进程已经完成。
    ");
        ch=getchar();
    }

    4.实验结果

    5.总结

       实验中先对输入的进程按到达系统时间和优先级排序,再对第一个进程的状态设置为R表示运行。然而实际上,任意时刻都是只能运行排好序后的第一个进程。

    通过这个实验,发现自己对算法还是很不熟悉,像这次的时间轮转算法用了很多时间才完成,以后要多接触,多运用。

  • 相关阅读:
    CF1539 VP 记录
    CF1529 VP 记录
    CF875C National Property 题解
    CF1545 比赛记录
    CF 1550 比赛记录
    CF1539E Game with Cards 题解
    CF1202F You Are Given Some Letters... 题解
    vmware Linux虚拟机挂载共享文件夹
    利用SOLR搭建企业搜索平台 之九(solr的查询语法)
    利用SOLR搭建企业搜索平台 之四(MultiCore)
  • 原文地址:https://www.cnblogs.com/hhj666/p/5018104.html
Copyright © 2011-2022 走看看