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


    一、        实验目的

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

    二、        实验内容和要求

    设计一个有 N个进程并发执行的进程调度模拟程序。

    进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。

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

    (2).  进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。

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

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

    (5).   如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。

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

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

      主要程序段及其解释:

    #include<stdio.h>
    #include<stdlib.h>
    #define M 24
    struct PCB{
        char name;//作业名
        int r;//优先级
        int ct;//需要CPU(运行)时间
        int ht;//已占用CPU时间
        char s;//进程状态
    }p[M];
    
    //输出函数
    void Output(int a)
    {
        int i;
        printf("
    作业名   优先级  所需CPU时间  已占用的CPU时间  进程状态
    ");
        for(i=0;i<a;i++)
        {
            printf("%c	   ",p[i].name);
            printf("  %d		",p[i].r);
            printf("  %d		",p[i].ct);
            printf("  %d		",p[i].ht);
            printf("  %c	
    ",p[i].s);
        }
    }
    
    //输入函数
    int Input()
    {
        int i,n,b=0;
        int init,k;
        int j=1;
        struct PCB f;
        do{
            printf("请输入n个作业(n>=5):");
            scanf("%d",&n);
            if(n>=5)
                break;
        }while(j=1);
        for(i=0;i<n;i++)
        {
            printf("Please enter name:");
            scanf("%s",&p[i].name);
            printf("Please enter ct:");
            scanf("%d",&p[i].ct);
            printf("Please enter r:");
            scanf("%d",&p[i].r);
            p[i].s='r';
            p[i].ht=0;
        }
        for(i=0;i<n;i++)//按优先级别从高到低排序
        {
            init=p[b].r;
            f=p[b];
            for(k=b;k<n;k++)
            {
                if(p[k].r>init)
                {
                    f=p[k];
                    p[k]=p[b];
                    p[b]=f;    
                    init=p[b].r;
                }
            }
            b++;
        }printf("---------------作业按优先级别从高到低排序输出------------");
        Output(n);//按优先级别从高到低排序
        return n;
    }
    
    
    char Select(struct PCB a[M],int t,int n)
    {
        int i,j,init,k=0;
        char s;
        struct PCB f;
        init=a[0].r;
        f=a[0];
        for(i=0;i<n;i++)
        {
            if(a[k].r>init)
            { 
                f=a[k];
                a[k]=a[0];
                a[0]=f;    
                init=a[0].r;
            }
        }
        return a[0].name;
    }
    
    void Start(int t)
    {
        int i,j;
        int k=0,m=0,n=0,q=0,x=0;
        char l;
        int now=4,y=0,z=0;
        struct PCB a[M],b[M],c[M];//a为就绪队列,b为已完成的作业队列,c为等待队列
        j=Input();
        for(i=0;i<j;i++)
            a[i]=p[i];
        while(now>0)
        {
            if(a[0].name==a[1].name)
            {
                for(i=0;i<j;i++)
                    a[i]=c[i];
                x=0;
            }
        l=Select(a,now,j);
        for(i=0;i<j;i++)
        {
            if(a[i].name==l)
            {
                for(y=i;y<j;y++)
                    a[y]=a[y+1];
                break;
            }
        }
        for(i=0;i<j;i++)
        {
            if(p[i].name==l)
            {
                p[i].s='R';
                printf("--------------作业调度中---------------");
                Output(j);    
                p[i].ht=p[i].ht+4;
                if(p[i].ht>p[i].ct)
                    p[i].ht=p[i].ct;
                if(p[i].ht>=p[i].ct)
                {
                    p[i].s='F';
                    printf("--------------一个作业完成---------------");
                    Output(j);
                    b[n]=p[i];
                    n++;
                }
                else 
                {
                    p[i].r=p[i].r-1;
                    p[i].s='r';
                    c[x]=p[i];
                    x++;
                }
                
                break;
            }
        }
        now=now+4;
        if(b[j-1].s=='F')
            break;
        }
        
    }
    
    
    int main()
    {
        int i=1;
        char a;
        int tp=4;
        do{
            Start(tp);
            printf("Do you want to continue?(y or n):");
            scanf(" %c",&a);
            if(a=='n')
                break;
        }while(i=1);
        printf("The end!
    ");
        return 0;
    }






    总结:刚开始编写代码的时候不知该从何下手,但理清思路了后面就没什么问题了。

  • 相关阅读:
    Rsync企业实战之自动异地备份(转)
    Linux启动过程详解 (转)
    Linux系统下修改环境变量PATH路径的三种方法
    linux更改启动级别后,无法启动的问题解决
    MySQLAdmin用法
    mysql toolkit 用法[备忘] (转)
    mysql edit
    MySQL中SSL配置
    mysql ALTER COLUMN MODIFY COLUMN CHANGE COLUMN 区别及用法 (转)
    MySQL 使用mysqld_multi部署单机多实例详细过程 (转)
  • 原文地址:https://www.cnblogs.com/1989-1994/p/4542531.html
Copyright © 2020-2023  润新知