




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成绩佥陂科扶學院课程设计报告题目进程调度程序设计课 程名称操作系统课程设计院 部名称 计算机工程学院专业计算机科学与技术班级 13 计算机科学与技术(单)(1)学生姓名周敏健学号 1305201013课程设计地点A104课程设计学时20学时指导教师何健金陵科技学院教务处制摘要 3一、课程设计的目的和要求 4二、系统需求分析 4三、总体设计 5四、详细设计 6五、测试、调试过程 9六、结论与体会 11七、参考文献 12附录:源程序 12课程设计课题进程调度程序设计摘要在多道系统中,对批处理作业需要进行作业调度。作业调度是在资源满足的条件下,将处于就绪状态的作业调入内存, 同时生成与作业相对应的进
2、程,并未这些进程提供所需要的资源。进程调度需要根据进程控制块(PCB中的信息,检查系统是否满足进程的资源需求。只有在满足进程的资源需求的情况下,系统才能进行进程调度。下面是几种常见的作业调度算法:先来先服务(FCFS、优先算法、轮换算法、短作业优先算法以及最高响应比优先法等, 本文将对前两种 算法进行详细的介绍。关键词:进程调度,优先级,FCFS PCB作业,资源、课程设计的目的和要求1、目的进程调度是处理机管理的核心内容。本设计要求用C语言编写和调试一个简单的进程调度程序。通过设计本可以加深理解有关进程控制块、进程队列的概念, 并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高
3、的进程)和先来先服务算法的具体实施办法。2、要求1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的 进程)和先来先服务算法。2) 每个进程有一个进程控制块 (PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。3) 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。4) 每个进程的状态可以是就绪W( Wait)、运行R( Run)、或完成F ( Finish)三种状 态之一。5) 就绪进程获得 CPU后都只能运行一个时间
4、片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减 1 (即降低一级),然后把它插入就绪队列等待 CPU。6) 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便 进行检查。7)重复以上过程,直到所要进程都完成为止。二、系统需求分析编写一个模拟进程调度的程序,将每个进程抽象成一个进程控制块PCB PCB用一个结构体描述。采用两种不同的调度算法来实现功能,主要有如下几大功能模块组成。(1)创建优
5、先数PCB模块用循环来实现对每个进程的进程名、 进程优先数(随机分配)以及所需时间 的录入。将进程队列存放到就绪队列等待执行。(2)优先数调度算法模块从优先级最高(就绪队列的第一个进程)的开始执行,每执行一次优先数减 1,并重新放入就绪队列进行排序,对排序完的继续运行直到所有进程都结束。(3)FCFS创建 PCB模块对N个进程的信息进行输入:进程名、到达时间、需要时间等。每输入一个 进程,按进程的到达时间进行排序,记下前驱和后继的方法。(4)FCFS调度算法模块当系统时间与第一个进程到达时间一致时,将进程状态置为Run,直到这个进程执行完,再判断下个进程的到达时间,若系统时间大于下个进程的到达
6、时间, 即上个进程的结束时间就是下个进程的开始时间,反之就等待系统时间。进程结束后放入完成队列。(5)主函数及菜单显示由主菜单进入显示界面,进行算法选择。三、总体设计进程是程序在处理机上的执行过程。进程存在的标识是进程控制块(PCB,所谓系统创建一个进程,就是由系统为某个程序设置一个PCB用于对该进程进行控制和管理。进程任务完成,由系统收回其PCB该进程便消亡。每个进程可有三个状态:运行状态、就绪状态和完成状态。因此设计三个链队列,finish为完成队列的头指针,wait为就绪队列的头指针。因为每一时刻,CPU只能运行 一个进程,所以运行队列只有一个run指针指向当前运行的进程。考虑到处理的
7、方便,将它们设为全局变量。总体结构框架图:开始界面优先数算法FCFS算法四、详细设计(1)优先数调度算法优先调度算法要为每一个进程设一个优先数, 它总是把处理机给就绪队列中 具有最高优先权的进程。常用的算法有静态优先权法和动态优先权法。本程序采 用了动态优先权法,使进程的优先权随时间而改变。 初始的进程优先数取决于进 程运行所需的时间,时间大,则优先数低,所以采取了将进程优先数定位最大的 那个进程,随着进程的运行优先数进行调整, 每次运行时都是从就绪队列中选取 优先数最大的进程运行,所以将就绪队列按照优先数的大小从高到低排序,这样, 每次取队头进程即可。(2)先来先服务调度算法先来先服务调度算
8、法是按照进程进入就绪队列的先后顺序调度并分配处理机执行。先来先服务算法是一种不可抢占的算法,先进入就绪队列的进程, 先被 处理机运行,一旦一个进程占有了处理机, 它就一直运行下去,直到该进程完成 工作或者因为等待某种事件而不能继续运行时才释放处理机。五、测试、调试过程界面B隹ES穀“璽:b嚳:c间 择入入翕入爲入富 TI蓿请进所境所尊所3 4 B a- TJ 优先数算法输入st进程占用CPU时间需要的时间优先级数状态b0315Uc0415Ua057W寻字进程占用CPU时间需要的时间优救数狀态仁Q415Rb1 214U057U字进程占用CPU时间需要的时间优先级数状态C1314Rh1 214Ua
9、05?W字进程占用CPU时间需要的时间优先级数状态h1 214R:2 213Ua057UT字进程占用CPU时间需要的时间优先级数状态h2 113R2 213Wa057U优先数算法输出t 4Hr.- Z来目i聲诜达霉达毒达霞达要 疔童到示探到耒琵到更挺到需FCFS算法输入先来先服务篇袪结果输岀名字名字到达时间245到达时间24到达时间24到达时间45开始时间U00齐始时间2000开始时间200B开始时间7S0服务时间324服务时间服务时间服务时间3240 0010元成时间70&0完成时间状态UUW状态RWUU状态FWWRUUFFCFS算法输出遇到的问题:在设计程序时,在算法上面出现了一些错误,优
10、先数不是由大到小排序,而 是应该这样理解,当进程执行一个时间片时,优先数减一(使用CPU勺时间变少, 反而优先级高),因此,优先级高的优先数应该是比较小的,而不是优先数大的 优先级大。在程序调试时,链表发生了错误,该内存不可写或者就是程序直接结 束,但最终结果不是我想要的,经过一番折腾,最后发现,头指针和头结点混淆, 有些地方没有给指针分配内存,语句的先后顺序不正确,以及没有考虑到链表最 后没有设置结束标志。六、结论与体会做这个程序我断断续续的算下来应该总共用了 2天,主要是花时间在观察 别人的算法读别人的程序,然后才开始写自己的程序,期间参考了前人的程序并 进行了改善和加工,这让我对进程调度
11、的理解再次加深了, 这是在平常学习的基 础上,与程序相结合的过程,让我再次感受到编程给我们带来的无穷魅力, 只要 自己有兴趣,其实编程也是一件有趣的事, 为了达到一定的要求,我们必须多次 尝试用不同的方法去实现它,比如,进程调度有先来先服务算法,对于这个算法, 可以用数组实现,也可以用链表实现, 但是到底哪个更好哪个更灵活呢, 相信学过C语言的人都知道肯定是用链表实现最好了。这次设计还是有一些不足之处的,比如在算法和运行效率上还是有些欠缺的,需要进一步去改善程序代码,提高效率,减少冗余和错误,让使用者更清晰的观察和理解进程调度。七、参考文献1 任爱华、罗晓峰操作系统实用教程(第三版)M.北京:
12、清华大学出版社,20092 谌卫军、王浩娟操作系统M.北京:清华大学出版社,2012.53 (日)前桥和弥(Maebasi Kazuya).征服C指针M.吴雅明译北京:人民邮电出版社,2013.2附录:源程序#in clude#in clude#in clude#i nclude#in cludetypedef struct nodechar n ame10;/进程名in t prio;进程优先数int cputime;/进程占用CPU时间int n eedtime;/进程到完成还要的时间int arrivetime;/进程到达时间int starttime;/进程开始时间int fini s
13、htime;/进程完成时间int servicetime;进程服务时间char state;/进程的状态struct node *n ext;PCB;PCB *fini sh,*ready,*ru n;队列指针int N;/进程量void firsti n()run=ready;/就绪队列头指针赋值给运行头指针run-state=R:进程状态变为运行态ready=ready- next;/就绪对列头指针后移到下一进程void prt1(char a)switch(a)case 1:/*优先数法*/printf(”名字t进程占用CPU时间t需要的时间t优先级数t状态n”);break;case
14、2:/*先来先服务算法*/printf(名字t到达时间t开始时间t服务时间t完成时间t状态n);break; default:break;void prt2(char a,PCB *q)switch(a)case 1:prin tf(%st%dtt%dtt%dtt%c n,q- name,q-cputime,q- needtime,q-prio,q-state); break;case 2:prin tf(%st%dtt%dtt%dtt%dtt%c n,q- name,q-arrivetime,q-starttime,q-servicetim e,q-fi ni shtime,q-state)
15、;break;default:break;void prt(char algo)PCB *p;prt1(algo);/输出文字格式if(run!=NULL)/如果运行指针不空prt2(algo,run); /输出当前正在运行的PCBp=ready; /输出就绪队列PCBwhile(p!=NULL)prt2(algo,p);p=p-n ext;p=fi nish;输出完成队列的PCBwhile(p!=NULL)prt2(algo,p);p=p-n ext;getchar(); /压任意键继续void in sert1(PCB *q)PCB *p1,*s,*r;int b;s=q; 待插入的PCB
16、指针p仁ready; II就绪队列头指针r=p1; II做pl的前驱指针b=1;while(p1!=NULL)&b)根据优先数确定插入位置if(p1_prio=s_prio)r=p1;p1=p1- n ext;elseb=0;if(r!=p1)如果条件成立说明插入在r与p1之间r-n ext=s;s-n ext=p1;elses- next=p1; 否则插入在就绪队列的头 ready=s;void in sert2(PCB *q)PCB *p1,*s,*r;int b;s=q; /指针s指向新要插入的进程p仁ready; /指针p1指向原来的进程的对首r=p1;/使用指针r指向p1前面的进程b
17、=1;while(p1!=NULL) &b)if(p1-arrivetimearrivetime)r=p1;p1=p1- n ext;elseb=0;if(r!=p1)r-n ext=s;s-n ext=p1;elses-n ext=p1; ready=s;void create1(char alg)PCB *p;int i,time;char na10;ready=NULL; /就绪队列头指针fin ish=NULL;完成队列头指针run=NULL; /运行队列头指针输入N个进程名和所需时间创建PCBfor(i=1;in ame ,n a);p-cputime=0;p-n eedtime=t
18、ime;p-state=W;p-prio=rand()%15+1; / 随机分配优先数1,15 if(ready!=NULL) /就绪队列不空则调用插入函数插入in sert1(p); /对新进程插入就绪队列elsep- next=ready; /创建就绪队列的第一个PCBready=p;system(cls);prin tf(优先数算法结果输出n);printf(”n);prt(alg); /输出进程PCB信息run=ready; /将就绪队列的第一个进程投入运行ready=ready-n ext;run-state=R:void create2(char alg)PCB *p;int i;
19、ready=NULL;run=NULL;fin ish=NULL;for(i=0;in ame); printf(到达时间:);sca nf(%d,&p-arrivetime);printf(需要时间:);sca nf(%d,&p-servicetime);p-starttime=0;p-fi ni shtime=0;p-state=W;if(ready!=NULL)in sert2(p);将新进程插入就绪队列elsep-next=ready;创建就绪队列的第一个 ready=p;system(cls);prin tf(先来先服务算法结果输出n);printf(n);prt(alg);void
20、 priority(char alg)while(ru n!=NULL)/当运行队列不空时,有进程正在运行run-cputime=r un-cputime+1;run-n eedtime=r un-n eedtime-1;run-prio=run-prio-1; / 每运行一次优先数-1if(run-prioprio=0;if(run- needtime=O)/如果所需时间为0,即完成,将其插入完成队列run-n ext=fi ni sh;fini sh=r un;run-state=F:/置状态为完成态run=NULL;运行队列头指针为空if(ready!=NULL) /如果就绪队列不空fi
21、rstin(); /将就绪对列的第一个进程投入运行else 没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列 if(ready!=NULL )&(run-prioprio)run-state=W;状态改为就绪in sert1(ru n);将进程按优先数大小插入firstin(); /将就绪队列的第一个进程投入运行prt(alg); /输出进程PCB信息void FCFS(char alg) int time=0;/系统时间从0开始dorun=ready;就绪序列的第一个进程放入run队列进行执行run-state=R:进程开始执行 ready=ready-n ext;/ 指向下一个
22、 time=r un-arrivetimetime? run-arrivetime:time;run-starttime=time; 进程开始 prt(alg);/显示正在执行的进程 time=time+run-servicetime;/计算下个进程最小可开始时间 run-finishtime=time;/ 进程结束时间 run-state=F;结束状态标识 prt(alg);/进程结束再显示 run-n ext=fi ni sh;finish=run;进程结束放入结束队列run=NULL;while(ready!=NULL);/*菜单显示函数*/void Menu()system(cls);prin tf(tt+ +n);prin tf(tt|进程调度算法| n ”);prin tf(tt| | n);prin tf(tt|n);pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能制造风险防控措施
- 精美护士护理
- 2025英语高考作文命题范文
- 2026届山西省怀仁市重点中学高一化学第一学期期中统考试题含解析
- 劳动模范表彰激励机制学习心得体会
- 感染风险防控-洞察及研究
- 品牌农产品的质量控制体系-洞察及研究
- 麻醉与神经发育-洞察及研究
- 小学四年级上册书法课堂练习计划
- 语文统编教材教学资源开发心得体会
- 5.2.1分析人类活动对生态环境的影响课件-人教版生物八年级上册1
- 2025年建筑师考试答案-建筑师考试答案解析
- 新疆的历史文化课件
- 安全生产网格化管理工作实施方案
- 代理记账风险管理制度
- DBJ04-T487-2025 高大模板支撑体系监测技术标准
- T/CGAS 026.1-2023瓶装液化石油气管理规范第1部分:安全管理
- PEP人教版六年级上册英语课后辅导计划
- 餐饮劳务合同协议书样本
- 中医护理灸疗技术操作规范:督灸
- 泌尿外科手术分级管理制度
评论
0/150
提交评论