《处理机低级调度模拟系统.pdf》由会员分享,可在线阅读,更多相关《处理机低级调度模拟系统.pdf(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、高级程序设计语言课程设计报告高级程序设计语言课程设计报告题目:题目: 处理机低级调度模拟系统处理机低级调度模拟系统专业:专业:班级:班级:学号:学号:姓名:姓名:指导教师:指导教师:完成日期:完成日期:20132013 年年 2 2 月月 25 日日一、课程设计目的一、课程设计目的1、掌握 C 语言数组、函数、指针、结构体的综合应用。2、掌握使用 C 语言,进行应用性的开发。3、掌握系统数据结构与算法的设计。二、课程设计内容二、课程设计内容课程设计题目:处理机低级调度模拟系统课程设计内容:根据操作系统处理机不同的调度算法,使用C 语言模拟实现处理机调度过程。1、系统数据结构(1)进程控制块(
2、pcb) :进程名称、到达时间、进程要求运行时间、进程已运行时间、 指针、进程状态等等(要根据不同算法的需要定义全面的数据结构)(2)进程队列(PQueue):链表2、调度算法(1)先来先服务调度( FCFS) :按照进程提交给系统的先后顺序来挑选进程,先提交的先被挑选。(2)短进程优先调度(SJF) :是以进入系统的进程所提出的“执行时间”为标准,总是优先选取执行时间最短的进程。(3)高响应比优先调度(HRN) :是在每次调度前都要计算所有被选进程(在后备队列中)的响应比,然后选择响应比最高的进程执行。(4)多级反馈队列调度(FB,第 i级队列的时间片=2i-1):(a)应设置多个就绪队列,
3、并为各个队列赋予不同的优先级。( b)当一个新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 的原则排队等待调度。 当轮到该进程执行时,如他能在该时间片内完成,便可准备撤离系统; 如果它在一个时间片结束时尚未完成, 调度程序便将该进程转入第二队列的末尾, 再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成, 再依次将它放入第三队列,如此下去, 当一个长作业进程从第一队列依次降到第N队列后,在第 N 队列中便采取时间片轮转的方式运行。( c)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。三、课程设计的要求三、课程设计的要求1、按照给出的题目内容(1
4、)完成系统数据结构设计与实现、系统算法设计与实现、系统模块设计与实现、系统总体的设计与实现。(2)系统需要一个简单操作界面,例如:=1. 先来先服务调度2. 短进程优先调度3. 高响应比优先调度4. 多级反馈队列调度5. 退出(按数字 1、2、3、4、5,选择操作)=(3)对每种调度算法都要求输出每个进程(进程数不少于 5)开始运行时刻、完成时刻、周转时间,以及这组进程的平均周转时间。(4)画出每种调度算法流程图。2、写出课程设计报告,设计报告提交形式:电子文档提交3、个人独立完成。4、完成时间(1 周)四、课程设计过程四、课程设计过程1、系统中所使用的数据结构及说明/-数据结构的定义-/定义
5、进程控制块PCBtypedef struct PCBchar PID5;/进程标示符/进程名称/进程的优先级(越小越高)/进程要求运行时间(服务时间)/进程进入就绪队列的时间 (到达时间)char Name10;int PRI;float NeedTime;float StartTime;float RunBeginTime;/开始运行时间float UpTime;/进程已运行时间/进程运行完成的时间float OverTime;float TurnaroundTime; /周转时间float RightTTime;/带权周转时间struct PCB *next;PCB,*QueuePtr;/
6、定义进程队列typedef structQueuePtr front,rear;PQueue;2、系统功能结构本系统是处理机低级调度模拟系统, 主要通过模拟来实现处理机调度,调度方式有先来先服务调度 (FCFS) 、短进程优先调度 (SJF) 、高响应比优先调度(HRN) 、多级反馈队列调度 (FB)四种调度方式。系统运行过程如下:输入进程个数, 输入进程详细信息, 通过简单操作界面来选择调度方式, 调度的过程和结果, 重新选择调度方式或者选择结束。3、调度算法流程图(如下图所示)/队头、队尾指针先来先服务调度:多级反馈队列调度:4、程序清单及其描述#include #include #inc
7、lude /-数据结构的定义-typedef struct pcb/进程控制块char pname10;/进程名称float executeTime;/ 执行时间float elapsedTime;/ 已完成时间float arrivalTime;/ 到达时间float startTime;/ 开始时间float waitingTime;/ 等待时间float TurnaroundTime;/ 周转时间float R;PCB;typedef struct pqueue/进程管理队列PCB pcbNode;/进程结点struct pqueue *next;/下一个结点PQueue,PQueueN
8、ode;PQueue *head;/进程管理队列头指针static float Executed=0;/ 处理机执行时间static float AverageTurnAroundTime=0;/-函数的申明-void CreateProc();/创建进程void DisplayProc();/显示进程信息void Processor(PQueue *proc);/ 处理机void FCFS();/先来先服务算法void SJF();/短进程优先算法void HRN();/高响应比优先算法void FB();/多级反馈队列算法void CalculateWaitingTime();/ 计算等待
9、时间void CalculateR();/计算响应比void CalculateTurnAroundTime();/ 计算周转时间voidShareTimeProcessor(PQueue*proc,floatTimes,PQueue*head,PQueue *head1,PQueue *head2);/ 多级调度处理机定义void DisplayPQueuesProc(PQueue *h);/ 显示多级队列进程信息/- 函数的定义-/- 创建进程-void CreateProc()PQueueNode *pqNode;PQueue *p=head;char pName10;while(1=1
10、)pqNode=(PQueueNode*)malloc(sizeof(PQueueNode);printf(进程名称(输入*号结束):);scanf(%s,pName);if(strcmp(pName,*)!=1)break;strcpy(pqNode-pcbNode.pname,pName);printf(执行时间:);scanf(%f,&pqNode-pcbNode.executeTime);pqNode-pcbNode.arrivalTime=0;pqNode-pcbNode.elapsedTime=0;pqNode-pcbNode.startTime=0;pqNode-pcbNode.
11、TurnaroundTime=0;pqNode-pcbNode.waitingTime=0;pqNode-pcbNode.R=0;pqNode-next=p-next;p-next=pqNode;p=pqNode;/- 显示进程信息-void DisplayProc()PQueue *p=head-next;if(p=NULL)printf(没有进程.);elsewhile(p!=NULL)printf(进程名称:%s,p-pcbNode.pname);printf();printf(执行时间:%f,p-pcbNode.executeTime);printf();printf(响应比:%f,p
12、-pcbNode.R);printf();printf(周转间:%fn,p-pcbNode.TurnaroundTime);p=p-next;时/- 先来先服务调度-void FCFS()PQueue *p=head-next;int proc_num=0;float Average=0;Executed=0;AverageTurnAroundTime=0;if(p=NULL)elseprintf(没有进程.);while(p!=NULL)DisplayProc();Processor(p);head-next=p-next;AverageTurnAroundTime=AverageTurnA
13、roundTime+p-pcbNode.TurnaroundTime;proc_num+;free(p);p=head-next;Average=AverageTurnAroundTime/proc_num;printf(平均周转时间是:%fn,Average);/- 短进程优先调度-void SJF()PQueue *p=head-next,*q=head;/根据执行时间排序,冒泡排序int exchange=1;int proc_num=0;float Average=0;AverageTurnAroundTime=0;if(p=NULL)elseprintf(没有进程.);while(p
14、!=NULL)exchange=1;if(p!=NULL)while(exchange=1)exchange=0;while(p!=NULL & p-next!=NULL)if(p-pcbNode.executeTimep-next-pcbNode.executeTime)q-next=p-next;p-next=q-next-next;q-next-next=p;q=q-next;exchange=1;elseq=p;p=p-next;q=head;p=head-next;DisplayProc();Processor(p);head-next=p-next;proc_num+;Averag
15、eTurnAroundTime=AverageTurnAroundTime+p-pcbNode.TurnaroundTime;free(p);p=head-next;Average=AverageTurnAroundTime/proc_num;printf(平均周转时间是:%fn,Average);/- 高响应比优先调度算法-void HRN()PQueue *p=head-next,*q=head;int exchange=1;int proc_num=0;float Average=0;AverageTurnAroundTime=0;if(p=NULL)elseprintf(没有进程.);
16、while(p!=NULL)CalculateR();exchange=1;if(p!=NULL)q=head;p=head-next;while(exchange=1)/ 根据响应比排序,冒泡排序exchange=0;while(p!=NULL & p-next!=NULL)if(p-pcbNode.Rnext-pcbNode.R)q-next=p-next;p-next=q-next-next;q-next-next=p;q=q-next;exchange=1;elseq=p;p=p-next;q=head;p=head-next;DisplayProc();Processor(p);he
17、ad-next=p-next;proc_num+;AverageTurnAroundTime=AverageTurnAroundTime+p-pcbNode.TurnaroundTime;free(p);p=head-next;Average=AverageTurnAroundTime/proc_num;printf(平均周转时间是:%fn,Average);void CalculateR()/计算响应比PQueue *p=head-next;while(p!=NULL)p-pcbNode.R=(p-pcbNode.executeTime+p-pcbNode.waitingTime)/p-pc
18、bNode.executeTime;p=p-next;void CalculateTurnAroundTime(PQueue *head)/ 计算周转时间PQueue *p=head-next;while(p!=NULL)p-pcbNode.TurnaroundTime=p-pcbNode.executeTime+p-pcbNode.waitingTime;p=p-next;void CalculateWaitingTime(PQueue *head)/ 计算等待时间PQueue *p=head-next;while(p!=NULL)p-pcbNode.waitingTime=p-pcbNod
19、e.waitingTime+Executed;/- 处理机-void Processor(PQueue *proc)int i=1;printf(正在执行%s,proc-pcbNode.pname);Executed=proc-pcbNode.executeTime;p=p-next;CalculateWaitingTime(head);proc-pcbNode.waitingTime=proc-pcbNode.waitingTime-Executed;while(ipcbNode.executeTime) /假设处理机在执行进程.i+;if(i%100000)=0)printf(.);pri
20、ntf(n);CalculateTurnAroundTime(head);/-多 级 反 馈 队 列-void FB()3级 调 度PQueue *head1,*head2;PQueue *p,*p1,*p2,*q;int proc_num=0;float Average=0;Executed=0;AverageTurnAroundTime=0;head1=(PQueue*)malloc(sizeof(PQueue);head1-next=NULL;head2=(PQueue*)malloc(sizeof(PQueue);head2-next=NULL;if(head-next=NULL)el
21、seprintf(没有进程.n);while(head-next!=NULL)p=head-next;p1=head1;while(p1-next!=NULL)p1=p1-next;printf(第 1 级调度n);DisplayPQueuesProc(head);while(p!=NULL)/第 1级调度,每个进程分配1个时间片ShareTimeProcessor(p,1,head,head1,head2);head-next=p-next;if(p-pcbNode.executeTimep-pcbNode.elapsedTime)/ 还没完成,插入到下一级队列p-next=NULL;p1-
22、next=p;p1=p;elseproc_num+;AverageTurnAroundTime=AverageTurnAroundTime+p-pcbNode.TurnaroundTime;片head1-next=p1-next;ShareTimeProcessor(p1,2,head,head1,head2);free(p);p=head-next;printf(第 2 级调度n);DisplayPQueuesProc(head1);p1=head1-next;p2=head2;while(p2-next!=NULL)while(p1!=NULL)/第 2 级调度,每个进程分配 2 个时间p
23、2=p2-next;if(p1-pcbNode.executeTimep1-pcbNode.elapsedTime)/还 没 完成,插入到下一级队列p1-next=NULL;p2-next=p1;p2=p1;elseproc_num+;AverageTurnAroundTime=AverageTurnAroundTime+p1-pcbNode.TurnaroundTime;if(head-next!=NULL)/ 如果第 1 级有进程进来,就free(p1);返回到第 1 级调度break;p1=head1-next;printf(第 3 级调度n);DisplayPQueuesProc(he
24、ad2);p2=head2-next;q=head2;片while(q-next!=NULL)q=q-next;while(p2!=NULL)/ 第 3级调度,每个进程分配3个时间ShareTimeProcessor(p2,3,head,head1,head2);head2-next=p2-next;if(p2-pcbNode.executeTimep2-pcbNode.elapsedTime)/ 还没完成, 插入到队尾p2-next=NULL;q-next=p2;elseproc_num+;AverageTurnAroundTime=AverageTurnAroundTime+p2-pcbN
25、ode.TurnaroundTime;free(p2);if(head-next!=NULL)/ 如果第 1 级有进程进来,就返回到第 1 级调度break;p2=head2-next;Average=AverageTurnAroundTime/proc_num;printf(平均周转时间是:%fn,Average);voidShareTimeProcessor(PQueue*proc,floatTimes,PQueue*head,PQueue *head1,PQueue *head2)/ 多级调度处理机定义int i=1;float Time=0;printf(正在执行%s,proc-pcb
26、Node.pname);if(proc-pcbNode.executeTime-proc-pcbNode.elapsedTime)Times)elseTime=proc-pcbNode.executeTime-proc-pcbNode.elapsedTime;if(head-next!=NULL)/ 对第 1 级队例计算等待时间if(head1-next!=NULL)/ 对第 2 级队例计算等待时间if(head2-next!=NULL)/ 对第 3 级队例计算等待时间Time=Times;Executed=Time;Executed=Time;CalculateWaitingTime(hea
27、d);CalculateWaitingTime(head1);CalculateWaitingTime(head2);proc-pcbNode.waitingTime=proc-pcbNode.waitingTime-Executed;while(ipcbNode.elapsedTime=proc-pcbNode.elapsedTime+Time;printf(n);if(head-next!=NULL)/ 对第 1 级队例计算周转时间if(head1-next!=NULL)/ 对第 2 级队例计算周转时间i+;if(i%100000)=0)printf(.);CalculateTurnAro
28、undTime(head);CalculateTurnAroundTime(head1);if(head2-next!=NULL)/ 对第 3 级队例计算周转时间void DisplayPQueuesProc(PQueue *head)/ 多级调度进程信息显示PQueue *p=head-next;if(p=NULL)elseCalculateTurnAroundTime(head2);printf(没有进程.);while(p!=NULL)printf(进程名称:%s,p-pcbNode.pname);printf();printf(执行时间:%4f,p-pcbNode.executeTim
29、e);printf();printf(响应比:%4f,p-pcbNode.R);printf();周转时printf(间:%4f,p-pcbNode.TurnaroundTime);printf();printf(已运间:%4fn,p-pcbNode.elapsedTime);p=p-next;/-void main()行时int i;head=(PQueue*)malloc(sizeof(PQueue);head-next=NULL;doprintf(=printf(n);printf(-n);printf(处理机调度模拟系统n);n);printf(1-创建作业n);printf(2-显示
30、作业信息n);printf(3-先来先服务调度算法n);printf(4-短作业做优先调度算法n);printf(5-高响应比优先调度算法n);printf(6-多级反馈队列调度算法n);printf(0-退出程序n);printf(-n);printf(n);printf(请输入您选择的功能号:);scanf(%d,&i);getchar();if(i0)switch(i)case 1:CreateProc();break;case 2:DisplayProc();break;case 3:FCFS();break;case 4:SJF();break;case 5:HRN();break;case 6:FB();break;case 0:getchar();break;printf(n);if(i0)printf(您输入的数值不正确,请重新输入! n);while(i!=0);3、系统运行结果五、课程设计体会五、课程设计体会