-1-昆明理工大学信息工程与自动化学院学生实验报告(2011—2012学年第二学期)课程名称:操作系统开课实验室:4442012年4月10日年级、专业、班10级计科103班学号201010405312姓名成绩实验项目名称进程管理指导教师杨云飞教师评语教师签名:年月日一、实验目的通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。二、实验原理及基本技术路线图(方框原理图)用C语言或C++语言开发。需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。要求有创建、撤销、调度、阻塞、唤醒进程等功能。-2-状态转换图:各原语的功能说明:#includestdio.h标准输入输出头文件#includestdlib.hstdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。多级反馈队列调度算法的描述:voidzhingxing(){for(inti=0;i=链表的数目;){p=rq(i),front;while(p!=NULL){执行调度算法,将在时间片内不能完成的进程,插入到下一队列的尾部,并以此循环执行。p=p-next;}就绪队列准备进入内存执行进程,在规定时间内,未执行完,则进入下一链表尾部,进行等待重复执行,直至为空,则执行下一链表执行完毕输出-3-}}程序功能结构图:流程图:creat()流程图:main()creat()创建就绪队列diaodu()执行程序中进程的调用display()显示进程的运行情况开始输入shumushumu20内存不足NYj=0jshumuNYp-youxianp-youxian==1p-youxian==2p-youxian==3NNYY插入队列1插入队列2-4-数据结构定义主要变量的说明:xuhao进程的序号daoda进程到达时间pid[10]进程名字youxian进程优先级yunxingsuoxu运行所需时间yunxing运行已用时间zhuangtaiR表示执行,W表示动态就绪,F表示完成函数的说明:voidcreat();//创建链表voiddiaodu();//执行调度的过程voiddisplay();//显示执行结果三、所用仪器、材料(设备名称、型号、规格等)。计算机一台四、实验方法、步骤#includestdio.h#includestdlib.h#defineNULL0intshumu;插入队列0结束-5-voidcreat();//创建链表voiddiaodu();//执行调度voiddisplay();//显示执行结果//进程PCB结构体structjincheng{intxuhao;intdaoda;charpid[10];//进程名字intyouxian;//进程优先级intyunxingsuoxu;//占用cpu时间intyunxing;charzhuangtai;//R表示执行,W表示动态就绪,F表示完成structjincheng*next;};//链表结构体typedefstructnode{jincheng*front;}pcbqueue;pcbqueuerq[3];//定义三个等待队列structjincheng*p,*q;//创建进程……voidcreat(){-6-printf(创建进程数目;(不大于20):);scanf(%d,&shumu);if(shumu20){printf(内存已满!\n);printf(输入错误,请重新创建进程!\n);creat();}else{for(intj=0;jshumu;j++){p=(jincheng*)malloc(sizeof(jincheng));p-youxian=(int)(rand()%(4-1)+1);if(rq[p-youxian-1].front==NULL)//建立队列2,1,0{printf(请输入新进程的序号(数字):\n);scanf(%d,&p-xuhao);printf(请输入新进程的名字:\n);scanf(%s,&p-pid);p-daoda=(int)(rand()%(5-1)+1);p-yunxingsuoxu=(int)(rand()%(5-1)+1);p-yunxing=0;p-zhuangtai='W';//新建进程的状态设置为“就绪”rq[p-youxian-1].front=p;p-next=NULL;-7-}else//如果就绪队列不是空队列{p=rq[p-youxian-1].front;while(p-next!=NULL){p=p-next;//p一直指向就绪队列的队尾}q=(jincheng*)malloc(sizeof(jincheng));q-next=p-next;p-next=q;//在就绪队列的队尾加入新建的进程printf(请输入新进程的序号(数字):\n);scanf(%d,&q-xuhao);printf(请输入新进程的名字:\n);scanf(%s,&q-pid);q-daoda=(int)(rand()%(5-1)+1);q-yunxing=0;q-yunxingsuoxu=(int)(rand()%(5-1)+1);q-zhuangtai='W';}}}if(shumu0&&shumu=20){printf(\t\t\t进程创建成功!\n);printf(\t***********************************************\n);printf(\t*********************执行程序******************\n);-8-printf(\t***********************************************\n);}}voiddiaodu()//执行部分{display();printf(正在执行进程运行情况:\n);printf(序号名字运行时间已运行时间到达时间状态\n);inti=2;//从第二个队列开始……for(i=2;i=0;i--){p=rq[i].front;while(p!=NULL){for(intj=1;j=2*(3-i);j++){p-yunxing=p-yunxing+1;p-yunxingsuoxu=p-yunxingsuoxu-1;if(p-yunxingsuoxu0){printf(进程已完成运行……\n);exit(0);}p-zhuangtai='R';//执行过程中状态改变if(p-yunxingsuoxu==0){p-zhuangtai='F';//执行结束状态改变-9-printf(%d%s%d%d%d%c\n,p-xuhao,p-pid,p-yunxingsuoxu,p-yunxing,p-daoda,p-zhuangtai);break;}getchar();printf(%d%s%d%d%d%c\n,p-xuhao,p-pid,p-yunxingsuoxu,p-yunxing,p-daoda,p-zhuangtai);}if(p-yunxingsuoxu0){p-zhuangtai='W';getchar();printf(%d%s%d%d%d%c\n,p-xuhao,p-pid,p-yunxingsuoxu,p-yunxing,p-daoda,p-zhuangtai);if(i-1=0)/*将用玩时间片的插入相应队列,以下作此操作*/{q=rq[0].front;while(q-next!=NULL){q=q-next;}q-next=p;rq[i].front=p-next;p-next=NULL;-10-diaodu();}else{q=rq[i-1].front;while(q-next!=NULL){q=q-next;}q-next=p;rq[i].front=p-next;p-next=NULL;diaodu();}diaodu();getchar();printf(%d%s%d%d%d%c\n,p-xuhao,p-pid,p-yunxingsuoxu,p-yunxing,p-daoda,p-zhuangtai);}p=p-next;}}}voiddisplay()//输出部分{printf(所有进程运行情况:\n);-11-printf(序号名字运行时间已运行时间到达时间状态\n);for(inta=0;a3;a++){p=rq[a].front;while(p!=NULL){printf(%d%s%d%d%d%c\n,p-xuhao,p-pid,p-yunxingsuoxu,p-yunxing,p-daoda,p-zhuangtai);p=p-next;}}}voidmain(){creat();diaodu();display();}五、实验过程原始记录:输入数据:序号名称1a2b3d4e5f-12-运行截图:输入进程:未完成进程插入下一进程:-13-过程及结果:-14-六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸)这次操作系统进程管理课程设计,在编写过程中,遇到很多难题,特别是在操作系统实验中不曾注意到的问题,也有许多新的问题,在实际反复调试运行中,不断加深了对操作系统的理解,也很大地程度上提高了编程的能力,由于对重要概念的把握程度还不够深入,在实际理解编写时遇到很多不该发生的问题。不过,都很好的解决并牢牢地掌握住了。尤其是链表的插入,哪里插到哪里,要在草稿纸上理清思路,不然会出错,就像那天一个字母大写了,整了半天才检查出来,做程序要非常的细心。做多了你就会发现其实都是大同小异,稍微感动一点就可以了,计算机方面的知识,永不懈怠。有什么问题就问老师,要把它搞清楚来龙气脉,这样才会有提高。通过这次进程管理课程设计,不仅让我了解了多级反馈队列的进程管理系统,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。盲目真的不应该再在我们身上出现了,我们应该认真找到自己的缺点并且及时改正。在这里,我和赵安君很感谢杨老师的指导,多亏她的指导我和赵安君才能完成,她耐心的指导才有我们的进步,杨老师真的是一位好老师。Ifyouputyourheartintoit,nothingisdifficult!!!!!!!!!!!!