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

上传人:来看看 文档编号:5016951 上传时间:2020-01-28 格式:DOC 页数:22 大小:461KB
返回 下载 相关 举报
《操作系统》课程设计报告-多道批处理调度的模拟.doc_第1页
第1页 / 共22页
《操作系统》课程设计报告-多道批处理调度的模拟.doc_第2页
第2页 / 共22页
《操作系统》课程设计报告-多道批处理调度的模拟.doc_第3页
第3页 / 共22页
《操作系统》课程设计报告-多道批处理调度的模拟.doc_第4页
第4页 / 共22页
《操作系统》课程设计报告-多道批处理调度的模拟.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《《操作系统》课程设计报告-多道批处理调度的模拟.doc》由会员分享,可在线阅读,更多相关《《操作系统》课程设计报告-多道批处理调度的模拟.doc(22页珍藏版)》请在三一文库上搜索。

1、课 程 设 计 课程名称 操作系统 _ 题目名称 多道批处理调度的模拟学生学院 计算机学院 专业班级 2007 级计科(5)班 2010年 07月 03日广东工业大学课程设计任务书一、课程设计的内容本课程设计要求模拟实现一个的多道批处理系统的两级调度。通过具体的作业调度、进程调度、内存分配等功能的实现,加深对多道批处理系统的两级调度模型和实现过程的理解。 二、课程设计的要求与数据1 要求作业从进入系统到最后完成,要经历两级调度:作业调度和进程调度。作业调度是高级调度,它的主要功能是根据一定的算法,从输入井中选中若干个作业,分配必要的资源,如主存、外设等,为它们建立初始状态为就绪的作业进程。进程

2、调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。2 假定某系统可供用户使用的主存空间共100KB,并有4台磁带机。主存分配采用可变分区分配方式且主存中信息不允许移动,对磁带机采用静态分配策略,作业调度分别采用先来先服务算法和最小作业优先算法,进程调度采用先来先服务和最短进程优先算法。(能增加实现更多的调度算法则可以获得加分)。3 假定“预输入”程序已经把一批作业的信息存放在输入井了,并为它们建立了相应作业表。测试数据如下:作业 到达时间 估计运行时间 内存需要 磁带机需要JOB1 10:00 25分钟 15K 2台JOB2 10:20 30分钟 60K 1台JO

3、B3 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以光盘(以班为单位刻录)方式提交已调试通过的完整的相关源程序和能够运行的执行文件;提交“课程设计

4、报告”的书面和电子两种版本。四、课程设计进程安排序号设计各阶段内容地点起止日期1查阅资料、分析题目、概要设计分散周一2详细设计、编码分散周二3调试实验室周三4撰写设计报告分散周四5运行、验收实验室周五五、应收集的资料及主要参考文献1 计算机操作系统, 汤小丹等 ,西安电子科技大学出版社2 操作系统实验指导书,傅秀芬,广东工业大学(自编)3 计算机操作系统教程 ( 第二版 ), 张尧学、 史美林,清华大学出版社4 现代操作系统,A.S.Tanenbaum 著,陈向群等译机械工业出版社发出任务书日期:2010年6月27日 指导教师签名:林穗计划完成日期: 2010年7月3日 基层教学单位责任人签章

5、:傅秀芬一 设计背景本次课程设计的目的是模拟实现一个多道批处理系统的两级调度。在这之前,我们的操作系统课程已经做过了四次实验,分别是进程调度,作业调度,主存空间的分配和回收,文件系统。而此次多道批处理系统的两级调度将在采用前三次实验(即进程调度,作业调度,主存空间的分配和回收)成果的基础上,对他们进行整合,完成一个完整的模拟多道批处理系统两级调度的系统程序。本课程设计将按要求规定的步骤进行:设计背景(查询资料和分析题目),概要设计,详细设计,编码,调试和测试,总结和撰写报告。二 概要设计1.要求作业从进入系统到最后完成,要经历两级调度:作业调度和进程调度。作业调度是高级调度,它的主要功能是根据

6、一定的算法,从输入井中选中若干个作业,分配必要的资源,如主存、外设等,为它们建立初始状态为就绪的作业进程。进程调度是低级调度,它的主要功能是根据一定的算法将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+设计如下各功能界面。

7、放在输入井的作业列表:内存分配的情况:已经进入内存并存在的作业:已经完成的作业列表:程序设置区:包括开始时间,磁带机和内存初始值,调度算法的选择作业添加区,可以输入作业及它的各个参数。程序运行状态区。如开始,暂停,继续和重置等个人信息的显示:三 详细设计。1 相关数据结构的设计。typedef struct job/建立作业信息结构char jname10; /作业名int hour; /到达时刻时钟数int minute; /到达时刻分钟数int run; /运行时间int memory; /要求主存空间int sign; /所要磁带机数int fhour; /完成时刻时钟数int fmin

8、ute; /完成时刻分钟数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;/分区状态spa

9、rt,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,1

10、5,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 Jexe;/主存作业队列vector Jwait; /后备作业队列vector Jdone;/完成作业队列vector Jdis

11、k;/输入井作业队列vectorQjcb;/作业队列vectorQproce;/位于主存的作业队列vectorQpart;/分区表状态队列vectorQfree;/空闲分区表项vectorPronum;/完成作业的主存分区号vector:iterator pnext;/记录空闲分区表分配主存后下一个空闲位置intsystime = 0;/系统时间,初始化为0intsysmemory = 100;/主存空间100KBintpnadr = -1;/记录pnext所要指向的分区始址,-1表示无空闲分区float progressflag = 0;/进度条标志位Status InitQueue(Que

12、ue &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;

13、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;

14、Queue Al;/进程队列2主存空间分配和回收的设计:循环首次适应法。使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面一个分区;分区的中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位改变。设计一个内存空闲分链,内存空闲分区通过空闲分区链来管理,在进行内存分配时系统统优先使用空闲区低端的空间。设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空闲区和已分配区说明表的值。设计

15、作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。当一个作业执行完成撤离时,作业所占的分区应该归还给系统。归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。此时,相邻空闲区的合并问题,要求考虑四种情况:1)、释放区下邻空闲区(低地址邻接)2)、释放区上邻空闲区(高地址邻接)3)、释放区上下都与空闲区邻接4)、释放区上下都与空闲区不邻接3作业调度算法:先来先服务和短作业优先。(1)先来先服务算法:是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。(2)短

16、作业优先算法:总是按作业要求运行的时间来选择作业,每次挑选要求运行时间短且资源要求能满足的作业先进入主存执行。(3)程序流程图(仅以先来先服务调度算法说明过程)4进程调度算法:短进程优先和先来先服务。(1)先来先服务算法:是按照作业进入内存的先后次序来创建进程,先进入内存的作业优先被挑选,只要CPU一空闲,立即分配给队首的进程,让它拥有处理机资源,运行。(2)短进程优先算法:总是按进程要求运行的时间来选择进程,每次挑选要求运行时间最短进程先分配CPU执行。(3)程序流程图(仅以先来先服务调度算法说明过程)四编码。相应算法的实现(其中的重点部分):void Pclock(int &hour,in

17、t &minute)/时钟函数+minute;if(minute59)minute=0;+hour;if(hour23)hour=0;void Calt(JOB &job,int hour,int minute) /计算完成时刻job.fminute=minute;job.fhour=hour;void PfcfsInput(Queue &Al1,vector &Q)/* 建立先来先服务进程队列模块函数 */if(Al1.num != Q.size()/此时有新作业进入内存,则为它建立进程PCB p;while(Al1.num Q.size()strcpy(p.name,QAl1.num.jn

18、ame);p.ntime = QAl1.num.run;EnQueue(Al1,p);Al1.num +;void PsjfInput(Queue &Al1,vector &Q) /建立短进程优先进程队列模块if(Al1.num != Q.size()PCB p;QCB ip1,ip2;int id = Al1.num;while(Al1.num next;/指向队列的首元素while(ip2 != NULL)if(p.ntime base.ntime)/新进程比正在运行的进程还要短break;ip1 = ip2;ip2 = ip1-next;pi-base = p;/插入进程pi-next

19、= ip2;ip1-next = pi;Al1.num +;while(Al1.rear-next != NULL)/派完序注意要更新队尾指针Al1.rear = Al1.rear-next;vector:iterator ip;for(ip = Q.begin();ip != Q.end();+ip)if(ip-jname = Qid.jname)break;vector jev(ip,Q.end();/记录将要被删除作业Q.erase(ip,Q.end();/把这部分删除,以便从新排序for(id = 0;id jev.size();+id)/插入排序ip = Q.begin();whil

20、e(ip != Q.end()if(jevid.run 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 next-base.ntime = 0;int sub = Jexe0.run - Al1.front-next-base.ntime; progressflag

21、 = (float)(sub)/(float)(Jexe0.run);if(Al1.front-next-base.ntime = 0)/进程已完成要撤销该进程PCB e;Jexe0.done = true;DeQueue(Al1,e);Al1.num -;vector:iterator itor = Qproce.begin();while(itor != Qproce.end()if(strcmp(itor-name,e.name) = 0)itor-rtime = 0; break;else+itor;void Insert(vector &Q)/插入作业处理模块vector:itera

22、tor 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);/新作业插入主存作

23、业队列末尾elsevector: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:iterator reg ;/记录要删除项的下一项reg = Qfree.erase(pn

24、ext);/删除已分配的空闲分区项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)/新作业

25、装入原分区的最后的空闲分区Qproce.push_back(job);elsevector:iterator jp;int id;jp = Qproce.begin();id = pnext-num + 1;while(jp-num != id)/记录作业分区号需要改变的首位置+jp;vector:iterator ip;ip = jp;while(ip != Qproce.end()/改变新作业之后作业的分区序号+(ip-num);+ip;Qproce.insert(jp,job);/插入新作业vector:iterator spt;vector:iterator reg;spt = Qpa

26、rt.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(it

27、or != Qfree.end()/更改其下的空闲分区号+(itor-num);+itor;Q.erase(Q.begin();/删除已装进主存的作业队列的作业if(pnext != Qfree.end()/空闲分区表非空pnadr = pnext-sadd;/赋pnext所指空闲分区的分区始址elsepnadr = -1;int DisProce(vector &Q)/主存分配处理模块if(Qfree.empty()/无空闲空间分配Q.erase(Q.begin();/直接删除首元素return 0;elseif(Q0.memory space)/空闲分区足够装入作业Insert(Q);re

28、turn 1;else/搜索其它空闲分区if(Qfree.size() 1)vector:iterator itor;itor = pnext;+itor;while(itor != pnext)if(itor = Qfree.end()itor = Qfree.begin();if(Q0.memory space)/Z找到合适的分区break/跳出while循环,停止搜索+itor;if(Q0.memory space)pnext = itor;Insert(Q);return 1;Q.erase(Q.begin();/直接删除首元素return 0;void Jsjfpro(vector

29、&M) /短作业优先作业调度vector:iterator itor;vector:iterator reg;itor = Jdisk.begin();while(itor != Jdisk.end()/输入井作业if(itor-hour minute = minute) /当有作业在特定时刻申请进入主存Jwait.push_back(*itor);/将作业插入就绪队列reg = Jdisk.erase(itor);itor = reg;else+itor;if(!Jwait.empty()/后备队列非空,按短作业排序vector jev(Jwait);Jwait.clear();vector

30、:iterator ip;for(vector:size_type id = 0;id jev.size();+id)ip = Jwait.begin();while(ip != Jwait.end()if(jevid.run 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)

31、;+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); /删除就绪队列将要插入主存的作业J

32、exe.push_back(job); /将job插入主存队列尾itor=reg;/指向被删除作业的下一个位置else+ itor;/往主存队列添加作业直至主存空间不足或者就绪作业队列为空else+itor;M.erase(M.begin();void Jfcfspro(vector &M)/先来先服务作业调度vector:iterator itor;vector:iterator reg;itor = Jdisk.begin();while(itor != Jdisk.end()/输入井作业if(itor-hour minute = minute) /当有作业在特定时刻申请进入主存Jwait

33、.push_back(*itor);/将作业插入就绪队列reg = Jdisk.erase(itor);itor = reg;else+itor;if(!Jwait.empty()M.clear();int i = 0;JCB m;vector: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.b

34、egin();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;/

35、指向被删除作业的下一个位置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

36、(Jexe.begin(); /删除主存模块的首作业Jdone.push_back(work);/添加到完成队列void RecProce()/作业释放处理模块for(vector:size_type i = 0;i Pronum.size();+i)sysmemory += QpartPronumi.space;/释放主存strcpy(QpartPronumi.situ,空闲内存);/释放已完成的作业Pronum.clear();vector:iterator del;vector: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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1