欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    实验一处理机调度.doc

    • 资源ID:4043873       资源大小:157KB        全文页数:19页
    • 资源格式: DOC        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    实验一处理机调度.doc

    实验一 处理机调度一.实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。二.实验内容选择一个调度算法,实现处理机调度。1.设计一个按优先权调度算法实现处理机调度的程序。2.设计按时间片轮转实现处理机调度的程序。三.实验要求要求:进程名/PID要求运行时间(单位时间)优先权状态PCB指针1、可随机输入若干进程,并按优先权排序;2、从就绪队列首选进程运行:优先权-1,要求运行时间-1,要求运行时间=0时,撤销该进程。3、重新排序,进行下轮调度。4、最好采用图形界面。5、可以随时增加进程。6、规定道数,设置后备队列和挂起状态。若内存中进程少于规定道数,可自动从后备队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。7、每次调度后,显示各进程状态。四.实验过程#include"windows.h"#include<iostream.h>#include<stdio.h>#include<conio.h>enum PCBSTATE READY,RUN,FINISH; /定义进程状态的数据类型typedef struct PCB_Struct /定义进程控制块 char Name8; /进程名 int Priority; /优先数 double WorkTime; /已运行的时间 double NeedTime; /还需运行时间 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; /把临时线程加入就绪链表if (tmp->Priority<Insert->Priority) /比较优先级安排链表序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 PCB;char Name8;int Priority;double Time; /人机交互获取进程参数cin>>Name; cout<<" 优先数:"cin>>Priority; cout<<" 所需时间:"cin>>Time;cout<<endl;strcpy(tmp->Name,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=tmp;RearReady=tmp; void GetAllPCB() /输入开始时的进程int i,j,k; /+kcout<<endl<<"请输入需要调度进程的个数:" /获取进程数cin>>i;if(i<1) i=2;if(i>0) /获取进程for (j=0;j<i;j+)k=j+1; cout<<" 第"<<k<<"个进程名:"GetOnePCB(); /调用增加进程void AddWaitWorkTime() /时间控制PCB *tmp=ReadyList; /处理队首时间while(tmp)tmp->WaitTime+;tmp=tmp->Next;void AdjustRunProcess() /调整运行队列AddWaitWorkTime(); /调用时间控制CurrentRun=ReadyList; /把就绪进程放入运行队列ReadyList=ReadyList->Next;CurrentRun->Next=NULL;if(CurrentRun->Priority>=1) /修改运行进程的属性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) /如果就绪队列为空RearReady=ReadyList=CurrentRun; /把监听队列中的进程防入就绪队列else AdjustProcessList(CurrentRun); /递归if(!ReadyList) /如果就绪队列为空CurrentRun=NULL; /把运行进程置空RunOk=true; /设置进程完成开关void ShowProcess() /显示队列情况 PCB *tmp; if(CurrentRun) /存在运行队列,显示 cout<<"本次调度运行的进程:"<<endl;cout<<" 进程名 "<<" 进程优先数 "<<" 已运行的时间 "<<" 还需运行时间 "<<" 进程总共花费时间 "<<" 进程状态 "<<endl;cout<<" "<<CurrentRun->Name<<" "<<CurrentRun->Priority<<" "<<CurrentRun->WorkTime<<" "<<CurrentRun->NeedTime<<" "<<CurrentRun->WaitTime<<" "<<CurrentRun->State<<endl; if(ReadyList) /存在就绪队列,显示 tmp=ReadyList;cout<<"就绪队列中的进程:"<<endl;cout<<" 进程名 "<<" 进程优先数 "<<" 已运行的时间 "<<" 还需运行时间 "<<" 进程总共花费时间 "<<" 进程状态 "<<endl;while(tmp)cout<<" "<<tmp->Name<<" "<<tmp->Priority<<" "<<tmp->WorkTime<<" "<<tmp->NeedTime<<" "<<tmp->WaitTime<<" "<<tmp->State<<endl;tmp=tmp->Next; if(FinishList) /运行至结束,显示 tmp=FinishList;cout<<"显示已运行好的进程调度结果:"<<endl;cout<<" 进程名 "<<" 进程优先数 "<<" 已运行的时间 "<<" 还需运行时间 "<<" 进程总共花费时间 "<<" 进程状态 "<<endl;while (tmp)cout<<" "<<tmp->Name<<" "<<tmp->Priority<<" "<<tmp->WorkTime<<" "<<tmp->NeedTime<<" "<<tmp->WaitTime<<" "<<tmp->State<<endl;tmp=tmp->Next; void FreeProcess() /释放进程PCB *tmp;if(!FinishList) /就绪队列为空,报错cout<<endl<<"n发生错误!"for(;FinishList->Next;) /删除进程tmp=FinishList;FinishList=FinishList->Next;delete tmp;ReadyList=NULL; /将所有队列置空FinishList=NULL;RearReady=NULL;CurrentRun=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');cout<<i<<endl<<endl;return i;void RunAlor() /进程运行控制 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(); /释放进程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 表示进程运行已结束! +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; 五.实验结果主界面运行过程添加新进程实验二 主存空间的分配和回收一.实验目的帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。二.实验内容主存储器空间的分配和回收三.实验要求在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。1、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表;表目内容:起址、长度、状态(未分/空表目)2、结合实验一,PCB增加为:PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置,PCB指针3、采用最先适应算法分配主存空间;4、进程完成后,回收主存,并与相邻空闲分区合并。四.实验过程void creatf()/空闲分区表初始化int i; for(i=0;i<m;i+) fri.ad=0; fri.len=0; fri.state='M' void disp()int i;printf("ntaddressttlengthttstaten"); for(i=0;i<m;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); scanf("%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.len<frj.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+; 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')/如果要结束作业的状态为'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) /合并完之后的空闲分区的结束地址和相邻的空闲分区的起始地址也相连,则继续合并 fri.len=fri.len+fri+1.len; for(k=i+1;k<m-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; fri.state='F' p=1; usd.state='Y' break; if(usd.ad<fri.ad) /如果结束作业不是以上两种情况,且介于两个空闲分区之间,则按起址的大小插入 for(j=m-1;j>i;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()int i,q,j; i=0; q=0; if(fr0.ad!=0) do if(f00.ad>fri.ad) i=i+1; else q=1; while(fri.state!='M'&&q=0); for(j=m-1;j>i;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 sort1()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 "over.h"int 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;五.实验结果主界面分配空间结束进程

    注意事项

    本文(实验一处理机调度.doc)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开