1、基于静态优先权和响应比的进程管理系统的设计课程设计报告(本科)基于静态优先权和响应比的进程管理系统的设计课程:操作系统课程设计学号:姓名:班级:教师:时间:计算机科学与技术系设计名称:基于静态优先权和响应比的进程管理系统的设计设计内容、目的与要求:本课程设计的目的是:加深对进程概念及进程管理各部分内容的理解;熟悉静态优先权和响应比两种进程调度算法。本课程设计的要求是:(1)设计一个完整的进程调度系统,系统中至少包括5个进程;(2)定义PCB;(3)采用链表管理就绪队列;(4)结果要能够显示出进程的调度序列及进入系统的时间、运行时间等必要信息。(5)设计的输入数据要能体现算法的思想。计划与进度安
2、排:6月7日 按照课程设计要求建立流程图,架起大概框架6月8日到12日 输入主函数和各个过程的程序6月13日到20日 调试程序并记录调试中的问题,努力解决6月21日到25日 系统测试,演示设计成果,将调试结果截图保留下来6月26日到30日 整理完善课程设计说明书设计过程、步骤(可加页):进程创建模块 此模块用来创建进程实体,设置进程的到达时间、服务时间、开始时间。 就绪队列模块 此模块用链式队列来实现,用来存放已经创建的进程,为下面的两个模块来服务。 静态优先权模块 此模块是先进先出算法的实现模块,此模块遍历模块中的就绪队列来找到到达时间的从小到的大的序列。 响应比模块 此模块是短进程优先调度
3、算法的实现模块,此模块遍历中的就绪队列来找到服务时间从小打到的序列。开始创建进程输入进程名称、大小、创建时间、服务时间就绪队列查看选择调度算法(FCFS/SPF)输出结果结束程序源代码如下: /基于静态优先权和响应比的进程管理系统的设计#include #include #include #include#define false 0#define true 1/定义链表的结构体typedef struct char id20;/进程名称int f_priority;/初始优先权int arrive_time;/到达时间int service_time;/服务时间int start_time;
4、/开始时间int finish_time;/完成时间int wait_time;/等待时间float priority;/响应比(优先权)datatype;/15/定义链表 typedef struct nodedatatype data;struct node * prior;/前一节点指针struct node * next;/后一节点指针 22listnode,* linklist;linklist head,list_static,list_rp;listnode *p,*q,*m,*n,*rear,*z;/函数说明int menu_select();linklist enter(vo
5、id);void display(linklist head);void display_static(linklist head);void display_rp(linklist head);/30/主函数void main()for(;) switch(menu_select()case 1:printf(t*n);printf(t*创建进程*n);printf(t*n);head=enter();system(cls);break;case 2:printf(t*n);printf(t*显示就绪队列*n);printf(t*n);display(head);break;case 3:p
6、rintf(t*n);printf(t*静态优先权*n);printf(t*n);display_static(head);break;case 4:printf(t*n);printf(t*高响应比优先*n);printf(t*n);display_rp(head);break;case 0:printf(n谢谢使用!n);return;default :break;/68/*/菜单选择函数程序/*int menu_select()int sn;printf(t基于静态优先权和响应比的进程管理系统nn);printf(t=n);/80printf(t 1.创建进程队列n);printf(t
7、2.显示就绪队列n);printf(t 3.静态优先权n);printf(t 4.高响应比优先n);printf(t 0.退出n);printf(t=n);printf(t请选择04:);while(1) scanf(%d,&sn);/93 getchar(); if(52sn&sndata.id);printf(%st,t初始优先权:);scanf(%d,&p-data.f_priority);printf(%st,t到达时间:);scanf(%d,&p-data.arrive_time);printf(%st,t服务时间:);scanf(%d,&p-data.service_time);r
8、ear-next=p;p-prior=rear;/双向链表rear=p;/判断是否还继续输入新的flag=n;printf(nt继续输入吗?(y/n);getchar();scanf(%c,&flag);/while()结束rear-next=NULL;return head;/*/*显示进程队列*/*void display(linklist head)listnode *p;if(head=NULL|head-next=NULL) printf(nt空队列 任意键返回主菜单);getchar();system(cls);return;p=head-next;printf(nt* 以下为队列
9、信息*); printf(nt进程名t初始优先权t到达时间t服务时间t);printf(nt-n);while(p!=NULL)printf(t%s,p-data.id);printf(t%d,p-data.f_priority);printf(tt%d,p-data.arrive_time);printf(tt%d,p-data.service_time);printf(nt-n);p=p-next;getchar();system(cls);/*/*静态优先权算法*/*void display_static(linklist head)int size=0;/假设当前时间为0int tim
10、e=0;/假设未进程满足条件bool have=false;/180listnode *p,*q,*rear,*m,*n,*z;if(head=NULL|head-next=NULL) printf(nt空队列 任意键返回主菜单);getchar();system(cls);return;/创建一个新的链表用来存储静态优先权算法后得到的执行队列linklist list_static=(listnode *)malloc(sizeof(listnode);rear=list_static;p=(listnode *)malloc(sizeof(listnode);/取得链表节点数p=head-
11、next;/190while(p!=NULL)size+;p=p-next;p=head-next;printf(%d,size);/临时指针m=(listnode *)malloc(sizeof(listnode);m-data=head-next-data;q=(listnode *)malloc(sizeof(listnode);q-data=head-next-data;/最外层循环 选取新排列的链表 int i; for(i=1;idata.arrive_timedata.f_prioritydata.f_priority)/把p节点 复制成qq-data=p-data;/进程还未到
12、达 选出到达时间最小且优先权最大的if(p-data.arrive_timetime)/同时到达if(m-data.arrive_time=p-data.arrive_time)/优先权if(m-data.f_prioritydata.f_priority)m-data=p-data;/224if(m-data.arrive_timep-data.arrive_time)m-data=p-data;p=p-next;/while循环结束z=(listnode *)malloc(sizeof(listnode);n=(listnode *)malloc(sizeof(listnode);if(h
13、ave=true)z-data=q-data;z-data.start_time=time;elsez-data=m-data;z-data.start_time=z-data.arrive_time;n=(listnode *)malloc(sizeof(listnode);n-data=z-data;n-data.finish_time=n-data.start_time+n-data.service_time;n-data.wait_time=n-data.start_time-time;time=n-data.finish_time;rear-next=n;if(i!=1)n-prio
14、r=rear;rear=n;/选出的进程需要从原来的链表中删除p=head-next;while(p!=NULL)/搜索到要删除的节点if(strcmp(z-data.id,p-data.id)=0)if(p-next!=NULL)p-prior-next=p-next;p-next-prior=p-prior;elsep-prior-next=NULL;free(p);break;p=p-next;if(head-next!=NULL)p=(listnode *)malloc(sizeof(listnode);p=head-next;q-data=head-next-data;m-data=
15、head-next-data;elsep=NULL;/for循环结束/276rear-next=NULL;rear=head;p=list_static-next;printf(nt* 非抢占静态优先权*); printf(n进程名t初始优先权t到达时间t服务时间t开始时间t完成时间t);printf(n-n);while(p!=NULL)printf(%s,p-data.id);printf(t%d,p-data.f_priority);printf(tt%d,p-data.arrive_time);printf(tt%d,p-data.service_time);printf(tt%d,p
16、-data.start_time);printf(tt%d,p-data.finish_time);printf(n-n);z=(listnode *)malloc(sizeof(listnode);z-data=p-data;rear-next=z;z-prior=rear;rear=z;/300p=p-next;rear-next=NULL;getchar();system(cls);/*/*高响应比优先*/*void display_rp(linklist head)int size=0;float rp=0,rpq=0,rpm=0;/假设当前时间为0int time=0;/假设未进程满
17、足条件bool have=false;/325listnode *p,*q,*rear,*m,*n,*z;if(head=NULL|head-next=NULL) printf(nt空队列 任意键返回主菜单);getchar();system(cls);return;/创建一个新的链表用来存储高响应比优先权算法后得到的执行队列linklist list_rp=(listnode *)malloc(sizeof(listnode);rear=list_rp;p=(listnode *)malloc(sizeof(listnode);/取得链表结点数p=head-next;while(p!=NUL
18、L)size+;p=p-next;p=head-next;printf(%d,size);/临时指针m=(listnode *)malloc(sizeof(listnode);m-data=head-next-data;q=(listnode *)malloc(sizeof(listnode);q-data=head-next-data;/340 int i;/最外层循环 选取新排列的链表 for(i=1;idata.arrive_timedata.arrive_time)/p-data.service_time)+1;rpq=(float)(time-q-data.arrive_time)/
19、q-data.service_time)+1;/取其中响应比高的进程if(rpqdata=p-data;/进程还未到达 选出最先到达的if(p-data.arrive_timetime)if(m-data.arrive_timep-data.arrive_time)m-data=p-data;p=p-next;/while循环结束z=(listnode *)malloc(sizeof(listnode);n=(listnode *)malloc(sizeof(listnode);if(have=true)/有进程满足z-data=q-data;z-data.start_time=time;el
20、se/未有进程满足z-data=m-data;z-data.start_time=z-data.arrive_time;n=(listnode *)malloc(sizeof(listnode);n-data=z-data;n-data.finish_time=n-data.start_time+n-data.service_time;n-data.priority=(float)(n-data.start_time-n-data.arrive_time)/n-data.service_time+1;time=n-data.finish_time;rear-next=n;if(i!=1)n-p
21、rior=rear;rear=n;/选出的进程需要从原来的链表中删除p=head-next;while(p!=NULL)/搜索到要删除的节点/390if(strcmp(z-data.id,p-data.id)=0)if(p-next!=NULL)p-prior-next=p-next;p-next-prior=p-prior;elsep-prior-next=NULL;free(p);break;p=p-next;if(head-next!=NULL)p=(listnode *)malloc(sizeof(listnode);p=head-next;q-data=head-next-data;
22、m-data=head-next-data;elsep=NULL;/for循环结束rear-next=NULL;rear=head;p=list_rp-next;printf(nt*高响应比优先*); printf(n进程名t到达时间t服务时间t开始时间t完成时间t响应比);printf(n-n);while(p!=NULL)printf(%s,p-data.id);printf(t%d,p-data.arrive_time);printf(tt%d,p-data.service_time);printf(tt%d,p-data.start_time);printf(tt%d,p-data.f
23、inish_time);printf(tt%02f,p-data.priority);printf(n-n);z=(listnode *)malloc(sizeof(listnode);z-data=p-data;rear-next=z;z-prior=rear;rear=z;p=p-next;rear-next=NULL;getchar();system(cls);结果与分析(可以加页): 1.显示进程管理系统2.创建五个进程3.显示就绪队列4.显示静态优先权的进程队列5显示高响应比的进程队列设计体会与建议: 邹良群:本人在本次实验中负责整理课程设计的实验说明文档。通过本次操作系统课程设计,
24、使我们小组成员再次回顾了操作系统学习中的相关内容,对设计和调试相应的程序的基础步骤和方法有了更深的认识。唐佳慧:在本次课程设计中,我主要负责收集资料和查阅书籍,在做这项课程设计的过程中,我们通过思考摸索与查阅资料相结合,并与同组的其他同学讨论,相互学习,使我比较成功的设计了这个系统。通过查阅资料,不断的发现错误并纠正,反复的完善自己的设计,基本上完成了设计的要求,学会了把课本上的知识成功的运用到实际应用中,巩固了自己关于操作系统的知识。周慧:在本次实验中我主要负责代码的编写与修改。我在设计与查阅资料和参考别人的程序中,发现了操作系统这门课的非常强大的功能,及其广泛的应用性,并深深的体会到了自己设计出一个成功的系统的乐趣,并且意识到自己在编程方面的能力还很不足,真的需要多多加强学习。通过这次实验倒是积累了编写程序的经验,受益匪浅。通过这次课程设计,加深了我们对操作系统这门课程的理解,尤其是进程的管理。虽然我们的这个进程管理系统功能很少,模拟的真实性不高,但毕竟是基本上完成了课程设计的要求。16