实验一处理机调度.doc

上传人:牧羊曲112 文档编号:4043873 上传时间:2023-04-02 格式:DOC 页数:19 大小:157KB
返回 下载 相关 举报
实验一处理机调度.doc_第1页
第1页 / 共19页
实验一处理机调度.doc_第2页
第2页 / 共19页
实验一处理机调度.doc_第3页
第3页 / 共19页
实验一处理机调度.doc_第4页
第4页 / 共19页
实验一处理机调度.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《实验一处理机调度.doc》由会员分享,可在线阅读,更多相关《实验一处理机调度.doc(19页珍藏版)》请在三一办公上搜索。

1、实验一 处理机调度一.实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。二.实验内容选择一个调度算法,实现处理机调度。1.设计一个按优先权调度算法实现处理机调度的程序。2.设计按时间片轮转实现处理机调度的程序。三.实验要求要求:进程名/PID要求运行时间(单位时间)优先权状态PCB指针1、可随机输入若干进程,并按优先权排序;2、从就绪队列首选进程运行:优先权-1,要求运行时间-1,要求运行时间=0时,撤销该进程。3、重新排序,进行下轮调度。4、最好采用图形界面。5、可以随时增加进程。6、规定道数,设置

2、后备队列和挂起状态。若内存中进程少于规定道数,可自动从后备队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。7、每次调度后,显示各进程状态。四.实验过程#includewindows.h#include#include#includeenum PCBSTATE READY,RUN,FINISH; /定义进程状态的数据类型typedef struct PCB_Struct /定义进程控制块 char Name8; /进程名 int Priority; /优先数 double WorkTime; /已运行的时间 double NeedTime; /还需运行时间

3、 double WaitTime; /进程总共花费时间 PCBSTATE State; /进程状态 PCB_Struct *Next; /指针 PCB;bool RunOk;PCB *ReadyList; /声明就绪链表PCB *FinishList; /声明完成链表 PCB *RearReady; /声明就绪监听队列PCB *RearFinish; /声明完成监听队列PCB *CurrentRun; /声明当前运行队列void AdjustProcessList(PCB *Insert) /调整进程队列PCB *tmp,*Parent; /定义线程tmp=ReadyList; /把临时线程加

4、入就绪链表if (tmp-PriorityPriority) /比较优先级安排链表序ReadyList=Insert; Insert-Next=tmp;elseParent=tmp;while(tmp)if (tmp-Priority=Insert-Priority)Parent=tmp;tmp=tmp-Next;elsebreak;if (!tmp)RearReady-Next=Insert;RearReady=Insert;elseInsert-Next=tmp;Parent-Next=Insert;void GetOnePCB() /增加进程PCB *tmp; /初始化变量tmp=new

5、 PCB;char Name8;int Priority;double Time; /人机交互获取进程参数cinName; coutPriority; coutTime;coutName,Name);tmp-Priority=Priority; /把参数到进程中tmp-WorkTime=0.0;tmp-WaitTime=0.0;tmp-NeedTime=Time;tmp-State=READY;tmp-Next=NULL;if (RearReady) /如果监听链表不为空AdjustProcessList(tmp); /调用调整进程队列else /为空则初始化监听队列 ReadyList=tm

6、p;RearReady=tmp; void GetAllPCB() /输入开始时的进程int i,j,k; /+kcoutendli;if(i0) /获取进程for (j=0;ji;j+)k=j+1; cout 第kWaitTime+;tmp=tmp-Next;void AdjustRunProcess() /调整运行队列AddWaitWorkTime(); /调用时间控制CurrentRun=ReadyList; /把就绪进程放入运行队列ReadyList=ReadyList-Next;CurrentRun-Next=NULL;if(CurrentRun-Priority=1) /修改运行进

7、程的属性CurrentRun-Priority;CurrentRun-WorkTime+;CurrentRun-NeedTime-;if(CurrentRun-NeedTime=0) /处理结束的进程CurrentRun-State=RUN;if(FinishList=NULL) /如果结束进程为空,创建FinishList=CurrentRun;else /否则,添加入完成监听队列RearFinish-Next=CurrentRun;RearFinish=CurrentRun;if(!ReadyList)ReadyList=RearReady=NULL;else if(!ReadyList)

8、 /如果就绪队列为空RearReady=ReadyList=CurrentRun; /把监听队列中的进程防入就绪队列else AdjustProcessList(CurrentRun); /递归if(!ReadyList) /如果就绪队列为空CurrentRun=NULL; /把运行进程置空RunOk=true; /设置进程完成开关void ShowProcess() /显示队列情况 PCB *tmp; if(CurrentRun) /存在运行队列,显示 cout本次调度运行的进程:endl;cout 进程名 进程优先数 已运行的时间 还需运行时间 进程总共花费时间 进程状态 endl;cou

9、t Name Priority WorkTime NeedTime WaitTime Stateendl; if(ReadyList) /存在就绪队列,显示 tmp=ReadyList;cout就绪队列中的进程:endl;cout 进程名 进程优先数 已运行的时间 还需运行时间 进程总共花费时间 进程状态 endl;while(tmp)cout Name Priority WorkTime NeedTime WaitTime StateNext; if(FinishList) /运行至结束,显示 tmp=FinishList;cout显示已运行好的进程调度结果:endl;cout 进程名 进程

10、优先数 已运行的时间 还需运行时间 进程总共花费时间 进程状态 endl;while (tmp)cout Name Priority WorkTime NeedTime WaitTime StateNext; void FreeProcess() /释放进程PCB *tmp;if(!FinishList) /就绪队列为空,报错coutendlNext;) /删除进程tmp=FinishList;FinishList=FinishList-Next;delete tmp;ReadyList=NULL; /将所有队列置空FinishList=NULL;RearReady=NULL;CurrentR

11、un=NULL;RearFinish=NULL;void RunOnce() /单步调度AdjustRunProcess();/调整运行队列char SelectStyle() /选择类型char i;printf(n); /人机交互选择下一步的操作printf(点击1-继续下一次调度,并显示就绪队列中的进程情况n);printf(点击2-向就绪队列添加新进程n);printf(点击3-运行程序n);printf(请选择你要的操作:);doi=(char)_getch();while(i!=1&i!=2&i!=3);coutiendlendl;return i;void RunAlor() /

12、进程运行控制 char j=1; RunOk=false; GetAllPCB(); /获取全部进程 do if(j!=3&!RunOk)j=SelectStyle(); /调用选择操作 if(j=3) RunOnce(); /调用单步运行if(j=1) RunOnce();ShowProcess(); /调用显示队列if(j=2) /添加新进程 system(cls);cout 新进程名:;GetOnePCB(); while(!RunOk); /当进程全部运行完毕 cout运行完成,显示进程调度结果:n; ShowProcess(); /显示进程队列 FreeProcess(); /释放进

13、程int main() /主程序char Key; ReadyList=NULL; /设置链表为空 FinishList=NULL;RearReady=NULL;CurrentRun=NULL;RearFinish=NULL;while(true) /人机交互界面system(cls);printf(=n);printf( + 优先数进程调度算法 +nn);printf(=n);printf(n);printf(*n);printf(+ 按1 执行 ! +n);printf(+ 按2 退出 ! +n); printf(+ 状态0 表示进程还没运行完! +n);printf(+ 状态1 表示进程

14、运行已结束! +n);printf(*n);printf(请选择:);doKey=(char)_getch();while(Key!=1&Key!=2); /重新输入/*system(cls);*/if(Key=2) /退出系统return 0;else if(Key=1) /开始模拟 RunAlor();printf(n按任意键继续);_getch();return 0; 五.实验结果主界面运行过程添加新进程实验二 主存空间的分配和回收一.实验目的帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。二.实验内容主存储器空间的分配和回收三.实验要求在可变分区管理方式下,采用最先适应

15、算法实现主存空间的分配和回收。1、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表;表目内容:起址、长度、状态(未分/空表目)2、结合实验一,PCB增加为:PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置,PCB指针3、采用最先适应算法分配主存空间;4、进程完成后,回收主存,并与相邻空闲分区合并。四.实验过程void creatf()/空闲分区表初始化int i; for(i=0;im;i+) fri.ad=0; fri.len=0; fri.state=M; void disp()int i;printf(ntaddressttlengthttstaten); for

16、(i=0;im;i+) printf(nt%dtt%dtt %cn,fri.ad,fri.len,fri.state);#define m 10#define n 10#define Q 1024 struct free int ad; int len; char state; frm; struct use int ad; int len; char state; us10; struct free0 int ad; int len; char state; f01;void insertu(int i)int j,p; p=0; printf(n请输入第%d个作业的长度:n,i); sca

17、nf(%d,&usi.len); usi.ad=0; usi.state=U; j=0; p=0; if(fr0.ad=0) printf(n 所有空闲区已经全部分配完毕!n); while(frj.state!=M&p=0) if( usi.lenfrj.len) usi.ad=frj.ad; frj.ad=usi.len+frj.ad; frj.len=frj.len-usi.len; p=1; break; if(usi.len=frj.len) usi.ad=frj.ad; frj.ad=0; frj.len=0; frj.state=M; sort1(); p=1; break; j

18、+; if(p=0) usi.state=N; printf(n没有适当的空间可以插入!n); if(p!=0) printf(n第%d个作业分配空间后,空闲表为:n,i); disp(); void over() int d,i,j,p,k; p=0; i=0; printf(n 输入要结束第几个作业:n); scanf(%d,&d); printf(n 要结束作业的信息为:n); printf(ntaddressttlengthttstaten); printf(nt%dtt%dtt %cn,usd.ad,usd.len,usd.state); if(usd.state=N)/如果要结束作

19、业的状态为N,说明此作业没有被分配空间 printf(n 此作业没有分配内存!n); if(usd.state=Y)/如果要结束作业的状态为Y,说明此作业已经被结束 printf(n 此作业已经结束 !n); if(usd.state=U)/如果要结束作业的状态为U,说明此作业没有被结束 while(fri.state!=M) if(usd.ad=fri.ad+fri.len) /如果被结束作业的起始地址和一个空闲分区的结束地址相邻,则合并两者 fri.len=fri.len+usd.len; if(fri.ad+fri.len=fri+1.ad) /合并完之后的空闲分区的结束地址和相邻的空闲

20、分区的起始地址也相连,则继续合并 fri.len=fri.len+fri+1.len; for(k=i+1;km-1;k+) frk.ad=frk+1.ad; frk.len=frk+1.len; frk.state=frk+1.state; frm-1.ad=0; frm-1.len=0; frm-1.state=M; usd.state=Y;/修改已经结束作业的信息 p=1; break; if(usd.ad+usd.len=fri.ad) /如果被结束作业的结束地址和一个空闲分区的起始地址相邻,则合并两者 fri.len=usd.len+fri.len; fri.ad=usd.ad; f

21、ri.state=F; p=1; usd.state=Y; break; if(usd.adi;j-) frj.ad=frj-1.ad; frj.len=frj-1.len; frj.state=frj-1.state; fri.ad=usd.ad; fri.len=usd.len; fri.state=F; usd.state=Y; break; i+; if(p=0)/如果结束作业不是以上三种情况,且其址最大,则插入到空闲分区表的末尾 fri.ad=usd.ad; fri.len=usd.len; fri.state=F; usd.state=Y; disp(); void sort()i

22、nt i,q,j; i=0; q=0; if(fr0.ad!=0) do if(f00.adfri.ad) i=i+1; else q=1; while(fri.state!=M&q=0); for(j=m-1;ji;j-) frj.ad=frj-1.ad; frj.len=frj-1.len; frj.state=frj-1.state; fri.ad=f00.ad; fri.len=f00.len; fri.state=f00.state; if(fr0.ad=0) fr0.ad=f00.ad; fr0.len=f00.len; fr0.state=f00.state; void sort

23、1()int i; i=0; while(fri.state!=M)i+; if(fri+1.state!=M)do fri.ad=fri+1.ad; fri.len=fri+1.len; fri.state=fri+1.state; i+;while(fri+1.state!=M);fri.ad=0;fri.len=0;fri.state=M; #include stdio.h #include stdlib.h #include dy.h#include disp.h#include creatf.h#include sort.h#include insertu.h#include ove

24、r.hint main() int i,j,k,p;i=1;k=0;p=1; printf(n*-*n); printf(|*主存储存空间的分配和回收模拟*|n); printf(*-*nn); creatf(); printf(n 请输入目前空闲分区表的信息:n); while(p!=0) printf(n 请输入空闲分区表某一行的起址和长度n); scanf(%d%d,&f00.ad,&f00.len); f00.state=F; sort(); printf(n 如果不再进行输入,则输入0n); scanf(%d,&p); printf(n 插入作业之前空闲分区表的信息如下:n); disp(); for(;) printf(=菜单=n); printf(1:为作业分配空间;n); printf(2:结束作业;n); printf(3:退出程序;n); printf(=n); printf(输入你的选择:n); scanf(%d,&j); switch(j) case 1:insertu(i);/为作业分配空间 i+; break; case 2:over();/作业的回收 break; case 3:exit(0); return 0;五.实验结果主界面分配空间结束进程

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号