下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 进程调度模拟实验

进程调度模拟实验.doc

进程调度模拟实验

男孩只是留恋而已
2017-10-07 0人阅读 举报 0 0 暂无简介

简介:本文档为《进程调度模拟实验doc》,可适用于综合领域

进程调度模拟实验操作系统实验报告实验名称进程调度模拟实验实验时间年月日院系安徽大学计算机学院班级级计算机科技班学号E姓名魏征实验目的通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。实验原理在OS中调度的实质是一种资源分配调度算法是指:根据系统的资源分配策略所规定的资源分配算法。目前存在的多种调度算法中有的算法适用于作业调度有的算法适用于进程调度但也有些算法既可用于作业调度也可用于进程调度。本次实验是采用动态优先权算法实现进程的调度。动态优先权是指在创建进程时所赋予的优先权是可以随进程的推进或随其等待时间的增加而改变的以便获得更好的调度性能。例如我们可以规定在就绪队列中的进程随其等待时间的增长其优先权以速率a提高。若所有的进程都具有相同的优先权初值则显然是最先进入就绪队列的进程将因其动态优先权高而优先获得处理机此及FCFS算法。若所有的就绪进程具有各不相同的优先权初值那么对于优先权初值低的进程在等待了足够多的时间后其优先权便可能升为最高从而可以获得处理机。当采用抢占式优先权调度算法时如果再规定当前进程的优先权以速率b下降则可防止一个长作业长期地垄断处理机。本实验就是采用这种算法实现的。实验内容a)用C语言实现对N个进程采用动态优先权优先算法的进程调度b)每个PCB用结构来描述包括i进程标示数idii进程优先数priority值愈大优先权越高iii已经占用CPU时间cputimeiv还需占用CPU时间alltime进程运行完毕为v阻塞时间startblock表示再运行startblock个时间片后进入阻塞状态vi被阻塞时间blocktime表示被阻塞的进程再等blocktime个时间片后变为就绪状态vii进程状态stateviii队列指针nextc)优先数改变规则:i进程在就绪队列呆一个时间片ii进程运行一个时间片d)假设调度钱系统有个进程初始状态如下IDprioritycputimealltimestartblockblocktimestateReadyReadyReadyReadyReady要求给出每个时间片内的进程情况:Runningprog:iReadyqueue:>id>idBlockqueue:>id>id实验心得本次实验的代码部分并不长总共有行。整个程序在总体上实现了实验所要求的使用动态优先权算法调度进程加深了我对进程调度的理解为课程的后续部分的学习打下了良好的基础。关于具体来说程序实现方面并不复杂。在数据结构安排方面我将每个进程的Pcb控制块写在各自的结构体里然后根据存放各个进程信息的结构体中的数据来进行进程调度。程序中共有三个队列分别是Pcb队列就绪队列阻塞队列。因为每次执行的程序是选择就绪队列中动态优先权最高的一个所以要将就绪队列进行排序。我是在插入队列是进行的有序插入所以插入完成后就不需要单独的排序操作。主程序中最核心的部分就是执行进程方面这是一个大的循环结束条件是Pcb队列空这时所有的进程都已经完成调度结束。最后输出所有进程的状态。本次实验的过程也较为顺利并未花费过多的调试时间但是有一点要注意的是对于程序中的变量一定要记得初始化最好在定义时就进行初始化否则一旦忘记初始化变量被系统自动赋值为默认值。这就可能在程序后续的运行中出现一些意想不到的错误。比如这次实验中我有一个指针变量忘记赋值为空系统默认指向xcccccccc单元在后续程序中判断不为空但是并为指向一个实际的单元于是出错。为了改正这种错误可能会花费一些时间。所以我们应该养成良好的编程习惯。总之本次实验是我加深了对于进程调度的理解和认识了解了处理机如何进行工作。实验代码#include<windowsh>structPcb*next#include<stdioh>structPcb*rnext#include<malloch>structPcb*bnext#include<stdioh>}Pcb,*LinkPcb#include<processh>#include<iostream>typedefintStatus#include<iomanip>Status是函数的类型,其值是函数结果状态#include<string>代码如OK等usingnamespacestdtypedefintBoolean#defineTRUEStatusPcbInitList(LinkPcbL)#defineFALSE{操作结果:构造一个空的线性表L#defineOKL=(LinkPcb)malloc(sizeof(Pcb))#defineERROR产生头结点,并使L指向此头结点#defineOVERFLOWif(!L)存储分配失败#defineINFEASIBLEexit(OVERFLOW)L>next=指针域为空typedefstructPcb{returnOKcharid}intpriorityintcputimeStatusreadyInitList(LinkPcbL)intalltime{操作结果:构造一个空的就绪队列LintstartblockL=(LinkPcb)malloc(sizeof(Pcb))intblocktime产生头结点,并使L指向此头结点stringstateif(!L)存储分配失败exit(OVERFLOW)cout<<">"<<p>idL>rnext=指针域为空p=p>rnextreturnOK}}cout<<endlStatusblockInitList(LinkPcbL)returnOK{操作结果:构造一个空的阻塞队列L}L=(LinkPcb)malloc(sizeof(Pcb))产生头结点,并使L指向此头结点voidreadyadd(LinkPcbp)if(!L)存储分配失败{exit(OVERFLOW)在进程运行中对于就绪队列中元素的处L>bnext=指针域为空理程序returnOKp>priority}}StatusDestroyList(LinkPcbL){初始条件:线性表L已存在。voidrundec(LinkPcbp)操作结果:销毁线性表L{LinkPcbqp>priority=while(L)p>alltime{p>cputimeq=L>next}free(L)L=qLinkPcbselect(LinkPcbhead)}{returnOKLinkPcbp=head>rnext}returnp}StatusListEmpty(LinkPcbL){初始条件:线性表L已存在。StatusInsert(LinkPcbL,LinkPcbp)操作结果:若L为空表则返回TRUE{否则返回FALSELinkPcbp=L>next,pif(L>next)非空p=LreturnFALSEif(p==){elseL>next=preturnTRUEp>next=}returnOK}intListLength(LinkPcbL)while(pp>priority>{初始条件:线性表L已存在。p>priority){操作结果:返回L中数据元素个数p=pinti=p=p>nextLinkPcbp=L>rnextp指向第一个结点}while(p)没到表尾p>next=p{p>next=pireturnOKp=p>rnext}}returniStatusrInsert(LinkPcbL,LinkPcbp)}{就绪队列的插入函数在一个时间片结束后负责向就绪队列中插入处于就绪状态StatusListTraverse(LinkPcbL)但并在队列中的进程。{初始条件:线性表L已存在就绪队列中的进程按照优先级从大到小操作结果:依次输出L所指向的链表的元的顺序排列。素LinkPcbp=L>rnext,pLinkPcbp=L>rnextp=Lwhile(p)if(p==){{L>rnext=pp>rnext=PcbInitList(Pcbhead)returnOKreadyInitList(readyhead)}blockInitList(blockhead)while(pp>priority>for(i=i<i)p>priority){pi=tip=p初始化各个进程的状态p=p>rnextfor(i=i<i)}{p>rnext=ppi>cputime=p>rnext=ppi>state="Ready"returnOKpi>next=}pi>rnext=pi>bnext=StatusPcbDelete(LinkPcbL,LinkPcbp)}{p>id=''从Pcb队列中删除进程操作,L指向Pcbp>id=''队列的对首p指向待删除进程。p>id=''LinkPcbq=L>nextp>id=''LinkPcbq=Lp>id=''while(q!=p)p>priority={p>alltime=q=qp>startblock=q=q>nextp>blocktime=}p>priority=q>next=q>nextp>alltime=returnOKp>startblock=}p>blocktime=p>priority=StatusreadyDelete(LinkPcbL,LinkPcbp)p>alltime={p>startblock=从就绪队列中删除进程操作L指向就绪p>blocktime=队列的对首p指向待删除进程。p>priority=LinkPcbq=L>rnextp>alltime=LinkPcbq=Lp>startblock=while(q!=p)p>blocktime={p>priority=q=qp>alltime=q=q>rnextp>startblock=}p>blocktime=q>rnext=q>rnextfor(i=i<i)p>rnext={returnOKInsert(Pcbhead,pi)}if(pi>state=="Ready")rInsert(readyhead,pi)intmain()}{开始运行intcount=while(!ListEmpty(Pcbhead))intlen{stringtemptemp=select(readyhead)LinkPcbPcbheadreadyDelete(readyhead,temp)LinkPcbreadyheadif(temp)LinkPcbblockhead{LinkPcbtempSleep()LinkPcbtemprundec(temp)Pcbtlen=ListLength(readyhead)intitemp=select(readyhead)LinkPcbpfor(i=i<len){ListTraverse(readyhead)readyadd(temp)temp>state=temptemp=temp>rnextiif(temp>state=="Block")}blockhead>bnext=temp}if(blockhead>bnext)if(p>state=="Block"){cout<<"Blockqueue:>"<<blockhead>bnextp>blocktime>id<<endlif(p>blocktime==){elsecout<<"Blockqueue:"<<endlp>state="Ready"blockhead>bnext=if(temp>alltime==)rInsert(readyhead,p){}}PcbDelete(Pcbhead,temp)if(temp>startblock!=)temp>state="Finish"{temp>startblock}}elseif(temp>state=="Ready")if(temp>startblock==){rInsert(readyhead,temp)temp>state="Block"cout<<"temp>startblock=}"temp=temp>statecout<<endltemp>state="Run"}cout<<"第"<<count<<"个时间片:"<<endlprintf("IDprintf("IDn")n")printf("priorityddddprintf("prioritydddddn",p>priority,p>priority,p>pdn",p>priority,p>priority,p>priority,p>priority,p>priority)riority,p>priority,p>priority)printf("cputimedddprintf("cputimedddddn",p>cputime,p>cputime,pddn",p>cputime,p>cputime,p>cputime,p>cputime,p>cputime)>cputime,p>cputime,p>cputime)printf("alltimeddddprintf("alltimedddddn",p>alltime,p>alltime,p>aldn",p>alltime,p>alltime,p>alltime,p>alltime,p>alltime)ltime,p>alltime,p>alltime)printf("startblockddddprintf("startblockdddddn",p>startblock,p>startblock,pdn",p>startblock,p>startblock,p>startblock,p>startblock,p>startblock)>startblock,p>startblock,p>startblock)printf("blocktimeddddprintf("blocktimedddddn",p>blocktime,p>blocktime,pdn",p>blocktime,p>blocktime,p>blocktime,p>blocktime,p>blockti>blocktime,p>blocktime,p>blocktime)me)cout<<"statecout<<"state"<<setw()<<p>state<<setw()<<p"<<setw()<<p>state<<setw()<<p>state<<setw()<<p>state<<setw()<<>state<<setw()<<p>state<<setw()<<p>state<<setw()<<p>statep>state<<setw()<<p>statecout<<endlcout<<endlcout<<"所有进程全部结束~"<<endlcout<<"正在运行的进程return是:"<<temp>id<<endl}cout<<"Readyqueue:"附实验运行结果:

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/14

进程调度模拟实验

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利