基于静态优先权和响应比的进程管理系统的设计课程设计报告 精品.docx
- 文档编号:591240
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:22
- 大小:272.48KB
基于静态优先权和响应比的进程管理系统的设计课程设计报告 精品.docx
《基于静态优先权和响应比的进程管理系统的设计课程设计报告 精品.docx》由会员分享,可在线阅读,更多相关《基于静态优先权和响应比的进程管理系统的设计课程设计报告 精品.docx(22页珍藏版)》请在冰点文库上搜索。
基于静态优先权和响应比的进程管理系统的设计课程设计报告精品
课程设计报告
(本科)
基于静态优先权和响应比的进程管理系统的设计
课程:
操作系统课程设计
学号:
姓名:
班级:
教师:
时间:
计算机科学与技术系
设计名称:
基于静态优先权和响应比的进程管理系统的设计
设计内容、目的与要求:
本课程设计的目的是:
加深对进程概念及进程管理各部分内容的理解;熟悉静态优先权和响应比两种进程调度算法。
本课程设计的要求是:
(1)设计一个完整的进程调度系统,系统中至少包括5个进程;
(2)定义PCB;(3)采用链表管理就绪队列;(4)结果要能够显示出进程的调度序列及进入系统的时间、运行时间等必要信息。
(5)设计的输入数据要能体现算法的思想。
计划与进度安排:
6月7日按照课程设计要求建立流程图,架起大概框架
6月8日到12日输入主函数和各个过程的程序
6月13日到20日调试程序并记录调试中的问题,努力解决
6月21日到25日系统测试,演示设计成果,将调试结果截图保留下来
6月26日到30日整理完善课程设计说明书
设计过程、步骤(可加页):
①进程创建模块
此模块用来创建进程实体,设置进程的到达时间、服务时间、开始时间。
②就绪队列模块
此模块用链式队列来实现,用来存放已经创建的进程,为下面的两个模块来服务。
③静态优先权模块
此模块是先进先出算法的实现模块,此模块遍历模块中的就绪队列来找到到达时间的从小到的大的序列。
④响应比模块
此模块是短进程优先调度算法的实现模块,此模块遍历中的就绪队列来找到服务时间从小打到的序列。
程序源代码如下:
//基于静态优先权和响应比的进程管理系统的设计
#include
#include
#include
#include
#definefalse0
#definetrue1
//定义链表的结构体
typedefstruct{
charid[20];//进程名称
intf_priority;//初始优先权
intarrive_time;//到达时间
intservice_time;//服务时间
intstart_time;//开始时间
intfinish_time;//完成时间
intwait_time;//等待时间
floatpriority;//响应比(优先权)
}datatype;//15
//定义链表
typedefstructnode{
datatypedata;
structnode*prior;//前一节点指针
structnode*next;//后一节点指针22
}listnode,*linklist;
linklisthead,list_static,list_rp;
listnode*p,*q,*m,*n,*rear,*z;
//函数说明
intmenu_select();
linklistenter(void);
voiddisplay(linklisthead);
voiddisplay_static(linklisthead);
voiddisplay_rp(linklisthead);//30
//主函数
voidmain()
{
for(;;){
switch(menu_select())
{
case1:
printf("\t*******************************\n");
printf("\t************创建进程***********\n");
printf("\t*******************************\n");
head=enter();
system("cls");
break;
case2:
printf("\t*******************************\n");
printf("\t**********显示就绪队列*********\n");
printf("\t*******************************\n");
display(head);
break;
case3:
printf("\t*******************************\n");
printf("\t***********静态优先权**********\n");
printf("\t*******************************\n");
display_static(head);
break;
case4:
printf("\t*******************************\n");
printf("\t**********高响应比优先*********\n");
printf("\t*******************************\n");
display_rp(head);
break;
case0:
printf("\n谢谢使用!
\n");
return;
default:
break;//68
}
}
}
//****************
//菜单选择函数程序
//****************
intmenu_select()
{
intsn;
printf("\t基于静态优先权和响应比的进程管理系统\n\n");
printf("\t==========================================\n");//80
printf("\t1.创建进程队列\n");
printf("\t2.显示就绪队列\n");
printf("\t3.静态优先权\n");
printf("\t4.高响应比优先\n");
printf("\t0.退出\n");
printf("\t==========================================\n");
printf("\t请选择0~4:
");
while
(1){
scanf("%d",&sn);//93
getchar();
if(52 { printf("\n\t输入错误,重选0-4: "); sn=9; continue; } else{ break; } } returnsn;//101 } //**************** //**建立进程队列** //**************** linklistenter(void) { linklisthead=(listnode*)malloc(sizeof(listnode)); listnode*p,*rear; charflag='y'; rear=head; while(flag=='y') { p=(listnode*)malloc(sizeof(listnode)); printf("%s\t","\t请输入进程名id: ");//120 scanf("%s",p->data.id); printf("%s\t","\t初始优先权: "); scanf("%d",&p->data.f_priority); printf("%s\t","\t到达时间: "); scanf("%d",&p->data.arrive_time); printf("%s\t","\t服务时间: "); scanf("%d",&p->data.service_time); rear->next=p; p->prior=rear;//双向链表 rear=p; //判断是否还继续输入新的 flag='n'; printf("\n\t继续输入吗? (y/n)"); getchar(); scanf("%c",&flag); }//while()结束 rear->next=NULL; returnhead; } //****************** //***显示进程队列*** //****************** voiddisplay(linklisthead) { listnode*p; if(head==NULL||head->next==NULL){printf("\n\t空队列任意键返回主菜单");getchar();system("cls");return;} p=head->next; printf("\n\t***************以下为队列信息************"); printf("\n\t进程名\t初始优先权\t到达时间\t服务时间\t"); printf("\n\t----------------------------------------------------\n"); while(p! =NULL) { printf("\t%s",p->data.id); printf("\t%d",p->data.f_priority); printf("\t\t%d",p->data.arrive_time); printf("\t\t%d",p->data.service_time); printf("\n\t----------------------------------------------------\n"); p=p->next; } getchar(); system("cls"); } //****************** //**静态优先权算法** //****************** voiddisplay_static(linklisthead) { intsize=0; //假设当前时间为0 inttime=0; //假设未进程满足条件 boolhave=false;//180 listnode*p,*q,*rear,*m,*n,*z; if(head==NULL||head->next==NULL){printf("\n\t空队列任意键返回主菜单");getchar();system("cls");return;} //创建一个新的链表用来存储静态优先权算法后得到的执行队列 linklistlist_static=(listnode*)malloc(sizeof(listnode)); rear=list_static; p=(listnode*)malloc(sizeof(listnode)); //取得链表节点数 p=head->next;//190 while(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; //最外层循环选取新排列的链表 inti; for(i=1;i<=size;i++){ have=false;//207 //遍历链表挑选出符合条件的进程 while(p! =NULL){ //如果当前时间下有进程已到达 if(p->data.arrive_time<=time){ have=true; //如果其优先权比原有优先权大则替换选出其中优先权最大的 if(q->data.f_priority //把p节点复制成q q->data=p->data; } } //进程还未到达选出到达时间最小且优先权最大的 if(p->data.arrive_time>time){ //同时到达 if(m->data.arrive_time==p->data.arrive_time){ //优先权 if(m->data.f_priority m->data=p->data; }//224 } if(m->data.arrive_time>p->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; }else{ 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.wait_time=n->data.start_time-time; time=n->data.finish_time; rear->next=n; if(i! =1){ n->prior=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; }else{ p->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=head->next->data; }else{ p=NULL; } }//for循环结束//276 rear->next=NULL; rear=head; p=list_static->next; printf("\n\t***************非抢占静态优先权************"); 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("\t\t%d",p->data.arrive_time); printf("\t\t%d",p->data.service_time); printf("\t\t%d",p->data.start_time); printf("\t\t%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;//300 p=p->next; } rear->next=NULL; getchar(); system("cls"); } //****************** //***高响应比优先*** //****************** voiddisplay_rp(linklisthead) { intsize=0; floatrp=0,rpq=0,rpm=0; //假设当前时间为0 inttime=0; //假设未进程满足条件 boolhave=false;//325 listnode*p,*q,*rear,*m,*n,*z; if(head==NULL||head->next==NULL){printf("\n\t空队列任意键返回主菜单");getchar();system("cls");return;} //创建一个新的链表用来存储高响应比优先权算法后得到的执行队列 linklistlist_rp=(listnode*)malloc(sizeof(listnode)); rear=list_rp; p=(listnode*)malloc(sizeof(listnode)); //取得链表结点数 p=head->next; while(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;//340 inti; //最外层循环选取新排列的链表 for(i=1;i<=size;i++){ have=false;//347 //遍历链表挑选出符合条件的进程 while(p! =NULL){ //如果当前时间下有进程已到达 if(p->data.arrive_time<=time){ have=true; //比较响应比(等待时间/服务时间)+1 rp=(float)((time-p->data.arrive_time)/p->data.service_time)+1; rpq=(float)((time-q->data.arrive_time)/q->data.service_time)+1; //取其中响应比高的进程 if(rpq
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于静态优先权和响应比的进程管理系统的设计课程设计报告 精品 基于 静态 优先权 响应 进程 管理 系统 设计 课程设计 报告