操作系统进程调度模拟算法附源码.docx

上传人:b****5 文档编号:6376086 上传时间:2023-01-05 格式:DOCX 页数:15 大小:141.02KB
下载 相关 举报
操作系统进程调度模拟算法附源码.docx_第1页
第1页 / 共15页
操作系统进程调度模拟算法附源码.docx_第2页
第2页 / 共15页
操作系统进程调度模拟算法附源码.docx_第3页
第3页 / 共15页
操作系统进程调度模拟算法附源码.docx_第4页
第4页 / 共15页
操作系统进程调度模拟算法附源码.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

操作系统进程调度模拟算法附源码.docx

《操作系统进程调度模拟算法附源码.docx》由会员分享,可在线阅读,更多相关《操作系统进程调度模拟算法附源码.docx(15页珍藏版)》请在冰豆网上搜索。

操作系统进程调度模拟算法附源码.docx

操作系统进程调度模拟算法附源码

进程调度模拟算法

课程名称:

计算机操作系统班级:

信1501-2

实验者姓名:

李琛实验日期:

2018年5月1日

评分:

教师签名:

一、实验目的

进程调度是处理机管理的核心内容。

本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具体实施办法。

二、实验要求

1.设计进程控制块PCB的结构,通常应包括如下信息:

进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、当前队列指针等。

2.编写两种调度算法程序:

优先数调度算法程序

循环轮转调度算法程序

3.按要求输出结果。

三、实验过程

分别用两种调度算法对伍个进程进行调度。

每个进程可有三种状态;执行状态(RUN)、

就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。

(一)进程控制块结构如下:

NAME——进程标示符

PRIO/ROUND——进程优先数/进程每次轮转的时间片数(设为常数2)

CPUTIME——进程累计占用CPU的时间片数

NEEDTIME——进程到完成还需要的时间片数

STATE——进程状态

NEXT——链指针

注:

1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;

2.各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时给定。

(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:

RUN——当前运行进程指针

READY——就需队列头指针

TAIL——就需队列尾指针

FINISH——完成队列头指针

(三)程序说明

1.在优先数算法中,进程优先数的初值设为:

50-NEEDTIME

每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。

在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪队列尾,等待下一次调度。

2.程序的模块结构如下:

整个程序可由主程序和如下7个过程组成:

2

(1)INSERT1——在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;

(2)INSERT2——在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程

的PCB,插到就绪队列的队尾;

(3)FIRSTIN——调度就绪队列的第一个进程投入运行;

(4)PRINT——显示每执行一次后所有进程的状态及有关信息。

(5)CREATE——创建新进程,并将它的PCB插入就绪队列;

(6)PRISCH——按优先数算法调度进程;

(7)ROUNDSCH——按时间片轮转法调度进程。

主程序定义PCB结构和其他有关变量。

实验代码:

Main.cpp

#include

#include

usingnamespacestd;

typedefstructnode

{

charname[20];//进程名

intprio;//进程优先级

intround;//分配CPU的时间片

intcputime;//CPU执行时间

intneedtime;//进程执行所需时间

charstate;//进程状态

intcount;//记录执行次数

structnode*next;//链表指针

}PCB;

intnum;

//定义三个队列,就绪队列,执行队列,完成队列

PCB*ready=NULL;//就绪队列

PCB*run=NULL;//执行队列

PCB*finish=NULL;//完成队列

//取得第一个就绪节点

voidGetFirst()

{

run=ready;

if(ready!

=NULL)

{

run->state='R';

ready=ready->next;

run->next=NULL;

}

}

//优先级输出队列

voidOutput1()

{

PCB*p;

p=ready;

while(p!

=NULL)

{

cout<name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"<state<<"\t"<count<

p=p->next;

}

p=finish;

while(p!

=NULL)

{

cout<name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"<state<<"\t"<count<

p=p->next;

}

p=run;

while(p!

=NULL)

{

cout<name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"<state<<"\t"<count<

p=p->next;

}

}

//轮转法输出队列

voidOutput2()

{

PCB*p;

p=ready;

while(p!

=NULL)

{

cout<name<<"\t"<round<<"\t"<cputime<<"\t"<needtime<<"\t"<state<<"\t"<count<

p=p->next;

}

p=finish;

while(p!

=NULL)

{

cout<name<<"\t"<round<<"\t"<cputime<<"\t"<needtime<<"\t"<state<<"\t"<count<

p=p->next;

}

p=run;

while(p!

=NULL)

{

cout<name<<"\t"<round<<"\t"<cputime<<"\t"<needtime<<"\t"<state<<"\t"<count<

p=p->next;

}

}

//创建优先级队列

//创建优先级队列,规定优先数越小,优先级越低

voidInsertPrio(PCB*in)

{

PCB*fst,*nxt;

fst=nxt=ready;

if(ready==NULL)//如果队列为空,则为第一个元素

{

in->next=ready;

ready=in;

}

else//查到合适的位置进行插入

{

if(in->prio>=fst->prio)//比第一个还要大,则插入到队头

{

in->next=ready;

ready=in;

}

else

{

while(fst->next!

=NULL)//移动指针查找第一个比它小的元素的位置进行插入

{

nxt=fst;

fst=fst->next;

}

if(fst->next==NULL)//已经搜索到队尾,则其优先级数最小,将其插入到队尾即可

{

in->next=fst->next;

fst->next=in;

}

else//插入到队列中

{

nxt=in;

in->next=fst;

}

}

}

}

//将进程插入到就绪队列尾部

voidInsertTime(PCB*in)

{

PCB*fst;

fst=ready;

if(ready==NULL)

{

in->next=ready;

ready=in;

}

else

{

while(fst->next!

=NULL)

{

fst=fst->next;

}

in->next=fst->next;

fst->next=in;

}

}

//将进程插入到完成队列尾部

voidInsertFinish(PCB*in)

{

PCB*fst;

fst=finish;

if(finish==NULL)

{

in->next=finish;

finish=in;

}

else

{

while(fst->next!

=NULL)

{

fst=fst->next;

}

in->next=fst->next;

fst->next=in;

}

}

//优先级调度输入函数

voidPrioCreate()

{

PCB*tmp;

inti;

cout<<"Enterthenameandneedtime:

"<

for(i=0;i

{

if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL)

{

cerr<<"malloc"<

exit

(1);

}

cin>>tmp->name;

getchar();

cin>>tmp->needtime;

tmp->cputime=0;

tmp->state='W';

tmp->prio=50-tmp->needtime;//设置其优先级,需要的时间越多,优先级越低

tmp->round=0;

tmp->count=0;

InsertPrio(tmp);//按照优先级从高到低,插入到就绪队列

}

cout<<"进程名\t优先级\tcpu时间\t需要时间进程状态计数器"<

}

//时间片输入函数

voidTimeCreate()

{

PCB*tmp;

inti;

cout<<"输入进程名字和进程时间片所需时间:

"<

for(i=0;i

{

if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL)

{

cerr<<"malloc"<

exit

(1);

}

cin>>tmp->name;

getchar();

cin>>tmp->needtime;

tmp->cputime=0;

tmp->state='W';

tmp->prio=0;

tmp->round=2;

tmp->count=0;

InsertTime(tmp);

}

cout<<"进程名\t轮数\tCPU时间\t需要时间进程状态计数器"<

}

//按照优先级调度,每次执行一个时间片

voidPriority()

{

intflag=1;

GetFirst();

while(run!

=NULL)

{

Output1();

while(flag)

{

run->prio-=3;//优先级减去三

run->cputime++;//CPU时间片加一

run->needtime--;//进程执行完成的剩余时间减一

if(run->needtime==0)//如果进程执行完毕,将进程状态置为F,将其插入到完成队列

{

run->state='F';

run->count++;

InsertFinish(run);

flag=0;

}

else//将进程状态置为W,入就绪队列

{

run->state='W';

run->count++;//进程执行的次数加一

InsertTime(run);

flag=0;

}

}

flag=1;

GetFirst();//继续取就绪队列队头进程进入执行队列

}

}

voidRoundRun()//时间片轮转调度算法

{

intflag=1;

GetFirst();

while(run!

=NULL)

{

Output2();

while(flag)

{

run->count++;

run->cputime++;

run->needtime--;

if(run->needtime==0)//进程执行完毕

{

run->state='F';

InsertFinish(run);

flag=0;

}

elseif(run->count==run->round)//时间片用完

{

run->state='W';

run->count=0;//计数器清零,为下次做准备

InsertTime(run);

flag=0;

}

}

flag=1;

GetFirst();

}

}

intmain(void)

{

intn;

cout<<"输入进程个数:

"<

cin>>num;

getchar();

cout<<"-----------------进程调度算法模拟----------------------"<

cout<<"1、优先级调度算法"<

cout<<"2、循环轮转调度算法"<

cout<<"-------------------------------------------------------"<

cout<<"输入选择序号:

"<

cin>>n;

switch(n)

{

case1:

cout<<"优先级调度:

"<

PrioCreate();

Priority();

Output1();

break;

case2:

cout<<"循环轮转算法:

"<

TimeCreate();

RoundRun();

Output2();

break;

case0:

exit

(1);

break;

default:

cout<<"Entererror!

"<

break;

}

cout<

return0;

}

四、实验结果

优先级调度

时间片轮转法

五、实验总结

通过本次实验,我学到了进程调度算法,了解了进程调度是CPU管理的核心,不同的调度算法会使得进程运行时间不同,运行的先后顺序也不同,这就会有一个算法选择的问题.掌握了用C语言实现进程调度算法的模拟,提高了编程能力,以及对进程调度算法的理解。

在思考上出现的一个问题是,队列是先进先出的,在优先级算法中怎么来向链表中插入新的进程,使其能够按优先级排序.第一想到的是用数组,后来发现不如链表方便,所以换成链表,但是发现自己用链表有待提高.

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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