版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计说明书(操作系统)题目: 进程调度 院 系:计算机科学与工程学院专业班级: 信息安全13-2 学 号: 20133029xx 学生姓名: xx 指导教师: xx 2015年 12月 15日安徽理工大学课程设计(论文)任务书计算机科学与工程学院 学 号20133029xx学生姓名Xx专业(班级)信息安全13-2设计题目进程调度模拟程序设计技术参数(1)系统作业或进程的数目;(2)进程等待时间(3)进程运行时间设计要求1. 根据设计任务,用自己熟悉的计算机语言编制程序,在机器上调试运行,并通过上机考核。2. 模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解。3. 设计一个按时
2、间片轮转调度算法实现处理器调度的程序。4. 在完成电子设计后,要求写一份详细的设计报告。工作量1.编写代码不少于200行;2.程设计说明书不少于15页。工作计划2015.11.23-11.25 根据课程设计要求,查找相关资料,完成需求分析;2015.11.26-11.27 进行系统的概要设计;2015.11.28-12.5 进行系统的详细设计和源代码的书写;2015.12.6-12.10 对系统进行调试分析,写出课程设计报告。参考资料1 龚沛曾等编.C/C+程序设计教程.北京:高等教育出版社,2004.2 美Prata S.著. C Primer Plus(第5版 中文版).北京:人民邮电出版
3、社,2005.3 汤子瀛等编著. 计算机操作系统.西安:西安电子科技大学出版社,20114 胡志刚,谭长庚等,计算机操作系统,中南大学出版社2005年5 罗宇,邹鹏等,操作系统(第二版),电子工业出版社2007年4月6 庞丽萍,操作系统原理,华中理工大学出版社,2000年指导教师签字教研室主任签字安徽理工大学课程设计(论文)成绩评定表学生姓名: xx 学号: 20133029xx 专业班级: 信息安全13-2 程序设计训练题目: 进程调度模拟程序 评价单元评价要素评价内涵满分评分知识水平30%文献查阅与知识运用能力能独立查阅文献资料,并能合理地运用到程序设计训练之中;能将所学课程(专业)知识准
4、确地运用到程序设计之中,并归纳总结本程序设计训练所涉及的有关课程知识20程序设计方案设计能力程序设计整体思路清晰,程序设计方案合理可行10说明书质量50%难度等级与程序设计训练任务书题目难度等级相当10写作水平整体思路清晰,结构合理,层次分明,语言表达流畅,综合概括能力强30写作规范符合程序设计训练报告的基本要求,用语、格式、图表、数据及各种资料引用规范(符合标准)10学习表现20%工作量程序设计训练工作量饱满,能按时完成程序设计训练规定的工作量10学习态度学习态度认真,遵守程序设计阶段的纪律,作风严谨,按时完成程序设计规定的任务,按时上交程序设计训练有关资料10成绩: 指导教师: 年 月 日
5、摘要现代计算机系统中,进程是资源分配和独立运行的基本单位,是操作系统的核心概念。因而,进程就成为理解操作系统如何实现系统管理的最基本,也是最重要的概念。进程调度是进程管理过程的主要组成部分,是必然要发生的事件。在现代操作系统中,进程的并发机制在绝大多数时候,会产生不断变化的进程就绪队列和阻塞队列。处于执行态的进程无论是正常或非正常终止、或转换为阻塞状态,都会引发从就绪队列中,由进程调度选择一个进程进占CPU。 进程调度的核心是进程调度的算法在本课程设计中,用良好清晰的界面向用户展示了进程调度中的时间片轮转调度算法。在最终实现的成果中,用户可指定需要模拟的进程数,CPU时间片和进程的最大执行时间
6、,并且选择需要演示的算法,界面将会动态的显示进程调度过程及各个队列的变化。 通过此进程调度模拟系统,用户可以对时间片轮转调度算法有进一步以及直观的了解。关键词:进程,调度,PCB,时间片轮转 目录1.设计目的62.设计思路63.设计过程83.1流程图83.2算法83.3数据结构103.4源代码104.实验结果及分析204.1 使用说明204.2程序演示205.实验总结246.参考文献24欢迎下载1.设计目的 根据设计任务,用自己熟悉的计算机语言编制程序,在机器上调试运行,并通过上机考核。编写一程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转。 虚拟程序的描述: 虚
7、拟指令的格式: 操作命令 操作时间 其中,操作命令有以下几种: C : 表示在CPU上计算 I :表示输入 O:表示输出 W:表示等待 H:表示进程结束 操作时间代表该操作命令要执行多长时间 假设I/O设备的数量没有限制 I、O、W三条指令实际上是不占用CPU的,执行这三条指令就应将进程放入对应的等待队列(Input等待队列、Output等待队列、Wait等待队列) 例有一虚拟程序p1.prc描述如下: c 30 o 12 c 9 i 14 h 0 该虚拟程序表示的含义是:先在CPU上计算30秒,再在输出设备上输出12秒,计算9 秒,在输入设备上输入14秒,程序结束。2.设计思路 进程调度是操
8、作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本程序用时间片轮转调度算法对多个进程进行调度,每个进程有三个状态就绪、运行和完成,初始状态为就绪状态。 时间片轮转调度算法中,系统将所有的就绪进程按先来先服务算法的原则,排成一个队列,每次调度时,系统把处理机分配给队列首进程,并让其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序根据这个请求
9、停止该进程的运行,将它送到就绪队列的末尾,再把处理机分给就绪队列中新的队列首进程,同时让它也执行一个时间片。(1)建立一个进程控制块。PCB来代表。PCB包括:进程名、链接指针、到达时间、估计运行时间、剩余时间和进程状态。进程状态分为就绪(W)、运行(R)和完成(F)。(2)为每个进程任意确定一个要求运行时间和到达时间。(3)按照进程到达的先后顺序排成一个循环队列。再设一个对首指针指向第一个到达进程的首址。(4)执行处理机调度时,开始选择对首的第一个进程运行。另外再设一个当前运行进程的指针,指向当前正运行的进程。(5)执行:a)预计运行时间减1;b)输出当前运行进程的名字。(6)进程执行一次后
10、,若该进程的剩余运行时间为零,则将该进程的状态置为完成态F,并退出循环队列;若不为空,则将其移至队尾。继续在运行队首的进程。(7)若就绪队列不空,则重复上述的(5)和(6)步骤直到所有进程都运行完为止。在所设计的调度程序中,要求包含显示或打印语句。以便显示或打印每次选操作系统课程设计中进程的名称及运行一次后队列的变化情况。3.设计过程3.1流程图3.2算法 如果就绪队列中有n个进程,且时间片为q,则每个进程会得到的CPU时间,每个长度不超过q时间单元。每个进程必须等待CPU的时间不会超过(n-1)q个时间单元,直到它的下一个时间片为止void Run () int i, flag=0, tim
11、e=10, pcbnum, Index=0, exenum, num, quenum; char cmd; int j,m,n; int total=0; JobEnQueueInit( &total ); save(); while( total!=0 ) if(!EmptyQueue( Queue1) ) outqueue(&Queue1,&pcbnum); insertqueue(&Queue0, pcbnum); else pcbnum=GetHead(Queue0); delay(); jobpcb pcbnum.status=e; printf( ntt作业 %d n,pcbnum
12、+1); printf( ttt所处状态: %c t执行了 %d 秒n, jobpcb pcbnum.status, time); for(i=0;i=0) /所有的作业除在就绪队列获执行结束的外等待时间 都减去时间片 if( jobpcbi.status!=r&jobpcbi.status!=h) jobpcbi.wtime=jobpcbi.wtime-time; if(jobpcbi.wtime=0) /查找所有的队列 所在位置 for(j=0;j5;j+) for(m=Queuej.head;mQueuej.tail;m+) if(Queuej.pcbnumm=i) flag=1;bre
13、ak; if(flag=1) break; if(flag=1)/删除该指令 for(n=m;n0) insertqueue(&Queue1, pcbnum); jobpcbpcbnum.status=r; printf( nntt 还有t %d 个作业没有完成 n,total ); save(); 3.3数据结构void delay()int change(char *m)int AllocPCB()int AllocJob()void displayIndex()int CreatePcbLine()void initqueue(struct Qnode *l)void insertque
14、ue(struct Qnode *l,int pcbnum) int EmptyQueue( struct Qnode l) void outqueue(struct Qnode *l,int *pcbnum) void display() void JobEnQueueInit( int * total)void save ()void JobEnQueue( int pcbnum,int Index ,int *total)int GetHead(struct Qnode l)void Run ()void InitFile()3.4源代码/进程调度模拟程序,以时间片轮转调度算法为核心 #
15、define NULL 0#include #include #include #include #include FILE *GroupFile10; /定义一个pcb的结构体 typedef struct index char name; /指令 int time; /指令执行时间 index; struct pcb char filename10; /进程名 int id; /作业编号 int exetoIndex; /当前正在执行指令 char status; /当前状态 int wtime; /等待时间 ; struct pcb jobpcb100; /pcb表 typedef st
16、ruct job index idx100; /指令集 int pcbnum; /pcb编号 对应 job; job jobtab100; /作业表 char jobp350; /作业 /队列结构体 struct Qnode int pcbnum100; /pcb编号 int head,tail; ; struct Qnode Queue5; /5个队列 0E 1R 2I 3O 4W void initqueue(struct Qnode *l); /延迟 void delay( ) time_t begin,end; time(&begin); do time(&end); while(en
17、d-begin)=1); /字符转化为数值 int change(char *m) int i,j=0; int len=strlen(m); for(i=0;ilen;i+) j=j*10+mi-0; return j; /申请 pcb进程块 int AllocPCB() int i; for(i=0;i3;i+) if(jobpcbi.id =-1) break; if(i3) return i; return -1; /申请job int AllocJob() int i; for(i=0;i3;i+) if(jobtabi.pcbnum = -1) break; if(i3) retu
18、rn i; return -1; /显示指令 void displayIndex() int i,j; for(i=0;i3;i+) printf( Job % d n,i+1); for(j=0;j10;j+) printf( %d %c % d n,j+1, ,jobtabi.idxj.time); /创建进程程序 int CreatePcbLine() char line10; inti,ll,jnum, pnum, ln=0, bpos, pos=0; char buff50; char name 20; char ch; for(i=0;i3;i+)
19、 ln=0; jnum=AllocJob(); if(jnum = -1) return 0; pnum=AllocPCB(); if(pnum = -1) return 0; jobtabjnum.pcbnum=pnum; strcpy(jobpcbpnum.filename, ); jobpcbpnum.status=r; jobpcbpnum.exetoIndex=0; jobpcbpnum.id=jnum; jobpcbpnum.wtime=0; int len=strlen(jobpi); pos=0; while(poslen) while(jobpipos= ) pos+; jo
20、=jobpipos+;/ while(jobpipos= ) pos+;bpos=0;while(jobpipos!= )buffbpos+=jobpipos+;buffbpos=0; jobtabjnum.idxln.time=change(buff);/if(poshead=0; l-tail=0; /插进入队列/ void insertqueue(struct Qnode *l,int pcbnum) l-pcbnuml-tail+=pcbnum; /队列是否为空 int EmptyQueue( struct Qnode l) if(l.head=l
21、.tail) return 1; return 0; /删除队列 void outqueue(struct Qnode *l,int *pcbnum) if (l-head=l-tail ) *pcbnum=-1; else *pcbnum=l-pcbnuml-head+; /显示作业 void display() int i,j; for(i=0;i5;i+) printf( 队列 %d ,i); for(j=Queuei.head;jQueuei.tail;j+) printf(pcb 编号 %d nn ,Queuei.pcbnumj); /作业入队列 void JobEnQueueIni
22、t( int * total) int i,num ,Index=0; char cmd; for( i=0;i=0) cmd=jobtab jobpcbi.id .idx Index .name; switch(cmd) case c: insertqueue(& Queue1,i); jobpcbi.status=r; break; case i: insertqueue(& Queue2,i);jobpcbi.status=i; break; case o: insertqueue(& Queue3,i);jobpcbi.status=o; break; case w: insertqu
23、eue(& Queue4,i);jobpcbi.status=w; break; case h:jobpcbi.status=h; num=jobpcbi.id;jobtabnum.pcbnum=-1;jobpcbi.id=-1; if(cmd= h) jobpcbi.wtime=0; total-; jobpcbi.wtime=jobtab jobpcbi.id .idxIndex.time; (*total)+; /保存结果 void save () FILE *fp; int i; fp=fopen(pcbtable.txt,a); fprintf(fp, 文件名 作业编号 执行到指令数
24、 所处状态 等待时间 n ); for(i=0;i=0) cmd=jobtab jobpcbpcbnum.id .idx Index .name; switch(cmd) case c: insertqueue(&Queue1,pcbnum); jobpcbpcbnum.status=r; break; case i: insertqueue(& Queue2,pcbnum);jobpcbpcbnum.status=i; break; case o: insertqueue(& Queue3,pcbnum);jobpcbpcbnum.status=o; break; case w: inser
25、tqueue(& Queue4,pcbnum);jobpcbpcbnum.status=w; break; case h: jobpcbpcbnum.status=h; num=jobpcbpcbnum.id;jobtabnum.pcbnum=-1;jobpcbpcbnum.id=-1; if(cmd= h) jobpcbpcbnum.wtime=0; printf( ntt作业 %d 完成n, pcbnum+1, jobpcb pcbnum.status); (*total)-; else jobpcbpcbnum.wtime=jobtab jobpcbpcbnum.id .idxIndex
26、.time; printf( ntt作业 %d n , pcbnum+1); printf(tttt所处状态 : %c n,jobpcb pcbnum.status); printf(tt还需要时间 %d 秒n,jobpcb pcbnum.wtime); /得到队列的首元素 int GetHead(struct Qnode l) return l.pcbnuml.head; /执行 void Run () int i, flag=0, time=10, pcbnum, Index=0, exenum, num, quenum; char cmd; int j,m,n; int total=0;
27、 JobEnQueueInit( &total ); save(); while( total!=0 ) if(!EmptyQueue( Queue1) ) outqueue(&Queue1,&pcbnum); insertqueue(&Queue0, pcbnum); else pcbnum=GetHead(Queue0); delay(); jobpcb pcbnum.status=e; printf( ntt作业 %d n,pcbnum+1); printf( ttt所处状态: %c t执行了 %d 秒n, jobpcb pcbnum.status, time); for(i=0;i=0
28、) /所有的作业除在就绪队列获执行结束的外等待时间 都减去时间片 if( jobpcbi.status!=r&jobpcbi.status!=h) jobpcbi.wtime=jobpcbi.wtime-time; if(jobpcbi.wtime=0) /查找所有的队列 所在位置 for(j=0;j5;j+) for(m=Queuej.head;mQueuej.tail;m+) if(Queuej.pcbnumm=i) flag=1;break; if(flag=1) break; if(flag=1)/删除该指令 for(n=m;n0) insertqueue(&Queue1, pcbnu
29、m); jobpcbpcbnum.status=r; printf( nntt 还有t %d 个作业没有完成 n,total ); save(); /初始化 void InitFile() int i; GroupFile0=fopen(p1.prc,r); GroupFile1=fopen(p2.prc,r); GroupFile2=fopen(p3.prc,r); fgets(jobp0,255,GroupFile0); fgets(jobp1,255,GroupFile1); fgets(jobp2,255,GroupFile2);for(i=0;i100;i+) jobpcbi.exetoIndex=0; strcpy(jobpcbi.filename, nothing); jobpcbi.id=-1; jobpcbi.status=r; jobpcbi.wtime=0; for(i=0;i100;i+) jobtabi.pcbnum=-1; for(i=0;i5;i+) initqueue(&Queuei); int main() char start; printf(欢迎界面); start=getch(); if(start!=NUL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国老年人口失能状况及变化分析
- 人脸识别的智能防疫系统设计
- 会计职业生涯规划
- Unit3 Listening 说课稿2024-2025学年外研版七年级英语上册
- 山东省聊城市阳谷县四校2024-2025学年七年级上学期1月期末水平调研道德与法治试题(含答案)
- 二零二五年度城市停车场施工廉政管理服务合同3篇
- 贵州商学院《软装设计》2023-2024学年第一学期期末试卷
- 信息技术《使用扫描仪》说课稿
- 2025版家庭亲子教育图书订阅服务合同范本3篇
- 二零二五年度家族企业股东股权继承转让协议3篇
- 安全经理述职报告
- 福建省泉州市2023-2024学年高一上学期期末质检英语试题 附答案
- 建筑项目经理招聘面试题与参考回答(某大型集团公司)2024年
- 安保服务评分标准
- (高清版)DB34∕T 1337-2020 棉田全程安全除草技术规程
- 部编版小学语文二年级上册单元测试卷含答案(全册)
- 护理部年终总结
- 部编版三年级上册语文语文期末质量监测(含答题卡)
- KISSSOFT操作与齿轮设计培训教程
- 2024年第二季度粤港澳大湾区经济分析报告-PHBS
- 消防安全制度完整版
评论
0/150
提交评论