ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:189.79KB ,
资源ID:24893147      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24893147.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(进程调度程序设计报告源代码资料.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

进程调度程序设计报告源代码资料.docx

1、进程调度程序设计报告源代码资料成绩 课程设计报告 题 目 进程调度程序设计 课 程 名 称 操作系统课程设计 院 部 名 称 计算机工程学院 专 业 计算机科学与技术 班 级 13计算机科学与技术(单)(1) 学 生 姓 名 周敏健 学 号 1305201013 课程设计地点 A104 课程设计学时 20学时 指 导 教 师 何 健 金陵科技学院教务处制课程设计课题进程调度程序设计摘 要在多道系统中,对批处理作业需要进行作业调度。作业调度是在资源满足的条件下,将处于就绪状态的作业调入内存,同时生成与作业相对应的进程,并未这些进程提供所需要的资源。进程调度需要根据进程控制块(PCB)中的信息,检

2、查系统是否满足进程的资源需求。只有在满足进程的资源需求的情况下,系统才能进行进程调度。下面是几种常见的作业调度算法:先来先服务(FCFS)、优先算法、轮换算法、短作业优先算法以及最高响应比优先法等,本文将对前两种算法进行详细的介绍。关键词:进程调度,优先级,FCFS,PCB,作业,资源一、课程设计的目的和要求1、目的进程调度是处理机管理的核心内容。本设计要求用C语言编写和调试一个简单的进程调度程序。通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。2、要求1)进程调度算法:采用最高优先数

3、优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 2)每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 4)每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 5)就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用 CPU时间已达到所需

4、要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 7)重复以上过程,直到所要进程都完成为止。二、系统需求分析 编写一个模拟进程调度的程序,将每个进程抽象成一个进程控制块PCB,PCB用一个结构体描述。采用两种不同的调度算法来实现功能,主要有如下几大功能模块组成。(1)创建优先数PCB模块 用循环来实现对每个进程的进程名、进程优先数(随机分配)以及所需时间的录入。

5、将进程队列存放到就绪队列等待执行。(2)优先数调度算法模块 从优先级最高(就绪队列的第一个进程)的开始执行,每执行一次优先数减1,并重新放入就绪队列进行排序,对排序完的继续运行直到所有进程都结束。(3)FCFS创建PCB模块 对N个进程的信息进行输入:进程名、到达时间、需要时间等。每输入一个进程,按进程的到达时间进行排序,记下前驱和后继的方法。(4)FCFS调度算法模块 当系统时间与第一个进程到达时间一致时,将进程状态置为Run,直到这个进程执行完,再判断下个进程的到达时间,若系统时间大于下个进程的到达时间,即上个进程的结束时间就是下个进程的开始时间,反之就等待系统时间。进程结束后放入完成队列

6、。(5)主函数及菜单显示 由主菜单进入显示界面,进行算法选择。三、总体设计进程是程序在处理机上的执行过程。进程存在的标识是进程控制块(PCB),所谓系统创建一个进程,就是由系统为某个程序设置一个PCB,用于对该进程进行控制和管理。进程任务完成,由系统收回其PCB,该进程便消亡。每个进程可有三个状态:运行状态、就绪状态和完成状态。因此设计三个链队列,finish为完成队列的头指针,wait为就绪队列的头指针。因为每一时刻,CPU只能运行一个进程,所以运行队列只有一个run指针指向当前运行的进程。考虑到处理的方便,将它们设为全局变量。总体结构框架图:四、详细设计(1)优先数调度算法优先调度算法要为

7、每一个进程设一个优先数,它总是把处理机给就绪队列中具有最高优先权的进程。常用的算法有静态优先权法和动态优先权法。本程序采用了动态优先权法,使进程的优先权随时间而改变。初始的进程优先数取决于进程运行所需的时间,时间大,则优先数低,所以采取了将进程优先数定位最大的那个进程,随着进程的运行优先数进行调整,每次运行时都是从就绪队列中选取优先数最大的进程运行,所以将就绪队列按照优先数的大小从高到低排序,这样,每次取队头进程即可。(2)先来先服务调度算法先来先服务调度算法是按照进程进入就绪队列的先后顺序调度并分配处理机执行。先来先服务算法是一种不可抢占的算法,先进入就绪队列的进程,先被处理机运行,一旦一个

8、进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某种事件而不能继续运行时才释放处理机。 五、测试、调试过程界面优先数算法输入优先数算法输出FCFS算法输入FCFS算法输出遇到的问题:在设计程序时,在算法上面出现了一些错误,优先数不是由大到小排序,而是应该这样理解,当进程执行一个时间片时,优先数减一(使用CPU的时间变少,反而优先级高),因此,优先级高的优先数应该是比较小的,而不是优先数大的优先级大。在程序调试时,链表发生了错误,该内存不可写或者就是程序直接结束,但最终结果不是我想要的,经过一番折腾,最后发现,头指针和头结点混淆,有些地方没有给指针分配内存,语句的先后顺序不正确

9、,以及没有考虑到链表最后没有设置结束标志。六、结论与体会 做这个程序我断断续续的算下来应该总共用了2天,主要是花时间在观察别人的算法读别人的程序,然后才开始写自己的程序,期间参考了前人的程序并进行了改善和加工,这让我对进程调度的理解再次加深了,这是在平常学习的基础上,与程序相结合的过程,让我再次感受到编程给我们带来的无穷魅力,只要自己有兴趣,其实编程也是一件有趣的事,为了达到一定的要求,我们必须多次尝试用不同的方法去实现它,比如,进程调度有先来先服务算法,对于这个算法,可以用数组实现,也可以用链表实现,但是到底哪个更好哪个更灵活呢,相信学过C语言的人都知道肯定是用链表实现最好了。这次设计还是有

10、一些不足之处的,比如在算法和运行效率上还是有些欠缺的,需要进一步去改善程序代码,提高效率,减少冗余和错误,让使用者更清晰的观察和理解进程调度。七、参考文献 1任爱华、罗晓峰. 操作系统实用教程(第三版)M.北京:清华大学出版社,20092谌卫军、王浩娟. 操作系统M. 北京:清华大学出版社,2012.53(日)前桥和弥(Maebasi Kazuya). 征服C指针M. 吴雅明译. 北京:人民邮电出版社,2013.2附录:源程序#include #include #include #include#includetypedef struct node char name10; /进程名 int

11、prio; /进程优先数 int cputime; /进程占用CPU时间 int needtime; /进程到完成还要的时间 int arrivetime; /进程到达时间 int starttime; /进程开始时间 int finishtime; /进程完成时间 int servicetime; /进程服务时间 char state; /进程的状态 struct node *next; PCB; PCB *finish,*ready,*run; /队列指针int N; /进程量void firstin() run=ready; /就绪队列头指针赋值给运行头指针 run-state=R; /

12、进程状态变为运行态 ready=ready-next; /就绪对列头指针后移到下一进程 void prt1(char a) switch(a) case 1: /*优先数法*/ printf(名字t进程占用CPU时间t需要的时间t优先级数t状态n);break; case 2: /*先来先服务算法*/ printf(名字t到达时间t开始时间t服务时间t完成时间t状态n);break; default:break; void prt2(char a,PCB *q) switch(a) case 1: printf(%st%dtt%dtt%dtt%cn,q-name,q-cputime,q-nee

13、dtime,q-prio,q-state); break; case 2: printf(%st%dtt%dtt%dtt%dtt%cn,q-name,q-arrivetime,q-starttime,q-servicetime,q-finishtime,q-state); break; default:break; void prt(char algo) PCB *p; prt1(algo); /输出文字格式 if(run!=NULL) /如果运行指针不空 prt2(algo,run); /输出当前正在运行的PCB p=ready; /输出就绪队列PCB while(p!=NULL) prt2

14、(algo,p); p=p-next; p=finish; /输出完成队列的PCB while(p!=NULL) prt2(algo,p); p=p-next; getchar(); /压任意键继续 void insert1(PCB *q) PCB *p1,*s,*r; int b; s=q; /待插入的PCB指针 p1=ready; /就绪队列头指针 r=p1; /做p1的前驱指针 b=1; while(p1!=NULL)&b) /根据优先数确定插入位置 if(p1-prio=s-prio) r=p1; p1=p1-next; else b=0; if(r!=p1) /如果条件成立说明插入在

15、r与p1之间 r-next=s; s-next=p1; else s-next=p1; /否则插入在就绪队列的头 ready=s; void insert2(PCB *q) PCB *p1,*s,*r; int b; s=q; /指针s指向新要插入的进程 p1=ready; /指针p1指向原来的进程的对首 r=p1; /使用指针r指向p1前面的进程 b=1; while(p1!=NULL)&b) if(p1-arrivetimearrivetime) r=p1; p1=p1-next; else b=0; if(r!=p1) r-next=s; s-next=p1; else s-next=p

16、1; ready=s; void create1(char alg) PCB *p; int i,time; char na10; ready=NULL; /就绪队列头指针 finish=NULL; /完成队列头指针 run=NULL; /运行队列头指针 /输入N个进程名和所需时间创建PCB for(i=1;iname,na); p-cputime=0; p-needtime=time; p-state=W; p-prio=rand()%15+1; /随机分配优先数1,15 if(ready!=NULL) /就绪队列不空则调用插入函数插入 insert1(p); /对新进程插入就绪队列 els

17、e p-next=ready; /创建就绪队列的第一个PCB ready=p; system(cls); printf( 优先数算法结果输出n); printf(-n); prt(alg); /输出进程PCB信息 run=ready; /将就绪队列的第一个进程投入运行 ready=ready-next; run-state=R; void create2(char alg) PCB *p; int i; ready=NULL; run=NULL; finish=NULL; for(i=0;iname); printf(到达时间:); scanf(%d,&p-arrivetime); print

18、f(需要时间:); scanf(%d,&p-servicetime); p-starttime=0; p-finishtime=0; p-state=W; if(ready!=NULL) insert2(p);/将新进程插入就绪队列 else p-next=ready;/创建就绪队列的第一个 ready=p; system(cls); printf( 先来先服务算法结果输出n); printf(-n); prt(alg);void priority(char alg) while(run!=NULL) /当运行队列不空时,有进程正在运行 run-cputime=run-cputime+1; r

19、un-needtime=run-needtime-1; run-prio=run-prio-1; /每运行一次优先数-1 if(run-prioprio=0; if(run-needtime=0) /如果所需时间为0,即完成,将其插入完成队列 run-next=finish; finish=run; run-state=F; /置状态为完成态 run=NULL; /运行队列头指针为空 if(ready!=NULL) /如果就绪队列不空 firstin(); /将就绪对列的第一个进程投入运行 else /没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列 if(ready!=NULL)

20、&(run-prioprio) run-state=W; /状态改为就绪 insert1(run); /将进程按优先数大小插入 firstin(); /将就绪队列的第一个进程投入运行 prt(alg); /输出进程PCB信息 void FCFS(char alg) int time=0;/系统时间从0开始 do run=ready;/就绪序列的第一个进程放入run队列进行执行 run-state=R;/进程开始执行 ready=ready-next;/指向下一个 time=run-arrivetimetime? run-arrivetime:time; run-starttime=time;/

21、进程开始 prt(alg);/显示正在执行的进程 time=time+run-servicetime;/计算下个进程最小可开始时间 run-finishtime=time;/进程结束时间 run-state=F;/结束状态标识 prt(alg);/进程结束再显示 run-next=finish; finish=run;/进程结束放入结束队列 run=NULL; while(ready!=NULL);/*菜单显示函数*/void Menu() system(cls); printf(tt+n); printf(tt| 进程调度算法 | n); printf(tt| n); printf(tt|

22、| n); printf(tt| 1优先数算法 | n); printf(tt| | n); printf(tt| 2先来先服务算法 | n); printf(tt| | n); printf(tt| 3退出系统 | n); printf(tt| | n); printf(tt| n); printf(tt| By:周敏健 | n); printf(tt+n); printf(tt请输入编号:); int main() char algo; /接收算法编号 char mainmenu;/判断是否继续 srand(unsigned)time(NULL); system(cls);/清屏 do M

23、enu();/显示菜单 scanf(%d,&algo); /输入算法编号 switch(algo) case 1: system(cls); printf(您选择的是优先数算法n); printf(请输入进程数目:); scanf(%d,&N); /输入进程数 create1(algo); /创建队列 priority(algo);/优先数 break; case 2: system(cls); printf(您选择的是先来先服务算法n); printf(请输入进程数目:); scanf(%d,&N); /输入进程个数 create2(algo);/创建队列 FCFS(algo);/先来先服务 break; case 3: printf(tt再见! n); exit(0); break; default: printf(输入有误n); break; printf(n是否继续操作(Y/N) ); fflush(stdin); mainmenu=getchar(); while(mainmenu=y|mainmenu=Y); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1