您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 模拟批处理多道操作系统的作业调度
石家庄经济学院实验报告(学院)系:信息工程学院专业:网络工程姓名:何秉乾班级:网络2班学号:407109070501指导教师:王建东日期:2010年1月22日操作系统实验报告姓名何秉乾学号407109070501日期2010/1/11-2010/1/22实验室260机房指导教师王建东设备编号设计题目作业调度一.设计内容模拟批处理多道操作系统的作业调度二.设计目的每个用户请求计算机计算的一个计算任务叫做一个作业。一个作业从输入初始数据到得到计算结果,要经过若干个步骤的相继执行。例如,编辑、编译、运行等,其中每一个步骤称作一个作业步。用户向系统提出作业加工步骤的方式称作业控制方式,作业控制方式有两种:终端控制方式(又称直接控制方式或联机控制方式)和批处理控制方式(又称自动控制方式或脱机控制方式)。在批处理控制方式下,用户采用系统提供的作业控制语言(JCL)写好作业说明书,说明作业加工的步骤。操作员把一批作业组织成输入流,通过“预输入”手段使每个作业的信息(包括作业说明书、源程序、初始数据等)暂存在辅助存储器的“输入井”中。批处理多道操作系统的作业管理有两个任务:作业调度和作业控制。采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为这些被选中的作业分配所需的系统资源。对被选中运行的作业必须按照它们各自的作业说明书规定的步骤进行控制。本实习要求学生模拟作业调度的实现,了解作业调度在操作系统中的作用。三.设计过程1、数据结构设计:设计一个结构体数组typedefstructwork{charusername[10];//用户名charworkname[10];//作业名floattime;//作业运行时间charstate;//状态R为收容,A表示执行状态,T为完成intstore;//主存inttape;//磁带}WORK;WORKw[N];//工作数组初始化操作printf(初始化:\n);for(i=0;iN;i++){printf(--请输入第%d个作业的信息--\n,i+1);printf(第%d个作业:用户名:,i+1);scanf(%s,w[i].username);printf(第%d个作业:作业名:,i+1);scanf(%s,w[i].workname);printf(第%d个作业:运行时间:,i+1);scanf(%f,&w[i].time);printf(第%d个作业:状态:,i+1);scanf(%s,&w[i].state);printf(第%d个作业:主存:,i+1);scanf(%d,&w[i].store);printf(第%d个作业:磁带:,i+1);scanf(%d,&w[i].tape);}2、算法设计:(1)算法选择函数:intchoice()函数功能:根据要求选择FCFS或SFJ。入口参数:c出口参数:i流程图见图1图1作业调度算法选择流程图(2)先来先服务函数(FCFS):intFCFS()函数功能:FCFS的运算过程入口参数:F出口参数:j或-1流程图见图2所示:图2先进先出算法流程图(3)短作业优先服务函数(SFJ):intSFJ()函数功能:SFJ的运算过程入口参数:S出口参数:j或-1流程图见图3所示:图3短作业优先算法流程图(4)随机数算法操作函数功能:输入随机数模拟处理器调度入口参数:time_t和k出口参数:p和q流程图:无(5)撤离作业算法操作函数功能:主存中的作业按运行的时间来决定撤离的先后次序入口参数:h和l出口参数:H和L流程图见图4所示:图4撤离作业算法流程图(6)主功能函数:voidAdminister()函数功能:实现函数要求。入口参数:无出口参数:无流程图见图5所示:图5主功能算法流程图四.源程序#includestdio.h#includestdlib.h#includestring.h#includetime.h#defineN5//作业数#defineT5//资源数#defineS100//主存大小typedefstructwork{charusername[10];//用户名charworkname[10];//作业名floattime;//作业运行时间charstate;//状态R为收容,Z表示执行状态,W为完成intstore;//主存inttape;//磁带}WORK;intSJF();//运行时间最短者优先算法intFCFS();//先来先服务intchoiceWork();//选择一个收容状态,资源能满足的作业voidAdminister();//执行程序intt=T;//m为系统中剩余的磁带资源量ints=S;//s为主存剩余大小WORKw[N];//工作数组voidmain(){inti;printf(初始化:\n);for(i=0;iN;i++){printf(--请输入第%d个作业的信息--\n,i+1);printf(第%d个作业:用户名:,i+1);scanf(%s,w[i].username);printf(第%d个作业:作业名:,i+1);scanf(%s,w[i].workname);printf(第%d个作业:运行时间:,i+1);scanf(%f,&w[i].time);printf(第%d个作业:状态:,i+1);scanf(%s,&w[i].state);printf(第%d个作业:主存:,i+1);scanf(%d,&w[i].store);printf(第%d个作业:磁带:,i+1);scanf(%d,&w[i].tape);}Administer();//执行程序}voidAdminister()//执行程序{inti,j,f;intn=0;//主存中的作业数for(i=0;iN;i++)if(w[i].state=='Z'){t=t-w[i].tape;s=s-w[i].store;n++;}if(s0||t0||n2){printf(初始化失败,退出系统\n);return;}charworkname[10];charusername[10];for(;;){floatp;intk;intq;charb;getchar();time_tt;srand((unsigned)time(&t));printf(电脑随机数是:\n);for(k=0;k1;k++)q=rand()%10;p=q*0.1;printf(%f\n,p);if(p0.5){printf(随机数大于0.5,转入作业表\n);}else{printf(随机数不大于0.5,转入主存\n);}printf(继续(N)、返回(B)、显示当前著作业状态(D)还是退出系统(Q):);scanf(%s,&b);if(b=='N'){if(p0.5&&p=1){f=0;for(i=0;iN;i++)if(w[i].state=='R')f=1;if(f==1)//主存中尚有未被选中的作业{if(t0&&s0)//主存中还能装入作业{j=choiceWork();if(j0)//没选到{printf(等待作业执行结束归还资源.\n);continue;}else//为作业分配资源{t=t-w[j].tape;s=s-w[j].store;w[j].state='Z';n++;if(n2){t=t+w[j].tape;s=s+w[j].store;w[j].state='R';n++;printf(主存无法正常运行,返回.\n);continue;}printf(--显示被调入主存的作业的用户名和作业名--\n);printf(%s%s\n,w[j].username,w[j].workname);continue;}}else{printf(主存中作业满载.\n);continue;}}else{printf(请操作员输入作业.\n);}}else{if(n==2){floath=0;floatl=100;intH=-1;intL=-1;for(i=0;iN;i++)if(w[i].state=='Z'&&w[i].timeh){h=w[i].time;H=i;}elseif(w[i].state=='Z'&&w[i].timel){H=w[i].time;L=i;}if(HL){for(i=0;iN;i++)if(w[i].state=='Z'){printf(作业%s正在执行.\n,w[i].workname);printf(输入用户名(该作业结束):,i);scanf(%s,username);printf(输入作业名(该作业结束):,i);scanf(%s,workname);}for(i=0;iN;i++)if(strcmp(workname,w[i].workname)==0){w[i].state='W';s+=w[i].store;t+=w[i].tape;n=0;break;}}else{for(i=N-1;i-1;i--)if(w[i].state=='Z'){printf(作业%s正在执行.\n,w[i].workname);printf(输入用户名(该作业结束):,i);scanf(%s,username);printf(输入作业名(该作业结束):,i);scanf(%s,workname);}for(i=N-1;i-1;i--)if(strcmp(workname,w[i].workname)==0){w[i].state='W';s+=w[i].store;t+=w[i].tape;n=0;break;}}continue;}elseif(n==1){for(i=0;iN;i++)//输出正在执行的作业if(w[i].state=='Z'){printf(作业%s正在执行.\n,w[i].workname);printf(输入用户名(该作业结束):,i);scanf(%s,username);printf(输入作业名(该作业结束):,i);scanf(%s,workname);}for(i=0;iN;i++)if(strcmp(workname,w[i].workname)==0){w[i].state='W';s+=w[i].store;t+=w[i].tape;n=0;break;}continue;}else{printf(主存中没有作业.\n);continue;}}}if(b=='B'){printf(返回重新随即.\n);continue;}if(b=='Q'){break;}if(b=='D'){printf(--显示众作业当前的信息--\n,i+1);printf(用户名\t作业名\t运行时间\t状态\t主存\t磁带\n);for(i=0;iN;i++){printf(%s\t%s\t%f\t%s\t%d\t%d\n,w[i].username,w[i].workname,w[i].time,&w[i].state,w[i].store,w[i].tape);}}}}intchoiceWork()//选择一个收容状态,资源能满足的作业{inti;charc;getchar();printf(用先来先服务算法,或者用运行时间最短者优先算法ForS:);scanf(%c,&c);switch(c){case'F':i=FCFS();break;case'S':i=SJF();break;}returni;}intFCFS()//先来先服务{inti;for(i=0;iN;i++)//查找工作状态为收容的资源量可满足的作业if(w[i].state=='R'&&w[i].store=s&&w[i].tape=t)break;if(i=0&&iN)returni;elsereturn-1;}intSJF()//运行时间最短
本文标题:模拟批处理多道操作系统的作业调度
链接地址:https://www.777doc.com/doc-5174909 .html