进程调度程序设计报告(源代码)_第1页
进程调度程序设计报告(源代码)_第2页
进程调度程序设计报告(源代码)_第3页
进程调度程序设计报告(源代码)_第4页
进程调度程序设计报告(源代码)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

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)就

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

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

6、程的到达时间,若系统时间大于下个进程的到达时间,即上个进程的结束时间就是下个进程的开始时间,反之就等待系统时间。进程结束后放入完成队列。(5) 主函数及菜单显示 由主菜单进入显示界面,进行算法选择。三、总体设计进程是程序在处理机上的执行过程。进程存在的标识是进程控制块(PCB),所谓系统创建一个进程,就是由系统为某个程序设置一个PCB,用于对该进程进行控制和管理。进程任务完成,由系统收回其PCB,该进程便消亡。每个进程可有三个状态:运行状态、就绪状态和完成状态。因此设计三个链队列,finish为完成队列的头指针,wait为就绪队列的头指针。因为每一时刻,CPU只能运行一个进程,所以运行队列只有

7、一个run指针指向当前运行的进程。考虑到处理的方便,将它们设为全局变量。总体结构框架图:优先数算法界面FCFS算法开始四、详细设计(1)优先数调度算法优先调度算法要为每一个进程设一个优先数,它总是把处理机给就绪队列中具有最高优先权的进程。常用的算法有静态优先权法和动态优先权法。本程序采用了动态优先权法,使进程的优先权随时间而改变。初始的进程优先数取决于进程运行所需的时间,时间大,则优先数低,所以采取了将进程优先数定位最大的那个进程,随着进程的运行优先数进行调整,每次运行时都是从就绪队列中选取优先数最大的进程运行,所以将就绪队列按照优先数的大小从高到低排序,这样,每次取队头进程即可。优先数调度算

8、法输入进程信息将进程放入ready队列进程按优先数大小排序取ready队列首进程送入run执行一个时间片,优先数-1,运行时间+1是否还需输入进程YN输入时进程是否完成N执行队列时放入完成队列Y(2)先来先服务调度算法先来先服务调度算法是按照进程进入就绪队列的先后顺序调度并分配处理机执行。先来先服务算法是一种不可抢占的算法,先进入就绪队列的进程,先被处理机运行,一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某种事件而不能继续运行时才释放处理机。FCFS调度算法输入进程信息将进程放入ready队列进程按到达先后顺序排序取ready队列首进程送入run执行一个时间片,运

9、行时间+1是否还需输入进程YN输入时进程是否完成N执行队列时放入完成队列Y 五、测试、调试过程界面优先数算法输入优先数算法输出FCFS算法输入FCFS算法输出遇到的问题:在设计程序时,在算法上面出现了一些错误,优先数不是由大到小排序,而是应该这样理解,当进程执行一个时间片时,优先数减一(使用CPU的时间变少,反而优先级高),因此,优先级高的优先数应该是比较小的,而不是优先数大的优先级大。在程序调试时,链表发生了错误,该内存不可写或者就是程序直接结束,但最终结果不是我想要的,经过一番折腾,最后发现,头指针和头结点混淆,有些地方没有给指针分配内存,语句的先后顺序不正确,以及没有考虑到链表最后没有设

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

11、行效率上还是有些欠缺的,需要进一步去改善程序代码,提高效率,减少冗余和错误,让使用者更清晰的观察和理解进程调度。七、参考文献1任爱华、罗晓峰. 操作系统实用教程(第三版)M.北京:清华大学出版社,20092谌卫军、王浩娟. 操作系统M. 北京:清华大学出版社,2012.53(日)前桥和弥(Maebasi Kazuya). 征服C指针M. 吴雅明译. 北京:人民邮电出版社,2013.2附录:源程序#include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h>#i

12、nclude<time.h>typedef struct node char name10; /进程名 int 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; /进程量v

13、oid firstin() 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 2: /*先来先服务算法*/printf("名字t到达时间t开始时间t服务时间t完成时间t状态n");break;default:break;

14、 void prt2(char a,PCB *q) switch(a)case 1: printf("%st%dtt%dtt%dtt%cn",q->name,q->cputime,q->needtime,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;d

15、efault: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->next; p=finish; /输出完成队列的PCB while(p!=NULL) prt2(algo,p); p=p->next; getchar(); /压任意键继续 void insert1(PCB *q) PCB *p1,*s,*r; int

16、 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) /如果条件成立说明插入在r与p1之间 r->next=s; s->next=p1; else s->next=p1; /否则插入在就绪队列的头ready=s; void insert2(PCB *q)PCB *p1,*s,*r;int

17、 b;s=q; /指针s指向新要插入的进程p1=ready; /指针p1指向原来的进程的对首r=p1; /使用指针r指向p1前面的进程b=1;while(p1!=NULL)&&b)if(p1->arrivetime<s->arrivetime)r=p1; p1=p1->next;elseb=0;if(r!=p1)r->next=s;s->next=p1;elses->next=p1;ready=s; void create1(char alg) PCB *p; int i,time; char na10; ready=NULL; /就绪

18、队列头指针 finish=NULL; /完成队列头指针 run=NULL; /运行队列头指针 /输入N个进程名和所需时间创建PCBfor(i=1;i<=N;i+) printf("请输入第%d个进程的名字和运行时间n进程名:",i);p=(PCB *)malloc(sizeof(PCB); scanf("%s",na); printf("所需时间:");scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=t

19、ime; p->state='W' p->prio=rand()%15+1; /随机分配优先数1,15if(ready!=NULL) /就绪队列不空则调用插入函数插入 insert1(p); /对新进程插入就绪队列else p->next=ready; /创建就绪队列的第一个PCB ready=p; system("cls");printf(" 优先数算法结果输出n"); printf("-n");prt(alg); /输出进程PCB信息 run=ready; /将就绪队列的第一个进程投入运行 rea

20、dy=ready->next; run->state='R' void create2(char alg)PCB *p;int i; ready=NULL;run=NULL;finish=NULL;for(i=0;i<N;i+) p=(PCB *)malloc(sizeof(PCB);printf("进程名:");scanf("%s",p->name);printf("到达时间:");scanf("%d",&p->arrivetime);printf("

21、;需要时间:");scanf("%d",&p->servicetime); p->starttime=0; p->finishtime=0;p->state='W'if(ready!=NULL)insert2(p);/将新进程插入就绪队列elsep->next=ready;/创建就绪队列的第一个ready=p;system("cls");printf(" 先来先服务算法结果输出n");printf("-n");prt(alg);void priorit

22、y(char alg) while(run!=NULL) /当运行队列不空时,有进程正在运行 run->cputime=run->cputime+1; run->needtime=run->needtime-1; run->prio=run->prio-1; /每运行一次优先数-1 if(run->prio<0) /如果优先数减到小于0,则转换成0run->prio=0;if(run->needtime=0) /如果所需时间为0,即完成,将其插入完成队列 run->next=finish; finish=run; run->

23、;state='F' /置状态为完成态 run=NULL; /运行队列头指针为空 if(ready!=NULL) /如果就绪队列不空 firstin(); /将就绪对列的第一个进程投入运行 else /没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列if(ready!=NULL)&&(run->prio<ready->prio) run->state='W' /状态改为就绪insert1(run);/将进程按优先数大小插入firstin(); /将就绪队列的第一个进程投入运行 prt(alg); /输出进程PC

24、B信息 void FCFS(char alg) int time=0;/系统时间从0开始dorun=ready;/就绪序列的第一个进程放入run队列进行执行run->state='R'/进程开始执行ready=ready->next;/指向下一个time=run->arrivetime>time? run->arrivetime:time; run->starttime=time;/进程开始prt(alg);/显示正在执行的进程time=time+run->servicetime;/计算下个进程最小可开始时间run->finish

25、time=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| | n");printf("tt| 1优先数算法 | n");printf("tt| | n");printf("tt| 2先来先服务算法 | n");printf("tt| | n");printf("tt| 3退出系统 | n");printf("tt| | n");prin

温馨提示

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

最新文档

评论

0/150

提交评论