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

    一、实验目的

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

    二、实验内容及要求

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

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

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

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

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

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

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

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

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

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

    1、源程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream.h>
    
    typedef struct node
    {
    char name[10];     
    int prio;          
    int round;         
    int cputime;       
    int needtime;      
    int count;         
    char state;        
    struct node *next; 
    }PCB;
    PCB *finish,*ready,*tail,*run; //队列指针
    int N;     //进程数
    
    void firstin()
    {
    run=ready;      //就绪队列头指针赋值给运行头指针
    run->state='R'; //进程状态变为运行态]
    ready=ready->next; //就绪队列头指针后移到下一进程
    }
    //输出标题函数
    void prt1(char a)
    {
    if(toupper(a)=='P') //优先级法
       cout<<" "<<endl;
    cout<<"进程名 占用CPU时间 到完成还要的时间 轮转时间片 状态"<<endl;
    }
    
    //进程PCB输出
    void prt2(char a,PCB *q)
    {
    if(toupper(a)=='P') //优先级法的输出
       cout<<q->name<<"       "<<q->cputime<<"           "<<q->needtime<<"               "<<
       q->round<<"         "<<q->state<<endl;
    }
    
    //输出函数
    void prt(char algo)
    {
    PCB *p;
    prt1(algo); //输出标题
    if(run!=NULL) //如果运行指针不空
       prt2(algo,run); //输出当前正在运行的PCB
    p=ready; //输出就绪队列PCB
    while(p!=NULL)
    {
       prt2(algo,p);
       p=p->next;
    }
    p=finish;   //输出完成队列的PCB
    while(p!=NULL)
    {
       prt2(algo,p);
       p=p->next;
    }
    getchar(); //按住任意键继续
    }
    
    //时间片轮转的插入算法
    void insert(PCB *q)
    {
    PCB *p1,*s,*r;
    s=q; //待插入的PCB指针
    p1=ready; //就绪队列头指针
    r=p1; //*r做pl的前驱指针
    while(p1!=NULL)
       if(p1->round<=s->round)
       {
        r=p1;
        p1=p1->next;
       }
       if(r!=p1)
       {
        r->next=s;
        s->next=p1;
       }
       else
       {
        s->next=p1; //否则插入在就绪队列的头
        ready=s;
       }
    }
    
    //优先级创建初
    void create(char alg)
    {
    PCB *p;
    int i,time;
    char na[10];
    ready=NULL; 
    finish=NULL; 
    run=NULL;    
    cout<<"输入进程名及其需要运行的时间:"<<endl; 
    for(i=1;i<=N;i++)
    {
       p=new PCB;
       cin>>na;
       cin>>time;
       strcpy(p->name,na);
       p->cputime=0;
       p->needtime=time;
       p->state='W';
    
       p->round=0;
       if(ready!=NULL) 
        insert(p);
       else
       {
        p->next=ready; 
        ready=p;
       }
       cout<<"输入进程名及其需要运行的时间:"<<endl; 
    }
    prt(alg); 
    run=ready; 
    ready=ready->next;
    run->state='R';
    }
    
    void timeslicecycle(char alg)
    {
    while(run!=NULL)
    {
       run->cputime=run->cputime+8;
       run->needtime=run->needtime-8;
       run->round=run->round+8;
       if(run->needtime<=0)
       {
        run->next=finish;
        finish=run;
        run->state='F';
        run=NULL;
        if(ready!=NULL)
         firstin();
       }
       else
       {
        run->state='W';
        insert(run);
        firstin();
       }
       prt(alg);
    }
    }
    
    //主函数
    void main()
    {
    char algo='P'; //算法标记
    cout<<"输入进程的个数:";
    cin>>N; //输入进程数
    create(algo); //创建进程
    timeslicecycle(algo); //优先级法调度
    } //main() 
    

    2.运行结果

    4.结果分析

          这次的实验比上次困难很多。研究了很久,参考了网上很多资料,才勉强弄懂了时间片的程序。但是多级反馈的程序还是没能弄出来,在网上也找不到能够成功实现的程序。所以不足之处还是要等日后慢慢学习才能弥补。

  • 相关阅读:
    PostgreSQL 遇到 column "value" does not exist
    FlowPortal BPM官网改版了,推出20个流程免费基础版
    C#代码规范化(代码风格化)的几个函数
    批量更新带有命名空间的XML文件的多个节点值
    旺财C# .NET代码生成器之DTcms4/5代码批量生成功能
    C# Webform中读取Windows AD/LDAP域用户清单
    在吉日嘎拉DotNet.WebForm中使用FluentScheduler调度任务
    修复一个吉日嘎拉MSSQL数据库版中的分页存储过程bug
    基于吉日嘎拉的OA协同办公模块重写
    基于吉日嘎拉的通用权限管理WebForm版扩展:字典选项管理和缓存管理
  • 原文地址:https://www.cnblogs.com/chyl/p/5014111.html
Copyright © 2011-2022 走看看