模拟批处理多道操作系统的作业调度.docx
- 文档编号:26489502
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:20
- 大小:176.50KB
模拟批处理多道操作系统的作业调度.docx
《模拟批处理多道操作系统的作业调度.docx》由会员分享,可在线阅读,更多相关《模拟批处理多道操作系统的作业调度.docx(20页珍藏版)》请在冰豆网上搜索。
模拟批处理多道操作系统的作业调度
石家庄经济学院
实验报告
(学院)系:
信息工程学院
专业:
网络工程
**************
班级:
网络2班
学号:
************
*******************
日期:
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;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主功能算法流程图 四.源程序 #include #include #include #include #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;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;i if(w[i].state=='Z') { t=t-w[i].tape; s=s-w[i].store; n++; } if(s<0||t<0||n>2) { printf("初始化失败,退出系统\n"); return; } charworkname[10]; charusername[10]; for(;;) { floatp; intk; intq; charb; getchar(); time_tt; srand((unsigned)time(&t)); printf("电脑随机数是: \n"); for(k=0;k<1;k++) q=rand()%10; p=q*0.1; printf("%f\n",p); if(p>0.5) { printf("随机数大于0.5,转入作业表\n"); } else { printf("随机数不大于0.5,转入主存\n"); } printf("继续(N)、返回(B)、显示当前著作业状态(D)还是退出系统(Q): "); scanf("%s",&b); if(b=='N') { if(p>0.5&&p<=1) { f=0; for(i=0;i if(w[i].state=='R') f=1; if(f==1)//主存中尚有未被选中的作业 { if(t>0&&s>0)//主存中还能装入作业 { j=choiceWork(); if(j<0)//没选到 { printf("等待作业执行结束归还资源.\n"); continue; } else//为作业分配资源 { t=t-w[j].tape; s=s-w[j].store; w[j].state='Z'; n++; if(n>2) { 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;i if(w[i].state=='Z'&&w[i].time>h) {h=w[i].time; H=i; } elseif(w[i].state=='Z'&&w[i].time { H=w[i].time; L=i; } if(H>L) { for(i=0;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;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;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;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;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;i if(w[i].state=='R'&&w[i].store<=s&&w[i].tape<=t) break; if(i>=0&&i returni; else return-1; } intSJF()//运行时间最短者优先算法 { inti,j=-1; floatk=100;//100为任意给的值,可以换任意的大于最长作业时间的数 for(i=0;i if(w[i].state=='R'&&w[i].store<=s&&w[i].tape<=t&&w[i].time { k=w[i].time; j=i; } returnj; } 五.运行结果: 1.作业表初始化操作 2.随机函数不大于0.5,转入主存 3.随机数大于0.5,查看主存,并按先进先出算法调度 4..随机数大于0.5,查看主存,并按短作业优先服务算法调度 5.显示五个作业的信息状态 6..随机函数不大于0.5,转入主存,并根据已在主存中的作业需运行的时间来决定撤离的先后次序 7.显示五个作业的信息状态 六.设计总结 通过此次实验不仅巩固了作业调度还把处理器调度算法进一步熟练运用了。 通过对作业调度处理算法的研究使我对主存的工作方式有了进一步的认识,对以后从事工作会有很大的帮助,通过用c语言来实现程序是我进一步熟练了编程步骤在提高自己动手能力的同时还加强了知识掌握熟练度。 刚开始我的作业调度程序很简单,只能满足部分功能。 对随机函数和多道作业的撤离没有编写,这星期张老师给我们这组讲解了作业调度的流程图和重点框架,让我加深了对调度的理解,并进一步完善了程序。 虽然在这里边遇到一些问题但经过自己的努力最后都迎刃而解,大大的增强了自己的自信心。 总之在这次课程设计过程中,通过自己不懈的努力我从中受益匪浅。 谨此感谢老师们的指导和帮助。 七.教师评语及成绩 评语: 成绩: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 批处理 多道 操作系统 作业 调度
![提示](https://static.bdocx.com/images/bang_tan.gif)