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

    操作系统课程设计报告多道批处理调度的模拟.doc

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

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

    操作系统课程设计报告多道批处理调度的模拟.doc

    课 程 设 计 课程名称 操作系统 _ 题目名称 多道批处理调度的模拟学生学院 计算机学院 专业班级 2007 级计科(5)班 2010年 07月 03日广东工业大学课程设计任务书一、课程设计的内容本课程设计要求模拟实现一个的多道批处理系统的两级调度。通过具体的作业调度、进程调度、内存分配等功能的实现,加深对多道批处理系统的两级调度模型和实现过程的理解。 二、课程设计的要求与数据1 要求作业从进入系统到最后完成,要经历两级调度:作业调度和进程调度。作业调度是高级调度,它的主要功能是根据一定的算法,从输入井中选中若干个作业,分配必要的资源,如主存、外设等,为它们建立初始状态为就绪的作业进程。进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。2 假定某系统可供用户使用的主存空间共100KB,并有4台磁带机。主存分配采用可变分区分配方式且主存中信息不允许移动,对磁带机采用静态分配策略,作业调度分别采用先来先服务算法和最小作业优先算法,进程调度采用先来先服务和最短进程优先算法。(能增加实现更多的调度算法则可以获得加分)。3 假定“预输入”程序已经把一批作业的信息存放在输入井了,并为它们建立了相应作业表。测试数据如下: 作业 到达时间 估计运行时间 内存需要 磁带机需要JOB1 10:00 25分钟 15K 2台JOB2 10:20 30分钟 60K 1台JOB3 10:30 10分钟 50K 3台JOB4 10:35 20分钟 10K 2台JOB5 10:40 15分钟 30K 2台4 分别在不同算法控制下运行设计的程序,依次显示被选中作业、内存空闲区和磁带机的情况。比较不同算法作业的选中次序及作业平均周转时间。5 选用程序设计语言:C、C等。三、课程设计应完成的工作1充分理解设计的任务,完成设计的基本要求。然后根据自己的基础和能力选择不同难度的算法和实现方式,以取得更高的分数。 2. 独立完成系统的分析、设计、编码、测试工作。3完成设计报告的撰写。4以光盘(以班为单位刻录)方式提交已调试通过的完整的相关源程序和能够运行的执行文件;提交“课程设计报告”的书面和电子两种版本。四、课程设计进程安排序号设计各阶段内容地点起止日期1查阅资料、分析题目、概要设计分散周一2详细设计、编码分散周二3调试实验室周三4撰写设计报告分散周四5运行、验收实验室周五五、应收集的资料及主要参考文献1 计算机操作系统, 汤小丹等 ,西安电子科技大学出版社2 操作系统实验指导书,傅秀芬,广东工业大学(自编)3 计算机操作系统教程 ( 第二版 ), 张尧学、 史美林,清华大学出版社4 现代操作系统,A.S.Tanenbaum 著,陈向群等译机械工业出版社发出任务书日期:2010年6月27日 指导教师签名:林穗计划完成日期: 2010年7月3日 基层教学单位责任人签章:傅秀芬一 设计背景本次课程设计的目的是模拟实现一个多道批处理系统的两级调度。在这之前,我们的操作系统课程已经做过了四次实验,分别是进程调度,作业调度,主存空间的分配和回收,文件系统。而此次多道批处理系统的两级调度将在采用前三次实验(即进程调度,作业调度,主存空间的分配和回收)成果的基础上,对他们进行整合,完成一个完整的模拟多道批处理系统两级调度的系统程序。本课程设计将按要求规定的步骤进行:设计背景(查询资料和分析题目),概要设计,详细设计,编码,调试和测试,总结和撰写报告。二 概要设计1.要求作业从进入系统到最后完成,要经历两级调度:作业调度和进程调度。作业调度是高级调度,它的主要功能是根据一定的算法,从输入井中选中若干个作业,分配必要的资源,如主存、外设等,为它们建立初始状态为就绪的作业进程。进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。2假定“预输入”程序已经把一批作业的信息存放在输入井了,并为它们建立了相应作业表。测试数据如下: 作业 到达时间 估计运行时间 内存需要 磁带机需要JOB1 10:00 25分钟 15K 2台JOB2 10:20 30分钟 60K 1台JOB3 10:30 10分钟 50K 3台JOB4 10:35 20分钟 10K 2台JOB5 10:40 15分钟 30K 2台3使用visual c+设计如下各功能界面。放在输入井的作业列表:内存分配的情况:已经进入内存并存在的作业:已经完成的作业列表:程序设置区:包括开始时间,磁带机和内存初始值,调度算法的选择作业添加区,可以输入作业及它的各个参数。程序运行状态区。如开始,暂停,继续和重置等个人信息的显示:三 详细设计。1 相关数据结构的设计。typedef struct job/建立作业信息结构char jname10; /作业名int hour; /到达时刻时钟数int minute; /到达时刻分钟数int run; /运行时间int memory; /要求主存空间int sign; /所要磁带机数int fhour; /完成时刻时钟数int fminute; /完成时刻分钟数int enterhour;/进入内存时时刻时钟数int enterminute;/进入内存时刻分钟数bool done;/记录是否作业已完成,完成true,否则falsejob,JOB;typedef struct jcb/作业信息结构Intnu/记录作业位于主存分区表的分区号char name10;/作业名int rtime;/运行时间int memory;/申请主存空间jcb,JCB;typedef struct spart/分区表信息结构int num;/分区序号int sadd;/分区始址int space;/分区大小char situ10;/分区状态spart,SPART;typedef struct pcb /* 定义进程控制块PCB */ char name10; / 进程名 int ntime; / 所需要的运行时间 int stime; /剩余时间pcb,PCB;typedef struct QBNode PCB base; struct QBNode *next;QBNode,*QCB;typedef struct int tip; / 就绪队列时间片 int num; / 就绪队列成员数 QCB front; / 队头指针 QCB rear; / 队尾指针 QueueJOB JWORK5=/定义五个作业"JOBA",10, 0,25,15,2,0,0,0,0,false,"JOBB",10,20,30,60,1,0,0,0,0,false,"JOBC",10,30,10,50,3,0,0,0,0,false,"JOBD",10,35,20,10,2,0,0,0,0,false,"JOBE",10,40,15,30,2,0,0,0,0,false;int disk=4;/磁带机数5int memory=100;/系统可用主存100KBint hour=9;/系统时间int minute=55;/9:55vector<JOB> Jexe;/主存作业队列vector<JOB> Jwait; /后备作业队列vector<JOB> Jdone;/完成作业队列vector<JOB> Jdisk;/输入井作业队列vector<JCB>Qjcb;/作业队列vector<JCB>Qproce;/位于主存的作业队列vector<SPART>Qpart;/分区表状态队列vector<SPART>Qfree;/空闲分区表项vector<int>Pronum;/完成作业的主存分区号vector<SPART>:iterator pnext;/记录空闲分区表分配主存后下一个空闲位置intsystime = 0;/系统时间,初始化为0intsysmemory = 100;/主存空间100KBintpnadr = -1;/记录pnext所要指向的分区始址,-1表示无空闲分区float progressflag = 0;/进度条标志位Status InitQueue(Queue &Q)/* 构造空队列Q */ Q.front=(QCB)malloc(sizeof(QBNode); Q.rear=Q.front; if(!Q.front)return -2;Q.num=0;Q.tip=0; Q.front->next=NULL; return 1;Status EnQueue(Queue &Q,PCB &e)/* 插入元素e为Q的新的队尾元素 */ QCB p; p=(QCB)malloc(sizeof(QBNode); if(!p)return -2; p->base=e; p->next=NULL; Q.rear->next=p;Q.rear=p; return 1;Status DeQueue(Queue &Q,PCB &e)/* 若队列非空,则删除Q的队头元素,用e返回其值 */ QCB p; if(Q.front=Q.rear)return 0;/* 空队列 */ p=Q.front->next; e=p->base; Q.front->next=p->next; if(Q.rear=p)Q.rear=Q.front; p->next=NULL; free(p); return 1;Status EmptyQueue(Queue &Q)/判断Q是否为空队列,是返回1,否返回0if(Q.front->next=NULL)return 1;elsereturn 0;Queue Al;/进程队列2主存空间分配和回收的设计:循环首次适应法。使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面一个分区;分区的中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位改变。设计一个内存空闲分链,内存空闲分区通过空闲分区链来管理,在进行内存分配时系统统优先使用空闲区低端的空间。设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空闲区和已分配区说明表的值。设计作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。当一个作业执行完成撤离时,作业所占的分区应该归还给系统。归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。此时,相邻空闲区的合并问题,要求考虑四种情况:1)、释放区下邻空闲区(低地址邻接)2)、释放区上邻空闲区(高地址邻接)3)、释放区上下都与空闲区邻接4)、释放区上下都与空闲区不邻接3作业调度算法:先来先服务和短作业优先。(1)先来先服务算法:是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。(2)短作业优先算法:总是按作业要求运行的时间来选择作业,每次挑选要求运行时间短且资源要求能满足的作业先进入主存执行。(3)程序流程图(仅以先来先服务调度算法说明过程)4进程调度算法:短进程优先和先来先服务。(1)先来先服务算法:是按照作业进入内存的先后次序来创建进程,先进入内存的作业优先被挑选,只要CPU一空闲,立即分配给队首的进程,让它拥有处理机资源,运行。(2)短进程优先算法:总是按进程要求运行的时间来选择进程,每次挑选要求运行时间最短进程先分配CPU执行。(3)程序流程图(仅以先来先服务调度算法说明过程)四编码。相应算法的实现(其中的重点部分):void Pclock(int &hour,int &minute)/时钟函数+minute;if(minute>59)minute=0;+hour;if(hour>23)hour=0;void Calt(JOB &job,int hour,int minute) /计算完成时刻job.fminute=minute;job.fhour=hour;void PfcfsInput(Queue &Al1,vector<JOB> &Q)/* 建立先来先服务进程队列模块函数 */if(Al1.num != Q.size()/此时有新作业进入内存,则为它建立进程PCB p;while(Al1.num < Q.size()strcpy(p.name,QAl1.num.jname);p.ntime = QAl1.num.run;EnQueue(Al1,p);Al1.num +;void PsjfInput(Queue &Al1,vector<JOB> &Q) /建立短进程优先进程队列模块if(Al1.num != Q.size()PCB p;QCB ip1,ip2;int id = Al1.num;while(Al1.num < Q.size()/ 有新作业进入内存QCB pi;pi = (QCB)malloc(sizeof(QBNode);strcpy(p.name,QAl1.num.jname);p.ntime = QAl1.num.run;ip1 = Al1.front;ip2 = Al1.front->next;/指向队列的首元素while(ip2 != NULL)if(p.ntime <= ip2->base.ntime)/新进程比正在运行的进程还要短break;ip1 = ip2;ip2 = ip1->next;pi->base = p;/插入进程pi->next = ip2;ip1->next = pi;Al1.num +;while(Al1.rear->next != NULL)/派完序注意要更新队尾指针Al1.rear = Al1.rear->next;vector<JOB>:iterator ip;for(ip = Q.begin();ip != Q.end();+ip)if(ip->jname = Qid.jname)break;vector<JOB> jev(ip,Q.end();/记录将要被删除作业Q.erase(ip,Q.end();/把这部分删除,以便从新排序for(id = 0;id < jev.size();+id)/插入排序ip = Q.begin();while(ip != Q.end()if(jevid.run <= ip->run)break;else+ip;Q.insert(ip,jevid);void PRun(Queue &Al1)/进程队列运行模块Pclock(hour,minute); if(EmptyQueue(Al1) = 0)/进程队列非空,则执行Al1.front->next->base.ntime -;/进程队列首元素正在执行if(Al1.front->next->base.ntime < 0)Al1.front->next->base.ntime = 0;int sub = Jexe0.run - Al1.front->next->base.ntime; progressflag = (float)(sub)/(float)(Jexe0.run);if(Al1.front->next->base.ntime = 0)/进程已完成要撤销该进程PCB e;Jexe0.done = true;DeQueue(Al1,e);Al1.num -;vector<JCB>:iterator itor = Qproce.begin();while(itor != Qproce.end()if(strcmp(itor->name,e.name) = 0)itor->rtime = 0; break;else+itor;void Insert(vector<JCB> &Q)/插入作业处理模块vector<SPART>:iterator itor = pnext;sysmemory -= Q0.memory;/分配主存空间if(Q0.memory = itor->space)/空闲分区大小恰好等于作业大小strcpy(Qpartitor->num.situ,Q0.name);/将作业装入内存相应分区中JCB job = Q0;Q.erase(Q.begin();/删除已装进主存的作业队列的作业job.num = pnext->num;/新作业的分区号int sub = Qpart.size() - 1;if(pnext->num = sub)/新作业恰好位于末尾分区Qproce.push_back(job);/新作业插入主存作业队列末尾elsevector<JCB>:iterator jp;int id;id = pnext->num + 1;jp = Qproce.begin();while(jp->num != id) /找到要插入新作业的位置+jp;Qproce.insert(jp,job);+itor;if(itor = Qfree.end()/指向原空闲分区表的最后一个元素Qfree.erase(pnext);/删除已分配的空闲分区项pnext = Qfree.begin();/pnext指向Qfree首元素elsevector<SPART>:iterator reg ;/记录要删除项的下一项reg = Qfree.erase(pnext);/删除已分配的空闲分区项pnext = reg;/令pnext指向下一个空闲分区else/空闲分区大小大于作业申请空间大小SPART part;/分割后位于分区表的空闲分区part.num = pnext->num + 1;part.sadd = pnext->sadd + Q0.memory;part.space = pnext->space - Q0.memory;strcpy(part.situ,pnext->situ);JCB job = Q0;job.num = pnext->num;int sub = Qpart.size() - 1;if(pnext->num = sub)/新作业装入原分区的最后的空闲分区Qproce.push_back(job);elsevector<JCB>:iterator jp;int id;jp = Qproce.begin();id = pnext->num + 1;while(jp->num != id)/记录作业分区号需要改变的首位置+jp;vector<JCB>:iterator ip;ip = jp;while(ip != Qproce.end()/改变新作业之后作业的分区序号+(ip->num);+ip;Qproce.insert(jp,job);/插入新作业vector<SPART>:iterator spt;vector<SPART>:iterator reg;spt = Qpart.begin();while(spt->sadd !=Qpartpnext->num.sadd)/记录分区表插入Qpart所需要的位置+spt;Qpartpnext->num.space = Q0.memory;strcpy(Qpartpnext->num.situ,Q0.name);/把作业装进主存相应分区下+spt;reg = spt;while(reg != Qpart.end()/更改其下的分区号+(reg->num);+reg;Qpart.insert(spt,part);/插入part,分区表相应项序号已更改(*pnext) = part;/分割后的空闲分区项+itor;while(itor != Qfree.end()/更改其下的空闲分区号+(itor->num);+itor;Q.erase(Q.begin();/删除已装进主存的作业队列的作业if(pnext != Qfree.end()/空闲分区表非空pnadr = pnext->sadd;/赋pnext所指空闲分区的分区始址elsepnadr = -1;int DisProce(vector<JCB> &Q)/主存分配处理模块if(Qfree.empty()/无空闲空间分配Q.erase(Q.begin();/直接删除首元素return 0;elseif(Q0.memory <= pnext->space)/空闲分区足够装入作业Insert(Q);return 1;else/搜索其它空闲分区if(Qfree.size() > 1)vector<SPART>:iterator itor;itor = pnext;+itor;while(itor != pnext)if(itor = Qfree.end()itor = Qfree.begin();if(Q0.memory <= itor->space)/Z找到合适的分区break/跳出while循环,停止搜索+itor;if(Q0.memory <= itor->space)pnext = itor;Insert(Q);return 1;Q.erase(Q.begin();/直接删除首元素return 0;void Jsjfpro(vector<JCB> &M) /短作业优先作业调度vector<JOB>:iterator itor;vector<JOB>:iterator reg;itor = Jdisk.begin();while(itor != Jdisk.end()/输入井作业if(itor->hour <= hour && itor->minute <= minute) /当有作业在特定时刻申请进入主存Jwait.push_back(*itor);/将作业插入就绪队列reg = Jdisk.erase(itor);itor = reg;else+itor;if(!Jwait.empty()/后备队列非空,按短作业排序vector<JOB> jev(Jwait);Jwait.clear();vector<JOB>:iterator ip;for(vector<JOB>:size_type id = 0;id < jev.size();+id)ip = Jwait.begin();while(ip != Jwait.end()if(jevid.run <= ip->run )break;else+ip;Jwait.insert(ip,jevid);M.clear();int i = 0;JCB m;ip = Jwait.begin();while(ip != Jwait.end()m.memory = ip->memory;m.rtime = ip->run;strcpy(m.name,ip->jname);M.push_back(m);+i;+ip;/就绪队列作业,存放已到达而因资源不足而阻塞的作业itor=Jwait.begin();while(itor!=Jwait.end()if(disk>=itor->sign) /当主存空间磁带机足够用时if(DisProce(M) = 1)JOB job=*itor; /复制作业信息job.enterhour = hour;/进入主存时钟数job.enterminute = minute;/进入主存分钟数memory-=itor->memory; /分配主存空间disk-=itor->sign;/分配磁带机reg=Jwait.erase(itor); /删除就绪队列将要插入主存的作业Jexe.push_back(job); /将job插入主存队列尾itor=reg;/指向被删除作业的下一个位置else+ itor;/往主存队列添加作业直至主存空间不足或者就绪作业队列为空else+itor;M.erase(M.begin();void Jfcfspro(vector<JCB> &M)/先来先服务作业调度vector<JOB>:iterator itor;vector<JOB>:iterator reg;itor = Jdisk.begin();while(itor != Jdisk.end()/输入井作业if(itor->hour <= hour && itor->minute <= minute) /当有作业在特定时刻申请进入主存Jwait.push_back(*itor);/将作业插入就绪队列reg = Jdisk.erase(itor);itor = reg;else+itor;if(!Jwait.empty()M.clear();int i = 0;JCB m;vector<JOB>:iterator ip;ip = Jwait.begin();while(ip != Jwait.end()m.memory = ip->memory;m.rtime = ip->run; strcpy(m.name,ip->jname);M.push_back(m);+i;+ip; /就绪队列作业,存放已到达而因资源不足而阻塞的作业itor=Jwait.begin();while(itor!=Jwait.end()if(disk >= itor->sign) /当主存空间磁带机足够用时if(DisProce(M) = 1)JOB job= *itor; /复制作业信息job.enterhour = hour;/进入主存时钟数job.enterminute = minute;/进入主存分钟数memory-=itor->memory; /分配主存空间disk-=itor->sign;/分配磁带机reg=Jwait.erase(itor); /删除就绪队列将要插入主存的作业Jexe.push_back(job); /将job插入主存队列尾itor=reg;/指向被删除作业的下一个位置else+ itor;/往主存队列添加作业直至主存空间不足或者就绪作业队列为空else+itor;M.erase(M.begin();void JFinjob()/完成作业处理模块if(!Jexe.empty()/主存作业非空if(Jexe0.done = true) /如果作业已完成 JOB work=*Jexe.begin();/作业完成,要将其插入到完成作业队列Calt(work,hour,minute);memory+=Jexe.begin()->memory; /释放占用的主存空间disk+=Jexe.begin()->sign;/释放磁带机Jexe.erase(Jexe.begin(); /删除主存模块的首作业Jdone.push_back(work);/添加到完成队列void RecProce()/作业释放处理模块for(vector<int>:size_type i = 0;i < Pronum.size();+i)sysmemory += QpartPronumi.space;/释放主存strcpy(QpartPronumi.situ,"空闲内存");/释放已完成的作业Pronum.clear();vector<SPART>:iterator del;vector<SPART>:iterator it;del = Qpart.begin();+del;/主存队列首分区分配已给系统while(del != Qpart.end()/更新分区表Qpartif(strcmp(del->situ,"空闲内存") = 0)/指定分区为空闲分区it = del;+it;if(it != Qpart.end()if(strcmp(it->situ,"空闲内存") = 0)/del的下一分区也空闲/合并del和it指向的分区int adr1,adr2;adr1 = del->sadd;adr2 = it->sadd;it->num = del->num;it->sadd = del->sadd;it->space += del->s

    注意事项

    本文(操作系统课程设计报告多道批处理调度的模拟.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开