时间调度和进程调度实验代码

时间调度和进程调度实验代码

ID:37456158

大小:288.00 KB

页数:20页

时间:2019-05-24

上传者:U-2494
时间调度和进程调度实验代码_第1页
时间调度和进程调度实验代码_第2页
时间调度和进程调度实验代码_第3页
时间调度和进程调度实验代码_第4页
时间调度和进程调度实验代码_第5页
资源描述:

《时间调度和进程调度实验代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

作业调度源代码附后1:#include#includeusingnamespacestd;structtime//时间的数据结构{inthour;intminute;};structJob//作业{stringjobname;//作业名timeintime;//进入时间intruntime;//作业估计运行时间timestarttime;//作业开始时间timeendtime;//作业结束时间intcycletime;//作业周转时间floatcltime;//作业带权周转时间boolhaverun;//是否已运行};floatT=0;//作业平均周转时间floatW=0;//作业带权平均周转时间voidshowInput(Jobjob[],int&n)//输入提示{cout<<"**********请按作业进入时间先后顺序输入*********"<>job[i].jobname;cout<<"作业进入时间:";scanf("%d:%d",&job[i].intime.hour,&job[i].intime.minute);cout<<"作业估计运行时间:";cin>>job[i].runtime;job[i].starttime.hour=0;job[i].starttime.minute=0;job[i].endtime.hour=0;job[i].endtime.minute=0;job[i].cycletime=0;20 job[i].cltime=0;job[i].haverun=false;//标记为未运行cout<<"*********************"<=60){time.hour++;time.minute-=60;}returntime;}boolcomtime(timet1,timet2)//比较两个时间的大小,第一个大就返回TRUE{if(t1.hour>t2.hour)20 returntrue;elseif(t1.hour==t2.hour&&t1.minute>=t2.minute)returntrue;elsereturnfalse;}voidshowResult(Jobjob[],int&n)//显示结果{cout<<"jobnametintimetruntimetsttimetendtimet周转时间(分钟)t带权周转时间"<>n;Job*job=newJob[n];if(n<=0){cout<<"输入不合法!";exit(-1);}else{showInput(job,n);20 cout<#include#include#definegetpch(type)(type*)malloc(sizeof(type))//用getpcb(type)给type类型的变量申请一个空间structpcb{//定义进程控制块PCBcharname[10];//进程名charstate;//进程状态intsuper;//进程优先级intntime;//进程需要运行时间intrtime;//进程已经运行的时间structpcb*link;//定义了一个指向pcb结构类型的指针link作为自己的成员函数}*ready=NULL,*p;//定义了两个指向pcb结构类型的指针ready和p,ready的初值为空typedefstructpcbPCB;//定义PCB为structpcb的别名//------------------------------------------------------------------------------------------------voidinunization()//初始化界面函数{printf(" tt********************************************tt ");printf("tttt实验一进程调度 ");printf("tt*********************************************tt ");printf(" ttt计算机系802班 ");printf("ttt姓名:李雪娇 ");printf("ttt学号:08030043 ");printf("ttt完成时间:2010年12月08日 ");printf("tttt请输入任意键进入演示过程 ");getch();}20 //------------------------------------------------------------------------------------------------voidsort()//对进程进行优先级排列函数{PCB*first,*second;intinsert=0;//判断是否将新建进程插入在队列中,如果是则置1if((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指向的进程插入队尾}}//------------------------------------------------------------------------------------------------voidsort1()//对进程进行轮转调度排列函数{PCB*first;if(ready==NULL)//如果就绪队列为空{ready=p;//将新建进程放入就绪队列中,将ready指向队首进程}else//就绪队列中有进程在等待,将新建进程插入到队尾{first=ready;//first指针指向队首进程while(first->link!=NULL)first=first->link;//当first指针没有指向队尾时,指针后移first->link=p;//将P指向的进程插入队尾}}20 //------------------------------------------------------------------------------------------------voidinput(flag)//建立进程控制块函数{inti;system("cls");//清屏printf(" 请输入六个进程信息: ");for(i=0;i<6;i++){printf(" 进程号No.%d: ",i+1);p=getpch(PCB);//给进程申请一个空间,并用指针p指向这个空间printf(" 输入进程名:");scanf("%s",p->name);//输入进程的名字if(flag==1)//如果标志变量flag等于1,则属于最先优先数优先算法的进程输入//flag不等于1就不输入进程优先数{printf(" 输入进程优先数:");scanf("%d",&p->super);//输入进程的优先数}printf(" 输入进程运行时间:");scanf("%d",&p->ntime);//输入进程的运行时间printf(" ");p->rtime=0;//进程已运行的时间的初值为0p->state='w';//将新建的进程的状态置为"等待"p->link=NULL;//新建进程的指针域为空if(flag==1)//如果标志变量flag等于1,则属于最先优先数优先算法sort();//调用sort函数elsesort1();//调用sort1函数}}//------------------------------------------------------------------------------------------------intspace()//计算进程控制块个数的函数{intl=0;PCB*pr=ready;//pr指向队首进程while(pr!=NULL)//pr为空,则说明计数完成{l++;pr=pr->link;//pr向下以一个进程}return(l);}//------------------------------------------------------------------------------------------------voiddisp(PCB*pr)//建立进程显示函数,用于显示使用最先优先数优先算法的当前进程{printf(" qnametstatetsupertndtimeruntime ");printf("|%st",pr->name);//显示当前进程的进程名printf("|%ct",pr->state);//显示当前进程的状态printf("|%dt",pr->super);//显示当前进程的优先级printf("|%dt",pr->ntime);//显示当前进程的运行时间printf("|%dt",pr->rtime);//显示当前进程的已运行时间printf(" ");}20 //------------------------------------------------------------------------------------------------voiddisp1(PCB*pr)//建立进程显示函数,用于显示使用FCFS算法的当前进程{printf(" qnametstatetndtimeruntime ");printf("|%st",pr->name);//显示当前进程的进程名printf("|%ct",pr->state);//显示当前进程的状态printf("|%dt",pr->ntime);//显示当前进程的运行时间printf("|%dt",pr->rtime);//显示当前进程的已运行时间printf(" ");}//------------------------------------------------------------------------------------------------voidcheck(flag)//进程查看函数{PCB*pr;printf(" ****当前正在运行的进程是:%s",p->name);//显示当前运行进程if(flag==1)disp(p);//如果标志变量flag为1,则调用disp()函数elsedisp1(p);//标志变量不为1,调用disp1()函数pr=ready;//pr指向等待队列的队首进程printf(" ****当前就绪队列状态为: ");//显示就绪队列状态while(pr!=NULL)//就绪队列不为空时{//根据标识符值显示不同算法下的就绪队列状态if(flag==1)disp(pr);elsedisp1(pr);pr=pr->link;}}//------------------------------------------------------------------------------------------------voiddestroy()//建立进程撤消函数(进程运行结束,撤消进程){printf(" 进程[%s]已完成. ",p->name);free(p);}//------------------------------------------------------------------------------------------------voidrunning()//建立进程就绪函数(进程运行时间到,置就绪状态){(p->rtime)++;//进程的运行时间加1if(p->rtime==p->ntime)//如果已运行时间等于进程运行所需的时间,则将进程释放destroy();//调用destroy函数else{(p->super)--;//将优先级减1p->state='w';//将状态置为等待sort();//调用sort函数}}//------------------------------------------------------------------------------------------------voidrunning1()//建立进程就绪函数(进程运行时间到,置就绪状态)20 {(p->rtime)++;//进程的运行时间加1if(p->rtime==p->ntime)//如果已运行时间等于进程运行所需的时间,则将进程释放destroy();//调用destroy函数else{p->state='w';//将状态置为等待sort1();//调用sort1函数}}//------------------------------------------------------------------------------------------------voidyouxian()//高优先级优先算法的程序入口{intlen,h=0;//len用来存放进程的个数charch;system("cls");input(1);//调用input函数,输入进程信息len=space();//进程个数赋给lenwhile((len!=0)&&(ready!=NULL)){ch=getchar();h++;//h用于记录运行的次数printf(" Theexecutenumber:%d ",h);p=ready;//将队首指针赋给pready=p->link;//ready指向p的下一个进程p->link=NULL;//p的link赋空p->state='R';//将p的状态设置成运行check(1);//调用check()函数running();//调用running()函数printf(" 按任一键继续......");}printf(" 进程已经完成. ");ch=getchar();}//------------------------------------------------------------------------------------------------voidRoundRobin()//轮转法模块,FCFS算法的程序入口{intlen,h=0;//len用来存放进程的个数charch;system("cls");//清屏input(0);//调用input1函数,输入进程信息len=space();//进程个数赋给lenwhile((len!=0)&&(ready!=NULL)){ch=getchar();h++;//h用于记录运行的次数printf(" Theexecutenumber:%d ",h);p=ready;//将队首指针赋给pready=ready->link;//ready指向原ready的下一个进程p->link=NULL;//p的link赋空p->state='R';//p的运行状态置为运行check(0);//调用check函数,运用值传递running1();//调用running1函数printf(" 按任意键继续......");}20 printf(" 进程已经完成. ");ch=getchar();}/*****************************模块结束************************************///------------------------------------------------------------------------------------------------voidmenu()//菜单{intm;system("cls");printf(" tt*********************************************tt ");printf("tttt进程调度演示 ");printf("tt*********************************************tt ");printf(" ttt1.演示最高优先数优先算法.");printf(" ttt2.演示轮转法算法.");printf(" ttt0.退出程序.");printf(" tttt选择进程调度方法:");scanf("%d",&m);switch(m){case1:youxian();//高优先级优先算法的程序入口system("cls");menu();break;case2:RoundRobin();//轮转法演示进程的程序入口system("cls");//清屏menu();//调用菜单函数break;case0:system("cls");break;default:system("cls");menu();}}//------------------------------------------------------------------------------------------------main()//主函数{inunization();menu();}执行结果:20 图1.1对进程采用轮转调度法结果(作业按先后顺序排列)图1.2进程按高优先级算法调度图1.3进程按轮转调度算法调度20 页式地址变换的代码附:#include#include#includeusingnamespacestd;usingstd::string;stringDectoHex(intdec);chargetHexChar(inttemp);intHextoDec(stringhex);intgetDecInt(chartemp);intgetPhysNum(intnum);voidprintp_t();intpagemap[50][2];//用户输入的页表intcontrlreg[2]={20,0};//控制寄存器,存放页表长度和页表始址boolusesysflag=true;//使用系统默认的页表intpagetable[20]={5,8,6,11,13,16,2,10,9,17,4,19,3,18,12,1,7,14,0,15};//页表intmain(){boolerrorflag=true;//用户输入的信息是否有错boolexitflag=false;//退出程序标志intlogic_addr=0;//逻辑地址的十进制表示stringlogaddr;//char占一个字节intpagenum=0;//保存页号intoffset=0;//保存偏移地址intphysaddrDec=0;//保存最终的物理地址//intp_toffset=0;//页表始址增量,与逻辑页面号相加while(!exitflag){cout<<"*****************欢迎使用页式管理地址转换机构系统*****************"<>contrlreg[0];if(contrlreg[0]>50)contrlreg[0]=50;20 cout<<"请输入页表始址:";cin>>contrlreg[1];for(inti=0;i>pagemap[i][0];cout<<"请输入物理页号:";cin>>pagemap[i][1];pagemap[i][0]+=contrlreg[1];}}cout<<"输入逻辑地址,十六进制以h/H结束:";//intt=SetCursorPos(8,25);//::SetCursorPos(5,10);while(errorflag)//检查逻辑地址是否合法{cin>>logaddr;if(!logaddr.find("exit")){exitflag=true;errorflag=false;continue;}errorflag=false;//size_tlen=logic.size();if(logaddr[logaddr.size()-1]=='h'||logaddr[logaddr.size()-1]=='H')//十六进制{for(inti=0;i57&&logaddr[i]<65)||(logaddr[i]>70&&logaddr[i]<97)||logaddr[i]>102){errorflag=true;cout<<"输入的逻辑地址有误,请重新输入:";break;}}}else//十进制{for(inti=0;i57)20 {errorflag=true;cout<<"输入的逻辑地址有误,请重新输入:";break;}}}}if(exitflag)continue;printp_t();if(logaddr[logaddr.size()-1]=='h'||logaddr[logaddr.size()-1]=='H')//十六进制{logic_addr=HextoDec(logaddr);}else//十进制{for(inti=0;i=contrlreg[0])cout<<"输入的逻辑地址非法!"<=48&&temp<=57)return(temp-48);switch(temp){case'a':return10;case'b':return11;case'c':return12;case'd':return13;case'e':return14;case'f':return15;default:return0;}}20 4.测试用例,运行结果与运行情况分析例子:系统的页面大小为1KB,页表如下图,请问逻辑地址为2200的物理地址是多少?逻辑页号物理块号021427解:页面大小为1KB,所以页号P=int(2200/1024)=2查表得物理块号为7d=2200DOM1024=152则物理地址A=7*1024+152=7320如图示结果由于我的程序中有两种选择,选择默认页表或不使用默认页表,上述例子中是不使用默认页表,下面的图示是选择默认页表,而且地址和上述相同,如结果很明显是不一样的。20

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭