操作系统 进程调度模拟算法 附源码Word文档格式.docx

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

操作系统 进程调度模拟算法 附源码Word文档格式.docx

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

操作系统 进程调度模拟算法 附源码Word文档格式.docx

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<

iostream>

string>

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;

next=NULL;

}

}

//优先级输出队列

voidOutput1()

PCB*p;

p=ready;

while(p!

cout<

<

p->

name<

"

\t"

<

prio<

cputime<

needtime<

\t"

state<

\t"

count<

endl;

p=p->

p=finish;

p=run;

//轮转法输出队列

voidOutput2()

round<

//创建优先级队列

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

voidInsertPrio(PCB*in)

PCB*fst,*nxt;

fst=nxt=ready;

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

in->

next=ready;

ready=in;

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

if(in->

prio>

=fst->

prio)//比第一个还要大,则插入到队头

{

in->

ready=in;

}

else

while(fst->

next!

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

{

nxt=fst;

fst=fst->

}

if(fst->

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

in->

next=fst->

fst->

next=in;

else//插入到队列中

nxt=in;

next=fst;

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

voidInsertTime(PCB*in)

PCB*fst;

fst=ready;

if(ready==NULL)

else

while(fst->

fst=fst->

fst->

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

voidInsertFinish(PCB*in)

fst=finish;

if(finish==NULL)

next=finish;

finish=in;

//优先级调度输入函数

voidPrioCreate()

PCB*tmp;

inti;

cout<

Enterthenameandneedtime:

"

for(i=0;

i<

num;

i++)

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

cerr<

malloc"

exit

(1);

cin>

>

tmp->

name;

getchar();

needtime;

tmp->

cputime=0;

W'

prio=50-tmp->

//设置其优先级,需要的时间越多,优先级越低

round=0;

count=0;

InsertPrio(tmp);

//按照优先级从高到低,插入到就绪队列

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

//时间片输入函数

voidTimeCreate()

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

prio=0;

round=2;

InsertTime(tmp);

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

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

voidPriority()

intflag=1;

GetFirst();

while(run!

Output1();

while(flag)

run->

prio-=3;

//优先级减去三

cputime++;

//CPU时间片加一

needtime--;

//进程执行完成的剩余时间减一

if(run->

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

run->

F'

count++;

InsertFinish(run);

flag=0;

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

//进程执行的次数加一

InsertTime(run);

flag=1;

GetFirst();

//继续取就绪队列队头进程进入执行队列

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

Output2();

needtime==0)//进程执行完毕

elseif(run->

count==run->

round)//时间片用完

//计数器清零,为下次做准备

intmain(void)

intn;

输入进程个数:

cin>

getchar();

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

1、优先级调度算法"

2、循环轮转调度算法"

-------------------------------------------------------"

输入选择序号:

n;

switch(n)

case1:

优先级调度:

PrioCreate();

Priority();

break;

case2:

循环轮转算法:

TimeCreate();

RoundRun();

case0:

exit

(1);

default:

Entererror!

return0;

四、实验结果

优先级调度

时间片轮转法

五、实验总结

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

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

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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