视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
实验六 进程调度算法模拟实现
2025-10-06 09:57:10 责编:小OO
文档
实验六 进程调度算法模拟

1、实验类型

    本实验为设计性实验。

2、实验目的与任务

1) 通过对进程调度算法的设计,加深对进程调度原理的理解,进一步掌握各种调度算法的特征;

2) 针对你所选择的算法的模拟情况进行对算法进行评价(通过比较计算平均周转时间和平均带权周转时间)。

3、预习要求

1)理解各调度算法原理;

2)理解平均周转时间和平均带权周转时间

4、实验基本原理

(1) 设计程序模拟先来先服务(FCFS)进程调度、短进程优先调度(SJF)、高响应比优先调度(HRN)、最高优先权优先调度、时间片轮转调度等算法,要求比较所选算法的平均周转时间和平均带权周转时间,可选用C 、C++或Java 等编程语言中任一种语言。

(2)自设模拟的情景,但要求至少包括四个进程调度。注意,问题情境最好允许用户设定。即当程序启动时,应允许用户可以选择不同的调度算法;然后用户从控制台输入各个进程的信息,进程信息输入完毕后,就开始了进程调度。

参考代码如下:

(3) 认真完成实验报告,同时要求说明模拟的情境、数据结构的使用,程序流程图或步骤,并给出实验结果分析和实验小结;

5、实验仪器与设备(或工具软件)

实验设备:计算机一台;

6、实验内容  

[参考代码如下] 

#include"stdio.h"

#include"stdlib.h"

void dayin();

typedef struct PCB      //定义进程控制块

{

    char num[2];       //进程号

    char state;        //运行状态

    int  tijiaotime;   //提交进程时间

    int  starttime;    //进程开始时间

    int  finishtime;   //结束时间

    int  needtime;           //运行需要时间

    float  roundtime;        //周转时间

    float  weightroundtime;  //带权周转时间

    struct PCB *next;        //指向下个进程

}pcb;

int time=10000,n;       //计时器 (假设当前时间)

float sumroundtime=0,sumweightroundtime=0,avgroundtime,avgweightroundtime; //定义全局平均变量。

pcb *head=NULL,*p,*q; // 进程全局指针。

void run_fcfs(pcb *p1) //进程执行过程

{

time = p1->tijiaotime > time? p1->tijiaotime:time; // 获得真正的当前时间。

p1->starttime=time;

//printf("\\n现在时间是%d,开始运行进程%s\\n",time,p1->num);

time+=p1->needtime;

p1->state='F';

p1->finishtime=time;

p1->roundtime=p1->finishtime-p1->tijiaotime;

p1->weightroundtime=(float)(p1->finishtime-p1->tijiaotime)/(float)p1->needtime;

sumroundtime+=p1->roundtime;

sumweightroundtime+=p1->weightroundtime;

}

void run_spf(pcb *p1,int t) //模拟进程执行过程

{

    

p1->starttime=t;

p1->state='W';

p1->finishtime=t+p1->needtime;

p1->roundtime=p1->finishtime-p1->tijiaotime;

p1->weightroundtime=(p1->finishtime-p1->tijiaotime)/(float)p1->needtime;

sumroundtime+=p1->roundtime;

sumweightroundtime+=p1->weightroundtime;

}

void fcfs() //从队首分别取出进程(找到满足条件的进程,并执行。)

{

    int i,j,t;

for(j=0;j    {

        p=head;

        t=10000;

     for(i=0;i        {

         if(p->tijiaotimestate=='W')

            {

             t=p->tijiaotime;

                q=p;    //标记当前未完成的进程

            }

         p=p->next;

        }

        run_fcfs(q);

    }

    avgroundtime=sumroundtime/n;

    avgweightroundtime=sumweightroundtime/n;

}

/////////////////////////////////////////////////////////////////

void spf() //从队首分别取出进程(找到满足条件的最短进程,并执行。)

{

    int i,j,t,k,futmin,flag;

    t=10000;///

    p=head;

for(i=0;i    {

     if(p->tijiaotimestate=='F')

t=p->tijiaotime;//记录范围内。最早完成时间。

          p=p->next;

    } ///   

    k=0;

while(k    {

        flag=0;

        futmin=10000;//最小的一个服务时间。(在范围内总是可以找到最小的一个服务时间。)

        p=head;

     for(i=0;i        {

         if(p->tijiaotime<=t &&p->state=='F'&& p->needtime<=futmin)

            {

             futmin=p->needtime;// 每一次都要修改当前最早时间。

                q=p;    //标记当前未完成的进程

                flag=1;

            } 

            

         p=p->next;

        }

        if(flag==1)

        {

            k++;

            run_spf(q,t);

         t=t+q->needtime; //t为当前时间。用于筛选进程 下一个进程的当前时间。

        }

        else

        {

            t=10000;///

            p=head;

         for(i=0;i            {            

             if(p->tijiaotimestate=='F')

                {

                 t=p->tijiaotime;//记录范围内。最早完成时间。

                }

             p=p->next;

            }

        }

    }

    avgroundtime=sumroundtime/n;

    avgweightroundtime=sumweightroundtime/n;

///////////////////////////////////////////////////////

void getInfo()          //创建进程

{

    int num;

    printf("\\n请输入进程个数:");

    scanf("%d",&n);

    

    printf("\\n依次输入%d个进程:\\n",n);

    dayin();

    printf("进程名 到达时间 运行时间\\n");

    

for(num=0;num    {

        p=(pcb *)malloc(sizeof(pcb));

        if(head==NULL) {head=p;q=p;}

        dayin();

     scanf("%s\%d\%d",&p->num,&p->tijiaotime,&p->needtime);

     if(p->tijiaotime < time) time=p->tijiaotime; //记录最早时间。

     q->next=p;

     p->starttime=0;

     p->finishtime=0;

     p->roundtime=0;

     p->weightroundtime=0;

     p->next=NULL;

     p->state='W';

        q=p;

    }

}

void display()

{

    printf("\\n\\n进程名\\");

    p=head;

    while(p!=NULL)

    {

     printf("%s\",p->num);

        

     p=p->next;

    }

    printf("平均");

    printf("\\n到达时间\");

    p=head;

    while(p!=NULL)

    {

     printf("%d\",p->tijiaotime);

        

     p=p->next;

    }

    printf("\\n运行时间\");

    p=head;

    while(p!=NULL)

    {

     printf("%d\",p->needtime);

        

     p=p->next;

    }

    printf("\\n开始运行时间\");

    p=head;

    while(p!=NULL)

    {

     printf("%d\",p->starttime);

        

     p=p->next;

    }

    p=head;

    printf("\\n完成时间\");

    while(p!=NULL)

    {

     printf("%d\",p->finishtime);

        

     p=p->next;

    }

    p=head;

    printf("\\n周转时间\");

    while(p!=NULL)

    {

     printf("%0.1f\",p->roundtime);

        

     p=p->next;

    }

    printf("%0.1f\\n",avgroundtime);

    p=head;

    printf("带权周转时间\");

    while(p!=NULL)

    {

    // printf("%0.1f\",p->roundtime);

     printf("%0.1f\",p->weightroundtime);

     p=p->next;

    }

    printf("%0.1f\\n",avgweightroundtime);

    dayin();

    printf("平均周转时间为%0.1f\\n",avgroundtime);

    printf("平均带权周转时间为%0.1f\\n",avgweightroundtime);

    dayin();

}

void dayin()

{

    printf("---------------------------------------------------------------------------\\n");

}

void main()    //mian函数

{

    dayin();

    printf("\\先来先服务优先调度算法和短进程优先调度模拟实现\\n\\n");

    dayin();

    getInfo();

    printf(" \\先来先服务进程优先调度模拟\\n");

    fcfs();

    dayin();

    //将总时间置为零

sumroundtime=0,sumweightroundtime=0;

    display();

    printf(" \\短进程优先调度模拟\\n");

    spf();

    display();

}

实验要求:

1、运行程序并分析结果。

2、理解实验源程序,增加其他调度算法实现,改进实验源程序。下载本文

显示全文
专题