模拟进程创建、终止、阻塞、唤醒原语_操作系统原理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统原理题目:模拟进程创建、终止、阻塞、唤醒原语院(部):管理工程学院专业:信息管理与信息系统班级:信管131姓名:栾庆一学号:20130216027实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。三、实验环境:1、硬件:pc机及其兼容机。2、软件:WindowsOS,TurboC或C++、VC++、VS.net、Java等。四、实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。2、设计主函数,采用菜单结构(参见后面给出的流程图)。3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。五、算法流程图系统主菜单1…创建2…阻塞3…唤醒4…终止5…显示0…退出请输入您需要的功能(0-5):六、程序清单#includestdio.h#includestring.hstructpcb{charname[10];intstatus;intorder;输入选择=?创建阻塞唤醒终止显示退出开始结束012345inttime;intwtime;intytime;}pcb[11];//该结构体用于存储已经输入的进程structghost{charname[10];intstatus;intorder;inttime;}ghost[11];//该结构体用于优先级调度时,进程的优先级排序chara_name[10];inti=0,y,a=0,x,z,jilu;voidinsert();voidblock();voidrouse();voidstop();voidoutPut();voidcontrol();//实验二添加函数voidorder_control();//实验二添加函数voidtime_control();//实验二添加函数voidinsert(){jilu=0;//jilu是一个用于判断的变量,在重复时进行判断跳过if(i=10)printf(进程已经存在10个,无法继续添加进程\n);else{printf(请输入插入pcb的数据:\n);printf(1、进程名:);scanf(%s,&pcb[i].name);printf(2、该进程的优先级(1-10):);scanf(%d,&pcb[i].order);printf(3、运行时间);scanf(%d,&pcb[i].time);for(y=0;yi;y++){if(strcmp(pcb[i].name,pcb[y].name)==0){printf(您输入的进程名已经存在,请重新输入!\n);jilu=y+1;}}if(jilu0)jilu=0;else{printf(输入已经完成\n您输入的数据为:\n进程名:%s\n优先级:%d\n运行时间:%d\n,pcb[i].name,pcb[i].order,pcb[i].time);printf(------------------------------------------------------------------\n);strcpy(ghost[i].name,pcb[i].name);ghost[i].order=pcb[i].order;ghost[i].time=pcb[i].time;pcb[i].status=1;ghost[i].status=1;pcb[i].wtime=pcb[i].time;pcb[i].ytime=0;i++;}}}voidblock(){intm;printf(\n请输入您要改变状态的进程的进程名:);scanf(%s,&a_name);for(y=0;y=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;if(pcb[y].status==0){printf(您要修改的进程已经是阻塞状态,无法更改\n);}if(pcb[y].status==2){pcb[y].status=0;for(m=0;m=i;m++){if(strcmp(ghost[m].name,a_name)==0){ghost[m].status=0;}}printf(操作已完成,进程成功改为阻塞状态\n);}}}if(a==0){printf(对不起!您查找的进程名不存在\n);}a=0;}voidrouse(){intm;printf(\n请输入您要改变状态的进程的进程名:);scanf(%s,&a_name);for(y=0;y=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;if(pcb[y].status==1){printf(您要修改的进程已经是就绪状态,无法更改\n);break;};if(pcb[y].status==0){pcb[y].status=1;for(m=0;m=i;m++){if(strcmp(ghost[m].name,a_name)==0){ghost[m].status=1;}}printf(操作已完成,进程成功改为运行状态\n);break;}}}if(a==0){printf(对不起!您查找的进程名不存在\n);}a=0;}voidstop(){printf(\n请输入您要改变状态的进程的进程名:);scanf(%s,&a_name);for(y=0;y=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;for(;yi;y++){pcb[y]=pcb[y+1];}i--;printf(操作已完成,进程成功删除\n);break;}}if(a==0){printf(对不起!您查找的进程名不存在\n);}a=0;}voidoutPut(){if(i==0){printf(对不起,没有进程存在,无法显示\n);}else{printf(\n\n已存在进程分别为:(状态:2表示正在运行,1表示就绪,0表示阻塞)\n);for(y=0;yi;y++){if(pcb[y].status!=3)printf(进程%d进程名:%s状态:%d\n,y+1,pcb[y].name,pcb[y].status);}}}voidcontrol(){for(;1;){printf(进程调度子菜单\n0:返回主菜单\n1:优先级调度\n2:时间片轮转调度\n请输入您想要进行的操作的指令:);scanf(%d,&x);if(x==0)break;switch(x){case0:break;case1:order_control();break;case2:time_control();break;default:printf(您输入的指令有误,请重新输入\n);break;}}}voidorder_control(){intjishi;//用于CPU运行时间计时jishi=0;charpanduan1,panduan2;//用于判断是否继续调度structghostjiaohuan;intgg,bl;for(gg=0;ggi;gg++){if(pcb[gg].status==2){for(bl=0;bli;bl++){if(strcmp(ghost[bl].name,pcb[gg].name)==0){ghost[bl].status=2;}}}}for(x=0;xi-1;x++){for(y=x+1;yi;y++){if(ghost[x].orderghost[y].order){jiaohuan=ghost[x];ghost[x]=ghost[y];ghost[y]=jiaohuan;}}}//以上语句是根据优先级为进程排序printf(\n\n按照优先级调度进程,具体内容为:\n);for(x=0;xi;x++){if(ghost[x].status==1){printf(正在运行的进程:%s\n优先级:%d\n运行时间:%d\n\n\n,ghost[x].name,ghost[x].order,ghost[x].time);for(y=0;y=i;y++){if(strcmp(pcb[y].name,ghost[x].name)==0){pcb[y].status=2;ghost[x].status=2;}};//该语句用于更改另一个结构体进程的状态printf(是否继续运行直至进程运行完毕(Y/N));scanf(%s,&panduan1);if(panduan1=='Y'||panduan1=='y'){if(ghost[x].status==2){jishi=jishi+ghost[x].time;printf(CPU运行时间%d,进程%s运行完毕,正在关闭!\n,jishi,ghost[x].name);for(y=0;y=i;y++){if(strcmp(pcb[y].name,ghost[x].name)==0){pcb[y].status=3;ghost[x].status=3;}};//该语句用于更改另一个结构体进程的状态if(x==(i-1)){printf(所有进程全部运行完毕!\n-------------------------------------------------------\n);}else{printf(--------------------------------------------------------------\n是否继续调度(y/n));scanf(%s,&panduan2);if(panduan2=='N'||panduan2=='n')break;}}}elsebreak;}}printf(如果无输出内容,请检查就绪队列是否存在进程);}voidtime_control(){intz,kz1,kz2,kz3,kz4,kz5,kz6;//kz1表示时间片运行的时间计时,kz2表示CPU运行的总时间,kz3用于所有进程时间的输出kz4表示已完成的进程数kz5用于表示状态为就绪的进程的个数kz6用于更改ghost的状态值z=0;kz2=0;kz4=0;kz5=0;for(y=0;yi;y++){if(pcb[y].status==1){kz5=kz5+1;}}printf(\n\n请输入时间片长度:);scanf(%d,&x);printf(\n\n按照时间片轮转调度进程,具体内容为:\n);if(kz5!=0){for(;kz4kz5;){for(y=0;yi;y++){if(pcb[y].status==1||pcb[y].status==2){for(kz1=0;kz1x;kz1++){if(pcb[y].status==1||pcb[y].status==2){kz2=kz2+1;pcb[y].wtime=pcb[y].wtime-1;pcb[y].ytime=pcb[y].ytime+1;printf(CPU运行时间:%d,正在运行进程:%s\n,kz2,pcb[y].name);printf(进程名已运行时间未运行时间要求运行时间\n);for(kz3=0;kz3i;kz3++){if(pcb[kz3].status==1||pcb[kz3].status==2){printf(%s%12d%12d%12d\n,pcb[kz3].name,pcb[kz3].ytime,pcb[kz3].wtime,pcb[kz3].time);}}if(pcb[y].wtime=0&&pcb[y].status!=3){printf(进程%s运行完毕,正在关闭!\n-------------------------------------------------------------------\n,pcb[y].name);k

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功