进程调度算法实验报告Word文档格式.docx

上传人:b****6 文档编号:20873405 上传时间:2023-01-26 格式:DOCX 页数:18 大小:101.94KB
下载 相关 举报
进程调度算法实验报告Word文档格式.docx_第1页
第1页 / 共18页
进程调度算法实验报告Word文档格式.docx_第2页
第2页 / 共18页
进程调度算法实验报告Word文档格式.docx_第3页
第3页 / 共18页
进程调度算法实验报告Word文档格式.docx_第4页
第4页 / 共18页
进程调度算法实验报告Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

进程调度算法实验报告Word文档格式.docx

《进程调度算法实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

进程调度算法实验报告Word文档格式.docx

amount;

for(i=0;

i<

i++)

cout<

请输入进程名,进程到达时间,进程运行时间:

cin>

f[i].id;

f[i].atime;

f[i].runtime;

}

i++) 

//按进程到达时间的先后排序

//如果两个进程同时到达,按在屏幕先输入的先运行

for(j=0;

j<

amount-i-1;

j++)

if(f[j].atime>

f[j+1].atime)

{diao=f[j].atime;

 

f[j].atime=f[j+1].atime;

f[j+1].atime=diao;

huan=f[j].id;

f[j].id=f[j+1].id;

f[j+1].id=huan;

}

进程:

f[i].id<

从"

f[i].atime<

开始"

"

在"

<

f[i].atime+f[i].runtime<

之前结束。

f[i+1].atime=f[i].atime+f[i].runtime;

2.短进程优先算法

#include<

stdio.h>

#definen5

#definenum5

#definemax65535

typedefstructpro

{intPRO_ID;

intarrive_time;

intsum_time;

intflag;

}Pro;

//整数排序

intbubble(inttemp[])

{

inti,j,tem=0;

for(i=1;

num;

{intlastX=1;

for(j=0;

num-i;

{if(temp[j]>

temp[j+1])

{tem=temp[j];

temp[j]=temp[j+1];

temp[j+1]=tem;

lastX=0;

}

}

if(lastX==1)break;

}

returntemp[0];

}

//进程排序

Probubble(Prop[])

inti,j;

Protemp={0};

Pros[num];

for(i=0;

{s[i]=p[i];

{

intlastX=1;

{

if(s[j].sum_time>

s[j+1].sum_time)

{

temp=s[j];

s[j]=s[j+1];

s[j+1]=temp;

returns[0];

voidSPF(intp)

if(n>

0)

inti,j,k,l,tc=0;

Proseq[n];

Protemp_seq[n];

printf("

短进程优先调度算法SPF\n"

);

请依次输入5个进程的进程号、到达时间和执行时间\n"

成员变量用逗号隔开;

进程间用回车隔开\n"

for(i=0;

n;

i++){

scanf("

%d,%d,%d"

&

seq[i].PRO_ID,&

seq[i].arrive_time,&

seq[i].sum_time);

调度顺序是:

\n"

//初始化tc

inttemp[num];

temp[i]=seq[i].arrive_time;

tc=bubble(temp);

//tc是断点啊

//flag表示对应i的pro的队列情况

//-1表示未进入过队列,0表示在队列中,1表示被清除了

seq[i].flag=-1;

i++){

j++){

if(seq[j].flag!

=1&

&

seq[j].arrive_time<

=tc){

seq[j].flag=0;

for(j=0;

temp_seq[j]=seq[j];

=0){

temp_seq[j].sum_time=max;

l=bubble(temp_seq).PRO_ID;

if(l==seq[j].PRO_ID){

k=j;

tc=tc+bubble(temp_seq).sum_time;

seq[k].flag=1;

%d"

l);

SPF(n);

3.时间片轮转调度算法

头文件RR.h

iostream>

string.h>

stdlib.h>

ctype.h>

#defineMaxNum100

typedefstructpcb//定义进程控制块

charName[MaxNum];

intarrivetime;

//到达时间

intruntime;

//运行时间

intwholetime;

//固定运行时间

intFinishTime;

//完成时间

doubleWeightTime;

//周转时间

doubleWeightWholeTime;

//带权周转时间

charstate;

//运行后的状态

structpcb*next;

}PCB;

//全局变量

intN;

//实际进程数

doubleSumWT;

//周转时间之和

doubleSumWWT;

//带权周转时间之和

doubleAverageWT;

//平均周转时间

doubleAverageWWT;

//平均带权周转时间

typedefstruct//定义队列,封装头结点,指针分别指向队头和队尾

PCB*front,*rear;

}queue;

queue*init()//进程队列置空

queue*head;

head=(queue*)malloc(sizeof(queue));

head->

front=NULL;

rear=NULL;

returnhead;

intempty(queue*head)//检验队列是否为空

return(head->

front?

0:

1);

queue*append(queue*head,charc[MaxNum],inta,intr,chars)//进程队列入队,往后插入

PCB*p;

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

strcpy(p->

Name,c);

p->

arrivetime=a;

runtime=r;

wholetime=r;

state=s;

//p->

FinishTime=0;

WeightTime=0;

WeightWholeTime=0;

next=NULL;

if(empty(head))

head->

front=head->

rear=p;

else

rear->

next=p;

queue*creat(queue*head)//创建进程队列

charc[MaxNum];

chars='

R'

;

inta,r,i;

printf("

请输入共有几个进程:

scanf("

N);

for(i=1;

=N;

请输入第%d个进程的进程名:

i);

getchar();

gets(c);

请输入第%d个进程的到达时间:

a);

请输入第%d个进程的服务时间:

r);

head=append(head,c,a,r,s);

voidprint(queue*head)//输入创建的进程队列

p=head->

front;

if(!

p)

时间片轮转调度队列为空!

while(p)

Name=%sarrivetime=%druntime=%dstate=%c"

p->

Name,p->

arrivetime,p->

runtime,p->

state);

p=p->

next;

/*******************时间片轮转法调度算法的实现**************************/

voidRR(queue*head,intq)

intt=head->

front->

arrivetime,lt=head->

arrivetime;

if(head->

runtime<

q)

t=t+head->

runtime;

t=t+q;

/****进程队列为不空才可调度*****/

while(!

empty(head))

PCB*p1,*p2;

\n时刻进程运行后的状态\n"

/*第一种情况:

当前运行的时间小于最后一个进程到达时间做一下操作*/

while(t<

lt)

p1=head->

printf("

%2d%s"

t,p1->

Name);

p1->

runtime=p1->

runtime-q;

//1.运行时间小于0,删除队首

if(p1->

=0)

p1->

state='

C'

printf("

%c\n"

p1->

FinishTime=t;

WeightTime=p1->

FinishTime-p1->

WeightWholeTime=p1->

WeightTime/p1->

wholetime;

SumWT+=p1->

WeightTime;

SumWWT+=p1->

WeightWholeTime;

时刻%2d进程%s运行结束,进程%s周转时间=%5.2f,带权周转时间=%5.2f\n"

Name,p1->

WeightTime,p1->

WeightWholeTime);

head->

front=p1->

free(p1);

//2.运行时间大于0,向后找位置插入

else

p2=p1->

while(p2->

next&

p2->

arrivetime!

=t)

p2=p2->

//此时无新进入队列的进程,有两种情况:

1.不用找位置往后插入,队首不变,不做操作

//2.找位置往后插入

if(p2->

PCB*p3=p1,*p4;

while(p3->

p3->

arrivetime<

t)

{

p4=p3;

p3=p3->

}

if(p3->

arrivetime>

if(p4!

=p1)//p1插在p4后,头为p1->

next

{

head->

p1->

next=p4->

p4->

next=p1;

}

else//不做操作

p4=p3=p2=NULL;

else

p4=p3=p2=NULL;

//此时有新进入队列的进程时:

p1插在新进入队列的进程p2后,队首为p1->

else

head->

p1->

next=p2->

p2->

//时刻变化

if(head->

t=t+head->

t=t+q;

/*************第一种情况结束**************/

/******************第二种情况:

当期运行的时间大于最后一个进程到达的时间做以下操作*********************/

while(t>

=lt)

p1->

//printf("

时刻%2d进程%s运行结束"

pname);

//2.运行时间大于0,直接插在队尾

//若原队列只有一个进程,不必往队尾插

if(!

p1->

next)

front=p1;

//若原队列有多个进程

rear=p1;

//时刻变化,队列为空时不做时刻变化

if(empty(head))

return;

if(head->

t=t+head->

t=t+q;

/*******第二种情况结束*********/

主程序Main.cpp

#include"

RR.h"

intq;

head=init();

head=creat(head);

\n您输入的时间片轮转进程队列为:

print(head);

\n请输入时间片轮转调度的时间片为:

q);

//时间片轮转调度

RR(head,q);

AverageWT=SumWT/N;

AverageWWT=SumWWT/N;

平均周转时间=%5.2f,平均带权周转时间=%5.2f"

AverageWT,AverageWWT);

运行结果:

先来先服务:

短进程:

时间片轮:

心得体会:

这次的实验与上次的实验相比,在很多方面都有更多的难度,所以我们参考了别人很多的程序然后稍作了修改。

但是由于自身知识不够,所以没能将三个算法都弄到一个大程序中,只能通过三个程序来实现,这一点是我们的不足。

虽然如此,我们还是有了一定的收获,比如更加深刻了解到了先来先服务、短进程、时间片轮这三种作业的原理,而且这一过程中我们觉得时间片轮调度算法更具优势。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1