《采用静态优先权优先算法的进程调度程序.doc》由会员分享,可在线阅读,更多相关《采用静态优先权优先算法的进程调度程序.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、, 采用静态优先权优先算法的进程调度程序 学 号: 姓 名: 专 业: 指导教师: 日 期: 目录第1部分 课设简介31.1 课程设计题目31.2 课程设计目的31.3 课程设计内容31.4 时间安排3第2部分 实验原理分析32.1问题描述32.2解决方法4第3部分 主要的功能模块53.1主要的函数53.2 测试用例及运行结果7第4部分 源代码9第5部分 总结及参考文献165.1 总结165.2 参考文献17 第1部分 课设简介1.1 课程设计题目 采用静态优先权优先算法的进程调度程序1.2 课程设计目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理
2、论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 1)进一步巩固和复习操作系统的基础知识。 2)培养学生结构化程序、模块化程序设计的方法和能力。 3)提高学生调试程序的技巧和软件设计的能力。 4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。1.3 课程设计内容设计并实现一个采用静态优先权算法的进程调度演示程序1.4 时间安排 1)分析设计贮备阶段 (1 天) 2)编程调试阶段 (7 天) 3)写课程设计报告、考核(2 天) 第2部分 实验原理分析2.1问题描述(1)每一个进程有一个PCB,其内容可以根据具体情况设定。 (2)进程数、进入内存时间、要求服务时间、优先
3、级等均可以在界面上设定 (3)可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、作业大小、进程优先级的初始化 (4)可以在运行中显示各进程的状态:就绪、执行 (由于不要求设置互斥资源与进程间的同步关系,故只有两种状态) (5)采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列 (6)有性能比较功能,可比较同一组数据在不同调度算法下的平均周转时间 (7)具有一定的数据容错性2.2程序设计流程图2.3解决方法 通过数组容纳所有数据,根据冒泡排序把数据按从小到大顺序排列,在分析a0和其他数据的大小,如果a0的完成时间大于其他数据就按照冒泡的
4、排列顺序,如果小,就比较其他数据的优先级,按优先级大小排序。 第3部分 主要的功能模块3.1主要的函数void fcfs()int i,j,n,min,px;float sum1,sum2;printf(t请输入有n个进程(0n50|n=0)printf(nt请重新输入: );scanf(%d,&n);printf(nn);struct Gzuoint id; /进程名字int dt; /到达时刻int st; /服务时间int wct; /完成时刻float zt; /周转时间float dczt; /带权周转时间;Gzuo aN;for(i=0;i=0;j-) for(i=0;iai+1.
5、dt) min=ai.dt;ai.dt=ai+1.dt;ai+1.dt=min;min=ai.st;ai.st=ai+1.st;ai+1.st=min; min=ai.id;ai.id=ai+1.id;ai+1.id=min; a0.wct=a0.st+a0.dt;a0.zt=(float)a0.st;a0.dczt=a0.zt/a0.st;for(i=1;iai-1.wct)ai.wct=ai.dt+ai.st;ai.zt=(float)ai.st;ai.dczt=ai.zt/ai.st;elseai.wct=ai-1.wct+ai.st;ai.zt=(float)(ai.wct-ai.dt
6、);ai.dczt=ai.zt/ai.st; 3.2 测试用例及运行结果 第4部分 源代码#includestdio.h#define N 50void main() void fcfs();void yxj();int a;while(true)printf(nn);printf(tt/*/);printf(ntt/* 1、先到先服务 调 度 */);printf(ntt/* 2、优先级优先 调 度 */);printf(ntt/* 0、 退 出 */n);printf(tt/*/);printf(nnt请选择菜单项:t);scanf(%d,&a);printf(n);switch(a)ca
7、se 1: fcfs();break;case 2: yxj();break;default: break;if(a2) break;void fcfs()int i,j,n,min,px;float sum1,sum2;printf(t请输入有n个进程(0n50|n=0)printf(nt请重新输入: );scanf(%d,&n);printf(nn);struct Gzuoint id; /进程名字int dt; /到达时刻int st; /服务时间int wct; /完成时刻float zt; /周转时间float dczt; /带权周转时间;Gzuo aN;for(i=0;i=0;j-
8、) for(i=0;iai+1.dt) min=ai.dt;ai.dt=ai+1.dt;ai+1.dt=min;min=ai.st;ai.st=ai+1.st;ai+1.st=min; min=ai.id;ai.id=ai+1.id;ai+1.id=min; a0.wct=a0.st+a0.dt;a0.zt=(float)a0.st;a0.dczt=a0.zt/a0.st;for(i=1;iai-1.wct)ai.wct=ai.dt+ai.st;ai.zt=(float)ai.st;ai.dczt=ai.zt/ai.st;elseai.wct=ai-1.wct+ai.st;ai.zt=(flo
9、at)(ai.wct-ai.dt);ai.dczt=ai.zt/ai.st; printf(t1、按id号依次输出n);printf(t2、按完成顺序依次输出n);printf(nt请选择输出顺序:t);scanf(%d,&px);printf(nid:到达时间t服务时间t完成时间t周转时间t带权周转时间n);sum1=0;sum2=0;switch(px)case 2: for(i=0;in;i+) printf(%d: %dtt%dtt%dtt%.0ftt%.2fn,ai.id,ai.dt,ai.st,ai.wct,ai.zt,ai.dczt);sum1+=ai.zt;sum2+=ai.d
10、czt;printf(n平均周转时间:%.2fn,sum1/n);printf(n平均带权周转时间:%.2fnn,sum2/n);break;case 1: for(j=0;jn;j+) for(i=0;in;i+)if(ai.id=j+1)printf(%d: %dtt%dtt%dtt%.0ftt%.2fn,ai.id,ai.dt,ai.st,ai.wct,ai.zt,ai.dczt);sum1+=ai.zt;sum2+=ai.dczt;printf(n平均周转时间:%.2fn,sum1/n);printf(n平均带权周转时间:%.2fnn,sum2/n);break; default: b
11、reak;void yxj()int i,j,n,min,px;int b=0,z;float sum1,sum2;printf(ntt请输入有n个进程(0n50|n=0)printf(nt请重新输入: );scanf(%d,&n);printf(n);struct Gzuoint id; /进程名字int dt; /到达时刻int st; /服务时间int yxj; /优先级int wct; /完成时刻float zt; /周转时间float dczt; /带权周转时间;Gzuo aN;for(i=0;i=0;j-) for(i=0;iai+1.dt) min=ai.dt;ai.dt=ai+
12、1.dt;ai+1.dt=min;min=ai.st;ai.st=ai+1.st;ai+1.st=min; min=ai.id;ai.id=ai+1.id;ai+1.id=min;min=ai.yxj;ai.yxj=ai+1.yxj;ai+1.yxj=min;if(ai.dt=ai+1.dt&ai.yxjai+1.yxj)min=ai.dt;ai.dt=ai+1.dt;ai+1.dt=min;min=ai.st;ai.st=ai+1.st;ai+1.st=min; min=ai.id;ai.id=ai+1.id;ai+1.id=min;min=ai.yxj;ai.yxj=ai+1.yxj;ai
13、+1.yxj=min; a0.wct=a0.st+a0.dt;a0.zt=(float)a0.st;a0.dczt=a0.zt/a0.st;for(i=1;ia0.wct) ;else b+;for(j=b-1;j=1;j-) for(i=1;ij;i+)if(ai.yxjai+1.yxj) min=ai.dt;ai.dt=ai+1.dt;ai+1.dt=min;min=ai.st;ai.st=ai+1.st;ai+1.st=min; min=ai.id;ai.id=ai+1.id;ai+1.id=min;min=ai.yxj;ai.yxj=ai+1.yxj;ai+1.yxj=min; for
14、(i=1;iai-1.wct)ai.wct=ai.dt+ai.st;ai.zt=(float)ai.st;ai.dczt=ai.zt/ai.st;elseai.wct=ai-1.wct+ai.st;ai.zt=(float)(ai.wct-ai.dt);ai.dczt=ai.zt/ai.st; for(j=i+1,b=j;jai.wct) ;else b=b+1;for(j=b-1;j=i;j-) for(z=i;zj;z+)if(az.yxjaz+1.yxj) min=az.dt;az.dt=az+1.dt;az+1.dt=min;min=az.st;az.st=az+1.st;az+1.s
15、t=min; min=ai.id;ai.id=ai+1.id;ai+1.id=min; printf(nt请选择输出顺序n);printf(t1、按id号依次输出n);printf(t2、按完成顺序依次输出n);scanf(%d,&px);printf(nid:到达时间t服务时间t优先级t完成时间t周转时间t带权周转时间n);sum1=0;sum2=0;switch(px)case 2: for(i=0;in;i+) printf(%d: %dtt%dtt%dtt%dtt%.0ftt%.2fn,ai.id,ai.dt,ai.yxj,ai.st,ai.wct,ai.zt,ai.dczt);sum
16、1+=ai.zt;sum2+=ai.dczt;printf(n平均周转时间:%.2fn,sum1/n);printf(n平均带权周转时间:%.2fnn,sum2/n);break;case 1: for(j=0;jn;j+) for(i=0;in;i+)if(ai.id=j+1)printf(%d: %dtt%dtt%dtt%dtt%.0ftt%.2fn,ai.id,ai.dt,ai.yxj,ai.st,ai.wct,ai.zt,ai.dczt);sum1+=ai.zt;sum2+=ai.dczt;printf(n平均周转时间:%.2fn,sum1/n);printf(n平均带权周转时间:%.
17、2fnn,sum2/n);break; default: break; 第5部分 总结及参考文献5.1 总结 1)多线程编程对于解决一些并发性的问题是很高效的,而且也很必要,现在学会了使用多线程编程,对于以后解决类似的并发性问题(例如网络编程中经常遇到的多客户线程同时访问的问题),都会很有用。 2)虽然我们学习的操作系统理论课里面说多线程间的执行顺序具有随机性和不确定性,但我们毕竟是在一个特定的操作系统平台上实验,Windows 的线程调度机制我是不得而知的,所以出现的一些奇怪的问题也很难调试,只好人为地去5.2 参考文献 1)宗大华,宗涛,陈吉人著 操作系统 北京:人民邮电出版社,2009 2)李爱华,程磊著 面相对象程序设计(C+语言) 北京: 清华大学出版社,2010 3)宋晓宇 , windows操作系统核心编程实验教程 中国铁道出版社 4)张丽芬 刘利雄 王金玉编著 操作系统实验教程 清华大学出版社