新版操作系统专业课程设计_第1页
新版操作系统专业课程设计_第2页
新版操作系统专业课程设计_第3页
新版操作系统专业课程设计_第4页
新版操作系统专业课程设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计阐明书(操作系统)题目:进程调度院系:计算机科学与工程学院专业班级:信息安全13-2学号:3029xx学生姓名:xx指引教师:xx12月15日

安徽理工大学课程设计(论文)任务书计算机科学与工程学院学号3029xx学生姓名Xx专业(班级)信息安全13-2设计题目进程调度模仿程序设计技术参数(1)系统作业或进程数目;(2)进程等待时间(3)进程运营时间设计要求1.依照设计任务,用自己熟悉计算机语言编制程序,在机器上调试运营,并通过上机考核。2.模仿在单解决器状况下进程调度,目是加深对进程调度工作理解。3.设计一种准时间片轮转调度算法实现解决器调度程序。4.在完毕电子设计后,规定写一份详细设计报告。工作量1.编写代码不少于200行;2.程设计阐明书不少于15页。工作计划.11.23-11.25依照课程设计规定,查找有关资料,完毕需求分析;.11.26-11.27进行系统概要设计;.11.28-12.5进行系统详细设计和源代码书写;.12.6-12.10对系统进行调试分析,写出课程设计报告。参考资料[1]龚沛曾等编.C/C++程序设计教程.北京:高等教诲出版社,.[2][美]PrataS.著.CPrimerPlus(第5版中文版).北京:人民邮电出版社,.[3]汤子瀛等编著.计算机操作系统.西安:西安电子科技大学出版社,[4]胡志刚,谭长庚等,《计算机操作系统》,中南大学出版社[5]罗宇,邹鹏等,《操作系统》(第二版),电子工业出版社4月[6]庞丽萍,《操作系统原理》,华中理工大学出版社,指引教师签字教研室主任签字安徽理工大学课程设计(论文)成绩评估表学生姓名:xx学号:3029xx专业班级:信息安全13-2程序设计训练题目:进程调度模仿程序评价单元评价要素评价内涵满分评分知识水平30%文献查阅与知识运用能力能独立查阅文献资料,并能合理地运用到程序设计训练之中;能将所学课程(专业)知识精确地运用到程序设计之中,并归纳总结本程序设计训练所涉及关于课程知识20程序设计方案设计能力程序设计整体思路清晰,程序设计方案合理可行10阐明书质量50%难度级别与程序设计训练任务书题目难度级别相称10写作水平整体思路清晰,构造合理,层次分明,语言表达流畅,综合概括能力强30写作规范符合程序设计训练报告基本规定,用语、格式、图表、数据及各种资料引用规范(符合原则)10学习体现20%工作量程序设计训练工作量饱满,能准时完毕程序设计训练规定工作量10学习态度学习态度认真,遵守程序设计阶段纪律,作风严谨,准时完毕程序设计规定任务,准时上交程序设计训练关于资料10成绩:指引教师:年月日摘要当代计算机系统中,进程是资源分派和独立运营基本单位,是操作系统核心概念。因而,进程就成为理解操作系统如何实现系统管理最基本,也是最重要概念。进程调度是进程管理过程重要构成某些,是必然要发生事件。在当代操作系统中,进程并发机制在绝大多数时候,会产生不断变化进程就绪队列和阻塞队列。处在执行态进程无论是正常或非正常终结、或转换为阻塞状态,都会引起从就绪队列中,由进程调度选取一种进程进占CPU。进程调度核心是进程调度算法.在本课程设计中,用良好清晰界面向顾客展示了进程调度中时间片轮转调度算法。在最后实现成果中,顾客可指定需要模仿进程数,CPU时间片和进程最大执行时间,并且选取需要演示算法,界面将会动态显示进程调度过程及各个队列变化。通过此进程调度模仿系统,顾客可以对时间片轮转调度算法有进一步以及直观理解。核心词:进程,调度,PCB,时间片轮转

目录1.设计目 62.设计思路 63.设计过程 83.1流程图 83.2算法 83.3数据构造 103.4源代码 104.实验成果及分析 204.1使用阐明 204.2程序演示 205.实验总结 246.参照文献 241.设计目 依照设计任务,用自己熟悉计算机语言编制程序,在机器上调试运营,并通过上机考核。编写一程序,可以创立若干个虚拟进程,并对若干个虚拟进程进行调度,调度方略为时间片轮转。虚拟程序描述:虚拟指令格式:操作命令操作时间其中,操作命令有如下几种: C:表达在CPU上计算 I:表达输入 O:表达输出 W:表达等待 H:表达进程结束操作时间代表该操作命令要执行多长时间假设I/O设备数量没有限制I、O、W三条指令事实上是不占用CPU,执行这三条指令就应将进程放入相应等待队列(Input等待队列、Output等待队列、Wait等待队列)例有一虚拟程序p1.prc描述如下:c30o12c9i14h0 该虚拟程序表达含义是:先在CPU上计算30秒,再在输出设备上输出12秒,计算9秒,在输入设备上输入14秒,程序结束。2.设计思路 进程调度是操作系统中重要功能,用来创立进程、撤除进程、实现进程状态转换,它提供了在可运营进程之间复用CPU办法。在进程管理中,进程调度是核心,由于在采用多道程序设计系统中,往往有若干个进程同步处在就绪状态,当就绪进程个数不不大于解决器数目时,就必要依照某种方略决定哪些进程优先占用解决器。本程序用时间片轮转调度算法对各种进程进行调度,每个进程有三个状态就绪、运营和完毕,初始状态为就绪状态。 时间片轮转调度算法中,系统将所有就绪进程按先来先服务算法原则,排成一种队列,每次调度时,系统把解决机分派给队列首进程,并让其执行一种时间片。当执行时间片用完时,由一种计时器发出时钟中断祈求,调度程序依照这个祈求停止该进程运营,将它送到就绪队列末尾,再把解决机分给就绪队列中新队列首进程,同步让它也执行一种时间片。(1)建立一种进程控制块。PCB来代表。PCB涉及:进程名、链接指针、到达时间、预计运营时间、剩余时间和进程状态。进程状态分为就绪(W)、运营(R)和完毕(F)。(2)为每个进程任意拟定一种规定运营时间和到达时间。(3)按照进程到达先后顺序排成一种循环队列。再设一种对首指针指向第一种到达进程首址。(4)执行解决机调度时,开始选取对首第一种进程运营。此外再设一种当前运营进程指针,指向当前正运营进程。(5)执行:a)预测运营时间减1;b)输出当前运营进程名字。(6)进程执行一次后,若该进程剩余运营时间为零,则将该进程状态置为完毕态F,并退出循环队列;若不为空,则将其移至队尾。继续在运营队首进程。(7)若就绪队列不空,则重复上述(5)和(6)环节直到所有进程都运营完为止。在所设计调度程序中,规定包括显示或打印语句。以便显示或打印每次选操作系统课程设计中进程名称及运营一次后队列变化状况。3.设计过程3.1流程图3.2算法 如果就绪队列中有n个进程,且时间片为q,则每个进程会得到CPU时间,每个长度不超过q时间单元。每个进程必要等待CPU时间不会超过(n-1)q个时间单元,直到它下一种时间片为止voidRun(){ inti,flag=0,time=10,pcbnum,Index=0,exenum,num,quenum;charcmd;intj,m,n; inttotal=0; JobEnQueueInit(&total); save(); while(total!=0){ if( !EmptyQueue(Queue[1])){ outqueue(&Queue[1],&pcbnum); insertqueue(&Queue[0],pcbnum); }elsepcbnum=GetHead(Queue[0]);delay();jobpcb[pcbnum].status='e';printf("\n\t\t作业%d\n",pcbnum+1); printf("\t\t\t所处状态:%c\t执行了%d秒\n",jobpcb[pcbnum].status,time); for(i=0;i<3;i++){if(jobpcb[i].id>=0){//所有作业除在就绪队列获执行结束外等待时间都减去时间片 if(jobpcb[i].status!='r'&&jobpcb[i].status!='h')jobpcb[i].wtime=jobpcb[i].wtime-time; if(jobpcb[i].wtime<=0){//查找所有队列所在位置 for(j=0;j<5;j++){ for(m=Queue[j].head;m<Queue[j].tail;m++){ if(Queue[j].pcbnum[m]==i){flag=1;break; } } if(flag==1)break; } if(flag==1){ //删除该指令 for(n=m;n<Queue[j].tail;n++)Queue[j].pcbnum[n]=Queue[j].pcbnum[n+1]; Queue[j].tail--; jobpcb[i].exetoIndex++; Index=jobpcb[i].exetoIndex; JobEnQueue(i,Index,&total); } }}}if(!EmptyQueue(Queue[1])){ outqueue(&Queue[0],&pcbnum); if(jobpcb[pcbnum].wtime>0){ insertqueue(&Queue[1],pcbnum); jobpcb[pcbnum].status='r'; } }printf("\n\n\t\t尚有\t%d个作业没有完毕\n",total);save(); }}3.3数据构造voiddelay()intchange(char*m)intAllocPCB()intAllocJob()voiddisplayIndex()intCreatePcbLine()voidinitqueue(structQnode*l)voidinsertqueue(structQnode*l,intpcbnum)intEmptyQueue(structQnodel)voidoutqueue(structQnode*l,int*pcbnum)voiddisplay()voidJobEnQueueInit(int*total)voidsave()voidJobEnQueue(intpcbnum,intIndex,int*total)intGetHead(structQnodel)voidRun()voidInitFile()3.4源代码//进程调度模仿程序,以时间片轮转调度算法为核心#defineNULL0#include<stdio.h>#include<conio.h>#include<string.h>#include<malloc.h>#include<time.h>FILE*GroupFile[10];//定义一种pcb构造体typedefstructindex{charname;//指令inttime;//指令执行时间 }index;structpcb{charfilename[10];//进程名 intid;//作业编号 intexetoIndex;//当前正在执行指令 charstatus;//当前状态 intwtime;//等待时间};structpcbjobpcb[100];//pcb表typedefstructjob{indexidx[100];//指令集 intpcbnum;//pcb编号相应}job;jobjobtab[100];//作业表charjobp[3][50];//作业//队列构造体structQnode{ intpcbnum[100];//pcb编号inthead,tail;};structQnodeQueue[5];//5个队列0E1R2I3O4Wvoidinitqueue(structQnode*l);//延迟voiddelay(){ time_tbegin,end;time(&begin);do{time(&end); }while((end-begin)<=1);}//字符转化为数值intchange(char*m){ inti,j=0;intlen=strlen(m);for(i=0;i<len;i++)j=j*10+m[i]-'0';returnj;}//申请pcb进程块intAllocPCB(){inti;for(i=0;i<3;i++)if(jobpcb[i].id==-1)break;if(i<3)returni;return-1;}//申请jobintAllocJob(){inti;for(i=0;i<3;i++)if(jobtab[i].pcbnum==-1)break;if(i<3)returni;return-1;}//显示指令voiddisplayIndex(){ inti,j;for(i=0;i<3;i++){printf("Job%d\n",i+1); for(j=0;j<10;j++)printf("%d%c%d\n",j+1,jobtab[i].idx[j].name,jobtab[i].idx[j].time); }}//创立进程程序intCreatePcbLine(){ charline[10]; int i,ll,jnum,pnum,ln=0,bpos,pos=0; charbuff[50];charname[20];charch; for(i=0;i<3;i++){ ln=0; jnum=AllocJob(); if(jnum==-1)return0; pnum=AllocPCB(); if(pnum==-1)return0; jobtab[jnum].pcbnum=pnum; strcpy(jobpcb[pnum].filename,""); jobpcb[pnum].status='r'; jobpcb[pnum].exetoIndex=0; jobpcb[pnum].id=jnum; jobpcb[pnum].wtime=0; intlen=strlen(jobp[i]); pos=0; while(pos<len){ while(jobp[i][pos]=='')pos++; jobtab[jnum].idx[ln].name=jobp[i][pos++];/// while(jobp[i][pos]=='')pos++; bpos=0; while(jobp[i][pos]!='') buff[bpos++]=jobp[i][pos++]; buff[bpos]='\0'; jobtab[jnum].idx[ln].time=change(buff);///// if(pos<len){pos++;ln++; } } } displayIndex();}//初始化队列voidinitqueue(structQnode*l){l->head=0; l->tail=0;}//插进入队列/voidinsertqueue(structQnode*l,intpcbnum){l->pcbnum[l->tail++]=pcbnum;}//队列与否为空intEmptyQueue(structQnodel){if(l.head==l.tail)return1;return0;}//删除队列voidoutqueue(structQnode*l,int*pcbnum){if(l->head>=l->tail)*pcbnum=-1; else *pcbnum=l->pcbnum[l->head++];}//显示作业voiddisplay(){inti,j; for(i=0;i<5;i++){printf("队列%d",i); for(j=Queue[i].head;j<Queue[i].tail;j++) printf("pcb编号%d\n\n",Queue[i].pcbnum[j]); }}//作业入队列voidJobEnQueueInit(int*total){inti,num,Index=0; charcmd; for(i=0;i<3;i++) if(jobpcb[i].id>=0){ cmd=jobtab[jobpcb[i].id].idx[Index].name; switch(cmd){ case'c':insertqueue(&Queue[1],i);jobpcb[i].status='r';break;case'i':insertqueue(&Queue[2],i);jobpcb[i].status='i';break;case'o':insertqueue(&Queue[3],i);jobpcb[i].status='o';break;case'w':insertqueue(&Queue[4],i);jobpcb[i].status='w';break; case'h':jobpcb[i].status='h';num=jobpcb[i].id;jobtab[num].pcbnum=-1;jobpcb[i].id=-1; } if(cmd=='h'){jobpcb[i].wtime=0;total--;} jobpcb[i].wtime=jobtab[jobpcb[i].id].idx[Index].time;(*total)++; } }//保存成果voidsave(){FILE*fp;inti;fp=fopen("pcbtable.txt","a");fprintf(fp,"文献名作业编号执行到指令数所处状态等待时间\n");for(i=0;i<3;i++)fprintf(fp,"\t%s\t%d\t%d\t%c\t%d\n",jobpcb[i].filename,jobpcb[i].id,jobpcb[i].exetoIndex, jobpcb[i].status,jobpcb[i].wtime);fclose(fp);}//作业入队列voidJobEnQueue(intpcbnum,intIndex,int*total){intnum; charcmd; if(jobpcb[pcbnum].id>=0){ cmd=jobtab[jobpcb[pcbnum].id].idx[Index].name; switch(cmd){ case'c':insertqueue(&Queue[1],pcbnum);jobpcb[pcbnum].status='r';break;case'i':insertqueue(&Queue[2],pcbnum);jobpcb[pcbnum].status='i';break;case'o':insertqueue(&Queue[3],pcbnum);jobpcb[pcbnum].status='o';break;case'w':insertqueue(&Queue[4],pcbnum);jobpcb[pcbnum].status='w';break; case'h':jobpcb[pcbnum].status='h';num=jobpcb[pcbnum].id;jobtab[num].pcbnum=-1;jobpcb[pcbnum].id=-1; } if(cmd=='h'){ jobpcb[pcbnum].wtime=0; printf("\n\t\t作业%d完毕\n",pcbnum+1,jobpcb[pcbnum].status); (*total)--; } elsejobpcb[pcbnum].wtime=jobtab[jobpcb[pcbnum].id].idx[Index].time; printf("\n\t\t作业%d\n",pcbnum+1); printf("\t\t\t\t所处状态:%c\n",jobpcb[pcbnum].status); printf("\t\t还需要时间%d秒\n",jobpcb[pcbnum].wtime); }}//得到队列首元素intGetHead(structQnodel){ returnl.pcbnum[l.head];}//执行voidRun(){ inti,flag=0,time=10,pcbnum,Index=0,exenum,num,quenum;charcmd;intj,m,n; inttotal=0; JobEnQueueInit(&total); save(); while(total!=0){ if( !EmptyQueue(Queue[1])){ outqueue(&Queue[1],&pcbnum); insertqueue(&Queue[0],pcbnum); }elsepcbnum=GetHead(Queue[0]);delay();jobpcb[pcbnum].status='e';printf("\n\t\t作业%d\n",pcbnum+1); printf("\t\t\t所处状态:%c\t执行了%d秒\n",jobpcb[pcbnum].status,time); for(i=0;i<3;i++){if(jobpcb[i].id>=0){//所有作业除在就绪队列获执行结束外等待时间都减去时间片 if(jobpcb[i].status!='r'&&jobpcb[i].status!='h')jobpcb[i].wtime=jobpcb[i].wtime-time; if(jobpcb[i].wtime<=0){//查找所有队列所在位置 for(j=0;j<5;j++){ for(m=Queue[j].head;m<Queue[j].tail;m++){ if(Queue[j].pcbnum[m]==i){flag=1;break; } } if(flag==1)break; } if(flag==1){ //删除该指令 for(n=m;n<Queue[j].tail;n++)Queue[j].pcbnum[n]=Queue[j].pcbnum[n+1]; Queue[j].tail--; jobpcb[i].exetoIndex++; Index=jobpcb[i].exetoIndex; JobEnQueue(i,Index,&total); } }}}if(!EmptyQueue(Queue[1])){ outqueue(&Queue[0],&pcbnum); if(jobpcb[pcbnum].wtime>0){ insertqueue(&Queue[1],pcbnum); jobpcb[pcbnum].status='r'; } }printf("\n\n\t\t尚有\t%d个作业没有完毕\n",total);save(); }}//初始化voidInitFile(){inti;GroupFile[0]=fopen("p1.prc","r");GroupFile[1]=fopen("p2.prc","r");GroupFile[2]=fopen("p3.prc","r");fgets(jobp[0],255,GroupFile[0]);fgets(jobp[1],255,GroupFile[1]);fgets(jobp[2],255,GroupFile[2]); for(i=0;i<100;i++){ jobpcb[i].exetoIndex=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论