您的当前位置:首页正文

实验六 进程调度算法模拟实现

来源:个人技术集锦


实验六 进程调度算法模拟

一、 实验类型

本实验为设计性实验。

二、 实验目的与任务

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

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

三、 预习要求

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

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

四、 实验基本原理

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

言。

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

参考代码如下:

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

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

实验设备:计算机一台;

六、 实验内容

[参考代码如下]

#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->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\

printf(\"\\n依次输入%d个进程:\\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\

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=p->next;

}

printf(\"平均\");

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

p=head;

while(p!=NULL)

{

printf(\"%d\\

p=p->next;

}

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

p=head;

while(p!=NULL)

{

printf(\"%d\\

p=p->next;

}

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

p=head;

while(p!=NULL)

{

printf(\"%d\\

p=p->next;

}

p=head;

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

while(p!=NULL)

{

printf(\"%d\\

p=p->next;

}

p=head;

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

while(p!=NULL)

{

printf(\"%0.1f\\

p=p->next;

}

printf(\"%0.1f\\n\

p=head;

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

while(p!=NULL)

{

// printf(\"%0.1f\\

printf(\"%0.1f\\

p=p->next;

}

printf(\"%0.1f\\n\

dayin();

printf(\"平均周转时间为%0.1f\\n\

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

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、理解实验源程序,增加其他调度算法实现,改进实验源程序。

因篇幅问题不能全部显示,请点此查看更多更全内容