




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作业调度源代码附后1:#include #include using namespace std;struct time /时间的数据结构int hour;int minute;struct Job /作业string jobname; /作业名time intime; /进入时间int runtime; /作业估计运行时间time starttime; /作业开始时间time endtime; /作业结束时间int cycletime; /作业周转时间 float cltime; /作业带权周转时间bool haverun; /是否已运行;float T=0;/作业平均周转时间float W=0;/作业带权平均周转时间void showInput(Job job,int &n) /输入提示cout*请按作业进入时间先后顺序输入*endl;for(int i=0;in;i+)cout作业i+1:endl;coutjobi.jobname;cout作业进入时间:;scanf(%d:%d,&ime.hour,&ime.minute);coutjobi.runtime;jobi.starttime.hour=0;jobi.starttime.minute=0;jobi.endtime.hour=0;jobi.endtime.minute=0;jobi.cycletime=0;jobi.cltime=0;jobi.haverun=false; /标记为未运行cout*endl;void Init(Job job,int &n)/初始化for(int i=0;in;i+)jobi.starttime.hour=0;jobi.starttime.minute=0;jobi.endtime.hour=0;jobi.endtime.minute=0;jobi.cycletime=0;jobi.cltime=0;jobi.haverun=false; /标记为未运行T=0;W=0;void showTime(time time) /显示时间couttime.hour:=60)time.hour+;time.minute-=60;return time;bool comtime(time t1,time t2)/比较两个时间的大小,第一个大就返回TRUEif(t1.hourt2.hour)return true;else if(t1.hour=t2.hour&t1.minute=t2.minute)return true;elsereturn false;void showResult(Job job,int &n) /显示结果coutjobnametintimetruntimetsttimetendtimet周转时间(分钟)t带权周转时间endl;cout*endl;for(int i=0;in;i+)coutjobi.jobnamet;showTime(ime);couttjobi.runtimet;showTime(jobi.starttime);coutt;showTime(jobi.endtime);coutt jobi.cycletimett jobi.cltimeendl;cout作业平均周转时间:T=T/(n*1.0)endl;cout作业带权平均周转时间:W=W/(n*1.0)endl;int minRuntime(Job job,int &n,time &t) /找出作业中最短作业下标int min=-1;for(int i=0;in;i+)if(jobi.haverun=false & comtime(t,ime)=true)min=i;break;for(int j=min+1;jn;j+)if(jobj.haverun=false & jobj.runtimejobmin.runtime & comtime(t,ime)=true)min=j;return min;void SJF(Job job,int &n)/短作业优先作业调度struct time t;job0.starttime.hour=ime.hour;job0.starttime.minute=ime.minute;job0.endtime=timeAdd(job0.starttime,job0.runtime);job0.haverun=true;job0.cycletime=timeDiff(job0.endtime,ime);job0.cltime=job0.cycletime*1.0/job0.runtime;T+=job0.cycletime;W+=job0.cltime;t=job0.endtime;while(minRuntime(job,n,t)!=-1)int i=minRuntime(job,n,t);if(comtime(ime,t)jobi.starttime=ime;elsejobi.starttime=t;jobi.endtime=timeAdd(jobi.starttime,jobi.runtime);jobi.haverun=true;jobi.cycletime=timeDiff(jobi.endtime,ime); jobi.cltime=jobi.cycletime*1.0/jobi.runtime;T+=jobi.cycletime; W+=jobi.cltime;t=jobi.endtime;int Firstintime(Job job,int &n) /找出作业中最先到的int min=-1;for(int i=0;in;i+)if(jobi.haverun=false)min=i;break;for(int j=min+1;jn;j+)if(jobj.haverun=false & comtime(ime,ime)min=j;return min;void FCFS(Job job,int &n)/先来先服务作业调度struct time t;job0.starttime.hour=ime.hour;job0.starttime.minute=ime.minute;job0.endtime=timeAdd(job0.starttime,job0.runtime);job0.haverun=true;job0.cycletime=timeDiff(job0.endtime,ime);job0.cltime=job0.cycletime*1.0/job0.runtime;T+=job0.cycletime;W+=job0.cltime;t=job0.endtime;while(Firstintime(job,n)!=-1)int i=Firstintime(job,n);if(comtime(ime,t)jobi.starttime=ime;elsejobi.starttime=t;jobi.endtime=timeAdd(jobi.starttime,jobi.runtime);jobi.haverun=true;jobi.cycletime=timeDiff(jobi.endtime,ime); jobi.cltime=jobi.cycletime*1.0/jobi.runtime;T+=jobi.cycletime; W+=jobi.cltime;t=jobi.endtime;void main()coutn;Job *job=new Jobn;if(n=0)cout输入不合法!;exit(-1);elseshowInput(job,n);coutendl;FCFS(job,n);cout先来先服务:endl;showResult(job,n);coutendl;Init(job,n);SJF(job,n); /短作业优先cout短作业优先:endl;showResult(job,n);system(pause);运行结果:用户输入作业的相关信息,程序输出相应的各种算法运行结果。以下为程序运行后的输出数据:输入信息:运行结果:进程调度源代码附后2:#include #include #include #define getpch(type) (type*)malloc(sizeof(type) /用getpcb(type)给type类型的变量申请一个空间struct pcb / 定义进程控制块PCB char name10; /进程名char state; /进程状态int super; /进程优先级int ntime; /进程需要运行时间int rtime; /进程已经运行的时间struct pcb *link; /定义了一个指向pcb结构类型的指针link作为自己的成员函数*ready=NULL,*p; /定义了两个指向pcb结构类型的指针ready和p ,ready的初值为空typedef struct pcb PCB; / 定义PCB为struct pcb的别名/-void inunization() /初始化界面函数 printf(nntt*ttn); printf(tttt实验一 进程调度n); printf(tt*ttn); printf(nnnttt计算机系802班n); printf(ttt姓名:李雪娇n); printf(ttt学号:08030043n); printf(ttt完成时间:2010年12月08日nnnn); printf(tttt请输入任意键进入演示过程n); getch(); /-void sort() /对进程进行优先级排列函数 PCB *first, *second; int insert=0; / 判断是否将新建进程插入在队列中,如果是则置1 if(ready=NULL) | (p-super) (ready-super) / 优先级最大者,插入队首 p-link=ready; / 将新建的进程块指向队首进程,他自己成为队首 ready=p; / 将ready指向队首进程 else / 进程比较优先级,插入适当的位置中 first=ready; / first指针指向队首进程 second=first-link; / second指针指向第二个进程while(second!=NULL) / 判断是否已到队尾 if(p-super)(second-super) / 若插入进程比当前进程优先数大, / 插入到当前进程前面 p-link=second;/ 将新建进程的link指针指向他的下一个进程 first-link=p; /将新建进程在队列中的前一个进程指向这个新建进程second=NULL; / second不指向任何进程 insert=1; / 将insert标准置为1 else / 插入进程优先数最低,则插入到队尾 first=first-link; / 新建进程的优先级小于second指向进程的优先/级,将first,second下移一个进程 second=second-link; if(insert=0) first-link=p;/ p指向进程的优先级最小,将p指向的进程插入队尾 /-void sort1() /对进程进行轮转调度排列函数 PCB *first; if(ready=NULL) /如果就绪队列为空 ready=p; / 将新建进程放入就绪队列中,将ready指向队首进程 else / 就绪队列中有进程在等待,将新建进程插入到队尾 first=ready; / first指针指向队首进程 while(first-link!=NULL) first=first-link; /当first指针没有指向队尾时,指针后移 first-link=p;/将P指向的进程插入队尾 /-void input(flag) /建立进程控制块函数 int i;system(cls); /清屏printf(n 请输入六个进程信息:n);for(i=0;iname); / 输入进程的名字 if(flag=1)/如果标志变量flag等于1,则属于最先优先数优先算法的进程输入 /flag不等于1就不输入进程优先数printf(n 输入进程优先数:);scanf(%d,&p-super); / 输入进程的优先数printf(n 输入进程运行时间:);scanf(%d,&p-ntime); / 输入进程的运行时间printf(n);p-rtime=0; / 进程已运行的时间的初值为0p-state=w; / 将新建的进程的状态置为等待p-link=NULL; / 新建进程的指针域为空if(flag=1)/如果标志变量flag等于1,则属于最先优先数优先算法sort();/ 调用sort函数else sort1();/调用sort1函数 /-int space() /计算进程控制块个数的函数 int l=0; PCB* pr=ready; / pr指向队首进程while(pr!=NULL) / pr为空,则说明计数完成 l+; pr=pr-link; / pr向下以一个进程 return(l); /-void disp(PCB * pr) /建立进程显示函数,用于显示使用最先优先数优先算法的当前进程 printf(n qname t state t super t ndtime runtime n); printf( |%st,pr-name); / 显示当前进程的进程名printf( |%ct,pr-state); / 显示当前进程的状态 printf( |%dt,pr-super); / 显示当前进程的优先级 printf( |%dt,pr-ntime); / 显示当前进程的运行时间 printf( |%dt,pr-rtime); / 显示当前进程的已运行时间 printf(n); /-void disp1(PCB * pr)/建立进程显示函数,用于显示使用FCFS算法的当前进程 printf(n qname t state t ndtime runtime n); printf( |%st,pr-name); / 显示当前进程的进程名printf( |%ct,pr-state); / 显示当前进程的状态 printf( |%dt,pr-ntime); / 显示当前进程的运行时间 printf( |%dt,pr-rtime); / 显示当前进程的已运行时间 printf(n); /- void check(flag) /进程查看函数 PCB* pr; printf(n * 当前正在运行的进程是:%s,p-name);/ 显示当前运行进程 if(flag=1)disp(p);/如果标志变量flag为1,则调用disp()函数elsedisp1(p);/标志变量不为1,调用disp1()函数pr=ready;/ pr指向等待队列的队首进程printf(n *当前就绪队列状态为:n); / 显示就绪队列状态while(pr!=NULL)/就绪队列不为空时/根据标识符值显示不同算法下的就绪队列状态if(flag=1)disp(pr);elsedisp1(pr); pr=pr-link; /-void destroy() /建立进程撤消函数(进程运行结束,撤消进程) printf(n 进程 %s 已完成.n,p-name); free(p); /-void running() /建立进程就绪函数(进程运行时间到,置就绪状态) (p-rtime)+; / 进程的运行时间加1 if(p-rtime=p-ntime) / 如果已运行时间等于进程运行所需的时间,则将进程释放 destroy(); / 调用destroy函数 else (p-super)-; / 将优先级减1p-state=w; / 将状态置为等待 sort(); / 调用sort函数 /-void running1() /建立进程就绪函数(进程运行时间到,置就绪状态) (p-rtime)+; / 进程的运行时间加1 if(p-rtime=p-ntime) / 如果已运行时间等于进程运行所需的时间,则将进程释放 destroy(); / 调用destroy函数 else p-state=w; / 将状态置为等待 sort1(); / 调用sort1函数 /-void youxian() /高优先级优先算法的程序入口int len,h=0; / len用来存放进程的个数char ch; system(cls);input(1); /调用input函数,输入进程信息len=space(); / 进程个数赋给lenwhile(len!=0) & (ready!=NULL) ch=getchar(); h+; / h用于记录运行的次数printf(n The execute number:%d n,h); p=ready; / 将队首指针赋给pready=p-link; / ready指向p的下一个进程p-link=NULL; / p的link赋空p-state=R; / 将p的状态设置成运行check(1); / 调用check()函数running(); / 调用running()函数printf(n 按任一键继续.); printf(nn 进程已经完成.n); ch=getchar(); /-void RoundRobin() /轮转法模块,FCFS算法的程序入口int len, h=0;/ len用来存放进程的个数char ch;system(cls);/清屏input(0);/调用input1函数,输入进程信息len=space();/进程个数赋给lenwhile(len!=0)&(ready!=NULL)ch=getchar();h+;/h用于记录运行的次数printf(n The execute number:%d n,h);p=ready;/将队首指针赋给pready=ready-link;/ready指向原ready的下一个进程p-link=NULL;/p的link赋空p-state=R;/p的运行状态置为运行check(0);/调用check函数,运用值传递running1();/调用running1函数printf(n 按任意键继续.);printf(nn 进程已经完成.n);ch=getchar();/*模块结束*/-void menu() /菜单int m;system(cls);printf(nntt*ttn);printf(tttt进程调度演示n);printf(tt*ttn);printf(nnnttt1.演示最高优先数优先算法.);printf(nttt2.演示轮转法算法.);printf(nttt0.退出程序.);printf(nntttt选择进程调度方法:);scanf(%d,&m);switch(m)case 1:youxian(); /高优先级优先算法的程序入口system(cls);menu();break;case 2: RoundRobin(); /轮转法演示进程的程序入口 system(cls);/清屏 menu();/调用菜单函数 break;case 0:system(cls);break;default:system(cls);menu();/-main() /主函数 inunization();menu();执行结果:图1.1 对进程采用轮转调度法结果(作业按先后顺序排列)图1.2 进程按高优先级算法调度图1.3 进程按轮转调度算法调度页式地址变换的代码附:#include #include #include using namespace std;using std:string;string DectoHex(int dec);char getHexChar(int temp);int HextoDec(string hex);int getDecInt(char temp);int getPhysNum(int num);void printp_t();int pagemap502; /用户输入的页表int contrlreg2=20,0; /控制寄存器,存放页表长度和页表始址bool usesysflag=true;/使用系统默认的页表int pagetable20=5,8,6,11,13,16,2,10,9,17,4,19,3,18,12,1,7,14,0,15; /页表int main()bool errorflag=true; /用户输入的信息是否有错bool exitflag=false; /退出程序标志int logic_addr=0; /逻辑地址的十进制表示string logaddr; /char占一个字节int pagenum=0; /保存页号int offset=0; /保存偏移地址int physaddrDec=0; /保存最终的物理地址/int p_toffset=0; /页表始址增量,与逻辑页面号相加while(!exitflag)cout*欢迎使用页式管理地址转换机构系统*endl;cout本系统设页面长度为1K,共有20个页面,页面号从0开始endl;cout输入exit退出程序endl;cout是否使用系统默认的页表,Y/N:;char pa=getchar();if(pa=y | pa=Y)usesysflag=true;elseusesysflag=false;if(!usesysflag) /用户输入页表coutcontrlreg0;if(contrlreg050)contrlreg0=50;coutcontrlreg1;for(int i=0;icontrlreg0;i+)coutpagemapi0;coutpagemapi1;pagemapi0+=contrlreg1;coutlogaddr;if(!logaddr.find(exit)exitflag=true;errorflag=false;continue;errorflag=false;/size_t len = logic.size();if(logaddrlogaddr.size()-1=h | logaddrlogaddr.size()-1=H) /十六进制for(int i=0;ilogaddr.size()-1;i+)if(logaddri57 & logaddri70 & logaddri102)errorflag=true;cout输入的逻辑地址有误,请重新输入:;break;else /十进制for(int i=0;ilogaddr.size();i+)if(logaddri57)errorflag=true;cout输入的逻辑地址有误,请重新输入:;break;if(exitflag)continue;printp_t();if(logaddrlogaddr.size()-1=h | logaddrlogaddr.size()-1=H) /十六进制logic_addr=HextoDec(logaddr);else /十进制for(int i=0;ilogaddr.size();i+)logic_addr=logic_addr*10+logaddri-48;/coutlogic_addr=logic_addr19)cout输入的逻辑地址非法!endl;elsephysaddrDec=pagetablepagenum*1024+offset;coutlogaddr转换后的物理地址十进制表示为:physaddrDecendl;coutlogaddr转换后的物理地址十六进制表示为:DectoHex(physaddrDec)H=contrlreg0)cout输入的逻辑地址非法!endl;elsephysaddrDec=getPhysNum(pagenum+contrlreg1);cout物理页号为:physaddrDecendl;if(physaddrDec=-1)cout输入的逻辑地址非法!endl;elsephysaddrDec=physaddrDec*1024+offset;coutlogaddr转换后的物理地址十进制表示为:physaddrDecendl;coutlogaddr转换后的物理地址十六进制表示为:DectoHex(physaddrDec)Hendl;cout按回车键继续;getchar();getchar();system(cls); /清屏errorflag=true;logic_addr=0; /逻辑地址的十进制表示pagenum=0; /保存页号offset=0; /保存偏移地址physaddrDec=0; /保存最终的物理地址 cout程序即将退出!endl;cout感谢你的使用,欢迎下次再使用endl;return 0;/打印页表void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自考行政管理的主题研究方向试题及答案
- 2025-2030年中国数字安全和监视(DSS)解决方案行业市场现状供需分析及投资评估规划分析研究报告
- 护理学实践案例与考点试题及答案
- 聘用关系解除协议书
- 2025年江苏扬州市江都区公开招聘事业单位工作人员笔试发布笔试历年典型考题及考点剖析附带答案详解
- 自愿使用空调协议书
- 绿化工程补苗协议书
- 股份入伙合同协议书
- 美甲员工合约协议书
- 执业护士考试的系统化复习试题与答案
- 手工焊接工艺操作规范
- 《母鸡》作业设计-统编版语文四年级下册
- 高校人才引进机制研究
- 【高中物理竞赛专题大全】竞赛专题1力学50题竞赛真题强化训练解析版
- 《2023中国会议统计分析报告》
- 上消化道出血病人的护理
- 2020教学能力大赛国赛一等奖实施报告汇报PPT-国一
- 信访事项复查申请书
- 2023学年完整公开课版《老师领进门》
- 《伊利乳业集团企业内部审计存在的问题及优化对策分析案例(论文)10000字》
- 2023年副主任医师(副高)-急诊医学(副高)考试历年高频考点真题附带含答案
评论
0/150
提交评论