静态优先权优先算法的进程调程序_第1页
静态优先权优先算法的进程调程序_第2页
静态优先权优先算法的进程调程序_第3页
静态优先权优先算法的进程调程序_第4页
静态优先权优先算法的进程调程序_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、 静态优先权优先算法的进程调度程序学 院 专 业 学 生 姓 名 学 号 指导教师姓名 21014年 3 月 19 日目 录1.系统需求分析11.1问题描述11.2功能要求12.总体设计12.1总体设计图12.2各模块功能22.3相关数据结构设计33.详细设计33.1采用C语言定义的相关数据类型33.2调度算法的主要实现44.运行结果44.1系统调试44.2功能实现界面55.使用说明76.心得体会87.附录87.1 源代码87.2 参考文献171.系统需求分析1.1问题描述1)设计并实现一个采用静态优先权算法的进程调度演示程序。并且求出每个进程的周转时间以及带权周转时间。2) 静态优先权是在创

2、建进程时确定的,且在进程的整个运行期间保持不变.一般地,优先权是利用某一范围内的一个整数来表示的,例如,07或0255中的某一整数, 又把该整数称为优先数.只是具体用法各异:有的系统用"0"表示最高优先权,当数值愈大时,其优先权愈低;而有的系统恰恰相反.确定进程优先权的依据有如下三个方面:a.进程类型.(系统进程/用户进程)b.进程对资源的需求.(需求量的大小)c.用户要求.(用户进程紧迫程度)3)本程序采用优先级数字大的优先权大。1.2功能要求1)每一个进程有一个PCB,其内容可以根据具体情况设定。2)进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定。3)可

3、读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、进程优先级的初始化。4)可以在运行中显示各进程的状态:就绪、执行 (由于不要求设置互斥资源与进程间的同步关系,故只有两种状态)。5)具有一定的数据容错性。2.总体设计2.1总体设计图系统总体设计如图2.1所示。0、结束1、进程的创建及模拟输入进程数输入优先级输入进入内存时间输入服务时间输出运行结果静态优先权优先算法2、读取文件数据及模拟输出运行结果图2.1 系统总体设计 2.2各模块功能1) void buildProcess():手动创建进程。2) struct PCB * callMemory():将符合条件的进程调入内存。3)

4、 void ListAllPCB(struct PCB *h):打印所有进程到屏幕上。4) void Menu():菜单以及执行。5) void newPCB():创建进程。在1)中被调用。6) void readFromFile():从文件中读取数据。7) void readyList(struct PCB *pcb):就绪列表。8) void release(struct PCB *pcb),void releaseR(struct PCB *pcb):释放进程。9) void run():执行静态优先级进程调度算法。10)struct PCB * runTheProcess():标识要执

5、行的进程。11)void setNewPCB(char *name,int pri,int entime,int sertime):创建进程。在6)中被调用。12) int timeOfData(FILE *f):计算文件中进程数量。在6)中被调用。2.3相关数据结构设计结构体:struct PCB *head,*readyHead;3.详细设计3.1采用C语言定义的相关数据类型struct PCBint ArrivalTime;int ServiceTime;char number10;struct PCB *head,*thisP,*newP;/动态接收进程及详细struct PCB *r

6、eadyHead;/动态存储就绪队列采用结构体数组,创建一个进程,包含进程相关信息:进程名称、进程优先级、进程到达时间、进程服务时间。3.2调度算法的主要实现struct PCB * callMemory()/调入内存,返回调入内存的链表节点。将达到进程进入内存时间的所有进程调入内存。void readyList(struct PCB *pcb)/单链表的形式创建就绪队列。将进入内存的进程调入就绪列表。struct PCB * runTheProcess()/执行的进程,返回要执行进程的节点。将就绪列表中满足运行条件的进程标识下来并返回节点。void run()/静态优先权算法。将执行的程序释

7、放。调入新的满足执行条件的进程。就绪列表释放。4.运行结果4.1系统调试 在程序设计初期。本想采用冒泡排序将进入内存的进程进行优先级排序,不过最后总是排序失败。最后想到我进行的是进程调度模拟,应该就有进程调入内存以及调入CPU,因此之后设计其他函数进行调入内存、CPU的模拟。而且最后选择新建就绪列表,进行选择插入就绪列表中。以及随时使用屏幕打印语句printf来测试程序各个阶段执行状态。4.2功能实现界面(1)主菜单:如图4.1所示。图4.1主菜单(2)进程调度模拟。图4.2创建进程2)图4.3进程运行过程3)进程在调度算法中,计算出的具体的完成时间,周转时间,带权时间。如图4.4所示。图4.

8、4进程运行结果(3)选择2:从文件读取数据。如图4.5。在f:test.txt中,数据如下。/从文件读取数据/*数据格式如下进程名优先级到达时间服务时间proc12110proc22111proc3322*/运行结果。如图4.6图4.6 文件读取数据及运行结果5.使用说明根据屏幕提示输入即可。需要用户注意的是优先级(整数表示)越大优先权越大。6.心得体会本次课程设计,第一天上午去拿课程设计题目采用静态优先权优先算法的进程调度程序,下午开始查找资料并且构思。在网上看到一些课程设计用到的有数据结构体struct,便再度拿出C语言书本以及数据结构课本,主要看了数据结构体和单链表方面的知识。上面也曾说

9、到,程序设计初期打算在单链表中直接使用冒泡排序法进程优先级的排序,总是失败。后来意识到,进程调度不仅要考虑到进程优先级,同时还有进入内存的时间。因为只有到达进入内存的时间,进程才会被调入内存中,进一步通过满足条件被调入CPU中执行,或者说分配CPU进而执行。所以索性模拟出调入内存方法以及调入CPU方法,与此有极大关系的是单链表就绪列表的建立。进行代码编写以及测试,从而模拟进程调度算法完成。7.附录7.1 源代码#include<stdio.h>#include<stdlib.h>#include<string.h>int SequenceNumber=1;/

10、进程编号int ProcessAmount;/进程数量int StartCount=0;/调入内存进程计数struct PCB/进程控制块int No;/进程号char name16;/进程名int enterMemoryTime;/进入内存时间int serviceTime;/服务时间int priority;/优先级struct PCB *next;struct PCB *head,*thisP,*newP;/动态接收进程及详细struct PCB *readyHead;/动态存储就绪队列/函数声明int getch();int timeOfData(FILE *);void ListAl

11、lPCB();void Menu();void printPCB(struct PCB *,int,int,int,double);void printPCBP(struct PCB *);void printField();void printFieldP();void release(struct PCB *);void releaseR(struct PCB *);void setNewPCB(char *,int,int,int);struct PCB * runTheProcess();void newPCB()/建立PCBnewP=(struct PCB *)malloc(size

12、of(struct PCB);if(head=NULL)/判断头节点是否为空head=newP;/为空,头节点指向新开辟的内存elsethisP=head;while(thisP->next!=NULL)thisP=thisP->next;thisP->next=newP;/遍历单链表,找到最后一个元素thisP=newP;thisP->No=SequenceNumber;SequenceNumber+;printf("进程号 %dn",thisP->No);printf("输入进程名:");scanf("%s&q

13、uot;,thisP->name);printf("输入优先级:");scanf("%d",&thisP->priority);printf("输入进入内存时间:");scanf("%d",&thisP->enterMemoryTime);printf("输入服务时间:");scanf("%d",&thisP->serviceTime);thisP->next=NULL;void buildProcess()/创建进程in

14、t i=0;printf("输入进程数量:");scanf("%d",&ProcessAmount);while(i<ProcessAmount)newPCB();i+;void readyList(struct PCB *pcb)/单链表的形式创建就绪队列newP=(struct PCB *)malloc(sizeof(struct PCB);if(readyHead=NULL)readyHead=newP;elsethisP=readyHead;while(thisP->next!=NULL)thisP=thisP->nex

15、t;thisP->next=newP;thisP=newP;strcpy(thisP->name,pcb->name);thisP->No=pcb->No;thisP->priority=pcb->priority;thisP->enterMemoryTime=pcb->enterMemoryTime;thisP->serviceTime=pcb->serviceTime;thisP->next=NULL;struct PCB * callMemory()/调入内存,返回调入内存的链表节点int at;/到达时间struc

16、t PCB *markP;if(head=NULL)printf("程序没有找到。n");elsemarkP=thisP=head;/标记指向头节点at=thisP->enterMemoryTime;/到达时间为头节点到达时间while(thisP->next!=NULL)/当下一节点不为空if(at>thisP->next->enterMemoryTime)/判断当前时间是否大于下一节点时间markP=thisP->next;/是,标记此节点at=markP->enterMemoryTime;/到达时间更改为标记时间thisP=t

17、hisP->next;/向后遍历return markP;void run()/静态优先级算法执行。struct PCB *temp;/临时节点用来存储调入内存节点struct PCB *runPro;/用来接收执行的节点int i;/循环初始条件int at,srt,runtime=0;/到达时间,开始执行时间,运行时间。int turnOverTime;/周转时间double ptot;/带权周转时间if(head=NULL)printf("没有发现进程。n");elsefor(i=0;i<ProcessAmount;i+)/循环进程的数量次while(he

18、ad!=NULL)temp=callMemory();if(i=0)/初始情况下球开始执行时间,完成时间,周转时间,带权周转时间srt=at=temp->enterMemoryTime;runtime=at+temp->serviceTime;turnOverTime=runtime-at;ptot=turnOverTime*1.0/temp->serviceTime;readyList(temp);/初始纳入就绪列表以及后续release(temp);/释放进程while(head!=NULL&&(temp=callMemory()->enterMem

19、oryTime<=runtime)readyList(temp);/循环判断是否纳入就绪列表release(temp);runPro=runTheProcess();if(i>0)/初始之后,计算各时间及周转srt=runtime;runtime+=runPro->serviceTime;turnOverTime=runtime-runPro->enterMemoryTime;ptot=turnOverTime*1.0/runPro->serviceTime;printf("当前执行的进程:n");printField();printPCB(r

20、unPro,srt,runtime,turnOverTime,ptot);releaseR(runPro);printf("n就绪进程列表:n");ListAllPCB(readyHead);printf("n");struct PCB * runTheProcess()/执行的进程,返回要执行进程的节点int time,pri;struct PCB *markThis;/标记要返回的节点if(readyHead=NULL)printf("没有可运行的进程。n");elsemarkThis=thisP=readyHead;time=t

21、hisP->enterMemoryTime;/当前到达时间pri=thisP->priority;/当前进程的优先级while(thisP->next!=NULL)if(time=thisP->next->enterMemoryTime)/判断之后节点的到达时间是否与当前一致if(pri<thisP->next->priority)/一致,则判断优先级决定pri=thisP->next->priority;/更改优先级判断条件为下一优先级markThis=thisP->next;/标记当前节点的下一节点elsebreak;thi

22、sP=thisP->next;return markThis;void release(struct PCB *pcb)/删除原单链表的进程节点struct PCB *markP,*f;markP=head;if(pcb!=NULL)if(pcb=head)f=head;head=head->next;free(f);elsethisP=head->next;while(thisP!=NULL)if(pcb=thisP)f=thisP;markP->next=thisP->next;free(f);break;elsemarkP=thisP;thisP=thisP

23、->next;void releaseR(struct PCB *pcb)/删除就绪列表中进程节点struct PCB *markP,*f;markP=readyHead;if(pcb!=NULL)if(pcb=readyHead)f=readyHead;readyHead=readyHead->next;free(f);elsethisP=readyHead->next;while(thisP!=NULL)if(pcb=thisP)f=thisP;markP->next=thisP->next;free(f);break;elsemarkP=thisP;this

24、P=thisP->next;void ListAllPCB(struct PCB *h)/打印所有进程printFieldP();if(h=NULL)printf("没有进程。n");elsethisP=h;while(thisP!=NULL)printPCBP(thisP);thisP=thisP->next;printf("n按任意键继续.n");getch();printf("nn");void printPCB(struct PCB *pcb,int a,int b,int c,double d)/打印单个数据结果

25、if(pcb!=NULL)printf("%-8s%-8d%-8d%-8d%-8d",pcb->name,pcb->No,pcb->priority,pcb->enterMemoryTime,pcb->serviceTime);printf("%-8d%-8d%-8d%-8.2lfn",a,b,c,d);elseprintf("没有进程。n");void printPCBP(struct PCB *pcb)if(pcb!=NULL)printf("%-8s%-8d%-8d%-8d%-8dn&qu

26、ot;,pcb->name,pcb->No,pcb->priority,pcb->enterMemoryTime,pcb->serviceTime);elseprintf("没有进程。n");void printField()/打印表头,以及周转时间printf("n");printf("进程名t进程号t优先级t到达时t服务时t开始执t完成时t周转时t带权周n");printf("ttt间t间t行时间t间t间t转时间n");void printFieldP()/打印表头,字段print

27、f("n");printf("进程名t进程号t优先级t到达时t服务时n");printf("ttt间t间n");/从文件读取数据/*数据格式如下进程名优先级到达时间服务时间proc12110proc22111proc3322*/void readFromFile()FILE *fp;int times;int i=0;char filePath20,temp8;char name16;int pri,emt,st;printf("输入文件路径:");scanf("%s",filePath);fp

28、=fopen(filePath,"r");times=timeOfData(fp);ProcessAmount=times-2;while(i<times-1)if(i=0)/这是用来接收文本格式第一行的汉字。fscanf(fp,"%s",temp);fscanf(fp,"%s",temp);fscanf(fp,"%s",temp);fscanf(fp,"%s",temp);else/以下用来接收进程数据fscanf(fp,"%s",name);fscanf(fp,&q

29、uot;%d",&pri);fscanf(fp,"%d",&emt);fscanf(fp,"%d",&st);setNewPCB(name,pri,emt,st);i+;fclose(fp);void setNewPCB(char *name,int pri,int entime,int sertime)/赋值建立PCB,用于从文本中获取数据newP=(struct PCB *)malloc(sizeof(struct PCB);if(head=NULL)head=newP;elsethisP=head;while(thisP->next!=NULL)thisP=thisP->next;thisP->next=newP;thisP=newP;thisP->No=SequenceNumber;SequenceNumber+;strcpy(th

温馨提示

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

评论

0/150

提交评论