进程调度算法的仿真实现要点.docx

上传人:b****9 文档编号:25172171 上传时间:2023-06-05 格式:DOCX 页数:23 大小:307.85KB
下载 相关 举报
进程调度算法的仿真实现要点.docx_第1页
第1页 / 共23页
进程调度算法的仿真实现要点.docx_第2页
第2页 / 共23页
进程调度算法的仿真实现要点.docx_第3页
第3页 / 共23页
进程调度算法的仿真实现要点.docx_第4页
第4页 / 共23页
进程调度算法的仿真实现要点.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

进程调度算法的仿真实现要点.docx

《进程调度算法的仿真实现要点.docx》由会员分享,可在线阅读,更多相关《进程调度算法的仿真实现要点.docx(23页珍藏版)》请在冰豆网上搜索。

进程调度算法的仿真实现要点.docx

进程调度算法的仿真实现要点

《计算机操作系统原理》课外上机

实验报告

题目:

实验名称:

进程调度算法的仿真实现

组长主要任务:

1.总体数据结构设计;

2.进程调度算法过程构架分析;

3.优先级算法静态优先级抢占算法;

4.动态优先级算法编写;

5.算法测试分析;

6.使用手册撰写。

组员主要任务:

1.总体数据结构设计;

2.进程调度算法过程构架分析;

3.进程创建算法编写;

4.时间片轮转法算法编写

5.用户界面编写;

6.实验报告撰写。

一、实验目的

1.仿真进程并发的调度环境,设计和实现PCB控制块、进程创建、进程切换、进程并发、进程阻塞和进程调度的算法

2.掌握进程调度的优先权法、时间片轮转法和多级反馈队列算法的实现

3.强化算法设计和数据结构。

二、核心设计思路及实现内容

1.利用随机数产生进程,创建PCB类的数组对象;

2.建立等待序列将创建好的PCB数组放入等待序列;

3.当进程的进入时间小于等于模拟的系统时间时,将该进程从等待序列进入就绪队列,并将就绪队列内的进程按随机生成的优先级进行排序;

4.静态优先级算法:

优先级高的进程优先的进入;

5.动态优先级算法:

与静态优先级算法相类似,增加一个优先级减少的算法,优先级高的进程优先的进入;

6.时间片算法:

根据随机的优先级,确定时间片执行进程,就绪队列队头进入到运行态,在时间片内不能完成的进入就绪队列,时间片未完成的插入到就绪队列队尾,时间片完成的从运行队列中删除。

三、数据结构及操作函数设计

1.总体数据结构:

classPCB()

{

publicPCB(){}//构造函数

publicPCB(ID){}//重载构造函数

publicPCB(ID,Priority,in,Alltime,State){}//重载构造函数

}

publicpartialclass进程调度

{

//队列初始化

public进程调度仿真();//用户界面

privatevoidbutton_Click();//按钮动作函数

privatevoidAddListViewItem();//输出显示窗口

privatevoidstaticPriority();//静态优先级函数

privatevoidActivePriority();//动态优先级函数

privatevoidTimePiece();//时间片轮转调度算法函数

}

2.模块

①PCB类:

进程控制模块的类,类中包含进程名(ID),优先级(priority),进入时间(In),总时间(Alltime),状态(State),剩余时间(Lefttime)六个属性。

类中同时包含构造函数用来进行进程控制模块PCB的初始化

classPCB()

{

publicPCB(){}//构造函数

publicPCB(ID){}//重载构造函数

publicPCB(ID,Priority,in,Alltime,State){}//重载构造函数

}

②队列对象创建:

以链表为主要数据结构创建等待队列(WaitList),就绪队列(ReadyList),运行队列(RunList),处于运行态的队列(RunningList)

ArrayListWaitList=newArrayList();

ArrayListReadyList=newArrayList();

ArrayListRunList=newArrayList();

PCBRunningList=newPCB();

③界面设置:

对显示窗口(LIstView),操作按钮(Button)进行初始化设置、操作动作函数设置

public进程调度仿真();//用户界面

privatevoidbutton_Click();//按钮动作函数

privatevoidAddListViewItem();//输出显示窗口

④进程初始化:

通过规定随机数范围随机产生进程,同时初始化进程名、优先级等六个属性,并将进程保存到进程数组

privatevoidinitialize();

⑤核心函数:

进程调度的三种方法所写的函数,静态优先级立即抢占算法(staticPriority()),动态优先级算法(ActivePriority()),时间片轮转调度算法(TimePiece())

privatevoidstaticPriority();//静态优先级函数

privatevoidActivePriority();//动态优先级函数

privatevoidTimePiece();//时间片轮转调度算法函数

⑥主控函数:

用来启动界面显示以及整个程序

staticvoidMain()

{

Application.Run(new进程调度仿真());

}

3.核心函数

①静态优先级立即抢占算法

设计思想:

静态优先级算法,优先级高的进程优先的进入

程序流程:

 

伪码:

privatevoidStaticPriority()

{

ListClear();//清空队列

Waitlist.add(pcb[n]);//将pcb放入等待队列

if(state=0&waitlist.in<=systime)

{

Readylist.add(Waitlist[n]);

state=1;//标志

}//当进入时间小于等于系统时间时将pcb放入就绪队列

if(Readylist.count>1)

{

由高到低进行排序;//当就绪队列中的进程数大于一个时对这些进程进行冒泡法//排序

}

if(Runninglist==0&Readylist==0)

{

print(“CPU空闲”);

}//当就绪队列中没有PCB,CPU中也没有正在运行的PCB时,判断CPU空闲

if(Runninglist==0&Readylist!

=0)

{

RunningList=(PCB)ReadyList[0];//将就绪队列中的0号PCB移入运行

ReadyList.RemoveAt(0);//将就绪队列中的0号元素删除

}//当就绪队列中有PCB,CPU中没有正在运行的PCB时,将PCB放入就绪队列

if(RunningList!

=0&ReadyList==0)

{

if(Passtime

Passtime=Passtime+1;//通过时间加1

if(Passtime==Alltime)

{

SetRunningList();//清空运行队列

}

}//当就绪队列中没有PCB,CPU中有正在运行的PCB时

if(ReadyList.Count!

=0&&RunningList.Id!

=0)

{//当cpu中正在运行的进程优先级数大于等于就绪队列中优先级数最高的进程优先级数时

if(RunningList.Priority>=(ReadyList.Priority)

{

Passtime=Passtime+1;//当cpu中的进程已经运行完毕

if(Passtime==Alltime)

{

SetRunningList();//清空运行队列

}

}

else

{

print("未完成");

RunningList=ReadyList[0];

Passtime=Passtime+1;

if(Passtime==Alltime)

{//当cpu中的进程已经运行完毕

RunningList=ReadyList[0];

ReadyList.RemoveAt(0);

}

}

}

}

文字描述:

1.进程从进程数组到等待队列;

2.启动系统时间,并与随机进程的进入时间比较,进入时间小于等于系统时间就进入就绪队列,最终使符合要求的所有进程进入就绪队列,并在就绪队列中按优先级排序;

3.当等待和就绪队列都空时,CPU出于空闲状态;当就绪队列中有PCB,CPU中无进程时,将就绪队列中的队头元素移入运行队列;当就绪队列中无PCB,CPU中有进程运行时,判断总时间和运行时间的关系;当就绪队列中有PCB,CPU中正在运行进程时,判断运行队列与就绪队列中进程优先级的关系,运行队列中进程优先级大时,判断运行队列中进程总时间和运行时间的关系,否则就绪队列中的进程完成抢占。

②动态优先级算法

设计思想:

动态优先级算法:

与静态优先级算法相类似,增加一个优先级减少的算法,优先级高的进程优先的进入

程序流程:

伪码:

privatevoidStaticPriority()

{

ListClear();//清空队列

Waitlist.add(pcb[n]);//将pcb放入等待队列

if(state=0&waitlist.in<=systime)

{

Readylist.add(Waitlist[n]);

state=1;//标志

}//当进入时间小于等于系统时间时将pcb放入就绪队列

if(Readylist.count>1)

{

由高到低进行排序;//当就绪队列中的进程数大于一个时对这些进程进行冒泡法//排序

}

if(Runninglist==0&Readylist==0)

{

print(“CPU空闲”);

}//当就绪队列中没有PCB,CPU中也没有正在运行的PCB时,判断CPU空闲

if(Runninglist==0&Readylist!

=0)

{

RunningList=(PCB)ReadyList[0];//将就绪队列中的0号PCB移入运行

ReadyList.RemoveAt(0);//将就绪队列中的0号元素删除

}//当就绪队列中有PCB,CPU中没有正在运行的PCB时,将PCB放入就绪队列

if(RunningList!

=0&ReadyList==0)

{

if(Passtime

Passtime=Passtime+1;//通过时间加1

if(Passtime==Alltime)

{

SetRunningList();//清空运行队列

}

}//当就绪队列中没有PCB,CPU中有正在运行的PCB时

if(ReadyList.Count!

=0&&RunningList.Id!

=0)

{//当cpu中正在运行的进程优先级数大于等于就绪队列中优先级数最高的进程优先级数时

if(RunningList.Priority>=(ReadyList.Priority)

{

Passtime=Passtime+1;//当cpu中的进程已经运行完毕

if(Passtime==Alltime)

{

SetRunningList();//清空运行队列

}

}

else

{

print("未完成");

Priority=Priority-1;//动态优先级算法优先级减1表示动态

//当优先级小于0时,将优先级重置成0

RunningList=ReadyList[0];

Passtime=Passtime+1;

if(Passtime==Alltime)

{//当cpu中的进程已经运行完毕

RunningList=ReadyList[0];

ReadyList.RemoveAt(0);//将就绪队列中的0号元素删除

}

}

}

}

文字描述:

1.进程从进程数组到等待队列;

文字描述:

2.启动系统时间,并与随机进程的进入时间比较,进入时间小于等于系统时间就进入就绪队列,最终使符合要求的所有进程进入就绪队列,并在就绪队列中按优先级排序;

文字描述:

3.当等待和就绪队列都空时,CPU出于空闲状态;当就绪队列中有PCB,CPU中无进程时,将就绪队列中的队头元素移入运行队列;当就绪队列中无PCB,CPU中有进程运行时,判断总时间和运行时间的关系;当就绪队列中有PCB,CPU中正在运行进程时,判断运行队列与就绪队列中进程优先级的关系,运行队列中进程优先级大时,判断运行队列中进程总时间和运行时间的关系,否则进程从运行队列中移除,并使进程优先级减1,使就绪队列中的进程完成抢占。

③时间片轮转调度算法

设计思想:

根据随机产生的优先级,确定时间片执行进程,就绪队列队头进入到运行态,在时间片内不能完成的进入就绪队列,时间片完成从运行队列中删除。

程序流程:

 

伪码:

privatevoidTimepiece(pcb)

{

List.clear();//清空所有的队列

Waitlist.add(pcb[n]);//将pcb放入等待队列

if(state=0&waitlist.in<=systime)

{

Readylist.add(Waitlist[n]);

state=1;//标志

}//当进入时间小于等于系统时间时将pcb放入就绪队列

if(Readylist.count>1)

{

由高到低进行排序;//当就绪队列中的进程数大于一个时对这些进程进行冒泡法//排序

}

if(Runninglist==0&Readylist==0)

{

print(“CPU空闲”);

}//当就绪队列中没有PCB,CPU中也没有正在运行的PCB时,判断CPU空闲

if(Runninglist==0&Readylist!

=0)

{

Runninglist[n]=Readylist[n];

}//当就绪队列中有PCB,CPU中没有正在运行的PCB时,将PCB放入就绪队列

if(Runninglist!

=0)

{//CPU中有正在运行的PCB时

Roundtime=In+priority*10;//时间片等于随机产生优先级的10倍

Lefttime=Alltime+In-systime;//剩余时间

if(Roundtime>systime)

{//时间片大于系统时间时进行剩余时间判断

if(lefttime>0)

{//剩余时间大于0,则未完成,优先级减1,重返就绪队列

print(“未完成”);

priority=priority-1;

Readylist=newpcb;

}

else//剩余时间小于等于0,完成

print(“完成”);

}

else

{//时间片小于等于系统时间时进行剩余时间判断

if(lefttime>0)

{//剩余时间大于0,则未完成,优先级减1,重返就绪队列

print(“未完成”);

priority=priority-1;

Readylist=newpcb;

}

else//剩余时间小于等于0,CPU空闲

print(“CPU空闲”);

}

}

}

文字描述:

1.利用随机数初始化进程对象数组,将其加入等待队列;

2.当等待队列中的进程的进入时间等于系统时间时代表进程进入也就是将进程加入就绪队列;

3.这时候进行判断,分四种情况讨论:

第一种:

当CPU中没有进程运行时也就是运行队列中没有进程,同时就绪队列里没有进程也就是就绪队列为空时判定CPU为空闲状态;

第二种:

当CPU中没有进程运行时也就是运行队列中没有进程,同时就绪队列里有进程也就是就绪队列不为空时判定CPU不处于空闲状态,这时将就绪队列队头,即首个元素(进程)进入运行队列,即运行此进程;

第三种:

当CPU中有进程运行时也就是运行队列中有进程,同时判断时间片是否完成即时间片减去系统时间是否小于0,小于等于0即完成否则为完成。

若时间片未完成则进行剩余时间的判断,若剩余时间小于等于0则进程完成,若剩余时间大于0则将进程的优先级减一重新放回到就绪队列队尾,同时将运行队列进行初始化以便接下来的进程继续运行;

第四种:

当CPU中有进程运行时也就是运行队列中有进程,同时判断时间片是否完成即时间片减去系统时间是否小于0,小于等于0即完成否则为完成。

若时间片完成则进行剩余时间的判断,若剩余时间小于等于0则CPU处于空闲状态没有进程在运行;若剩余时间大于0则将进程的优先级减一重新放回到就绪队列队尾,同时将运行队列进行初始化以便接下来的进程继续运行。

四、测试运行及结果分析

1.随机产生进程模块:

①初始化随机生成10个进程进程名、优先级、进入时间、总时间等属性

②在Listview中显示

③并将随机产生的进程装入等待队列

2.静态优先级立即抢占算法:

①随机产生了3个进程,进程3最先进入,优先执行;

②在系统时间为4的时候进程1进入,进程1的优先级要高于进程3所以发生立即抢占,这是中断进程3,进程3进入就绪队列将优先级设置为最低,将进程1加入运行队列,开始执行;

③这时3个进程已经全部进入等待队列,没有优先级高于进程1的进程,所以一直执行进程1直至结束,计算周转时间;

④因为优先级不会改变就按照就绪队列中目前的优先级排序依次执行各个进程,直至运行队列以及就绪队列均为空,计算CPU利用率为95%,结束。

3.动态优先级算法:

①随机生成7个进程,进程7优先进入,进入时间为7,进程7需要运行的时间为42;

②进程6进入时间为8,优先级为4高于进程7,所以这时候进程7中断开始执行进程6,进程7被放回就绪队列尾,状态标记为未完成;

③在系统时间为12,15时,进程3,4,5相继进入但是由于优先级均小于进程6所以不予于执行;

④进程6运行10以后,进程2进入,进程2优先级要高于进程6,故进程6中断开始执行进程2,进程6被放回就绪队列尾,状态标记为未完成;

⑤此时所有进程都已经进入等待队列完毕,但是没有进程优先级高于进程2,故一直执行进程2直至结束,进程2标志为结束,计算进程2的周转时间为54;

⑥运行队列此时没有进程运行所以看就绪队列,其中在进行优先级减1过后进程6优先级为最高,故将进程6加入运行队列执行,标记状态未完成,计算周转时间;

⑦其余在就绪队列里的进程重复以上操作,不断地执行或是优先级减一在排序达到动态优先级算法的功能;

⑧最后当运行队列以及就绪队列中均没有进程的时候,程序结束,计算CPU的利用率为97%。

4.时间片轮转算法:

①为了便于描述只随机生成3个进程不然时间时间片算法界面显示过长不易解释,进程3优先进入,进入时间为2,进程3需要运行的时间为42;

②根据算法进程3优先级为2为其动态分配20个时间片,而进程3需要执行时间为42所以在时间片用尽后中断进入就绪队列,优先级减一,等待下一次执行;

③20各系统时间过后,此时三个进程已经全部进入,进程2的优先级最高,转而执行进程2,进程2优先级为5故分配50个时间片其需要运行的时间为49,在时间片内可以完成,故状态变为完成,计算周转时间;

④在这时CPU空闲,输出CPU空闲时间在Listview上;

⑤以此类推,此时进程1与进程3的优先级作比较,进程1的要高于进程3的优先级故执行进程1,进程1优先级为3分配30个时间片。

但是只需要12各系统时间便可完成,状态置为完成,计算周转时间;

⑥现在只剩下进程3所以执行,它的优先级现在只为1给10个时间片,又运行了十个系统时间中断,这使将它的优先级减一送回就绪队列;

⑦就绪队列中只剩下进程3这时候进程3的优先级为0无法给时间片,所以讲进程3的优先级重新赋值为1,接着进入运行队列,分配给10个时间片,接着运行,经过是个系统时间进程3运行完毕,状态置为完成,计算周转时间;

⑧最后当运行队列以及就绪队列中均没有进程的时候,程序结束,计算CPU的利用率为95%。

五、实验总结

六、备注

提交资料目录:

文件夹:

进程调度仿真.exe

子文件夹:

Doc:

1.实验报告.doc;

2.result.txt

3.使用手册.doc

Code1.源程序:

实验源程序进程调度

源程序文件清单:

1.Form1.cs:

界面函数,进程调度三个函数

2.Program.cs:

主控程序

3.PCB.cs:

PCB类

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

当前位置:首页 > 高等教育 > 军事

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

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