1、模拟进程创建终止阻塞唤醒原语操作系统原理模拟进程创建、终止、阻塞、唤醒原语操作系统原理 操作系统原理 题 目:模拟进程创建、终止、阻塞、唤醒原语院(部): 管理工程学院专 业: 信息管理与信息系统班 级: 信管姓 名: 学 号: 实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。 二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。 三、实验环境: 1、硬件:pc机及其兼容机。 2、软件:WindowsOS,TurboC或C+、VC+、VS.net、Java等。 四、实验内容: 1、设计创建
2、、终止、阻塞、唤醒原语功能函数。 2、设计主函数,采用菜单结构(参见后面给出的流程图)。 3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。 五、算法流程图 开始 系统主菜单1创建2阻塞3唤醒4终止5显示0退出请输入您需要的功能(05): 输入选择=? 543210 退出创建阻塞唤醒终止显示 结束 六、程序清单#include#includestructpcb charname10; intstatus; intorder; inttime; intwtime; intytime;pcb11;/该结构体用于存储已经输入的进程struc
3、tghost charname10; intstatus; intorder; inttime;ghost11;/该结构体用于优先级调度时,进程的优先级排序chara_name10;inti=0,y,a=0,x,z,jilu;voidinsert();voidblock();voidrouse();voidstop();voidoutPut();voidcontrol();/实验二添加函数voidorder_control();/实验二添加函数voidtime_control();/实验二添加函数voidinsert() jilu=0;/jilu是一个用于判断的变量,在重复时进行判断跳过 if
4、(i=10) printf(“进程已经存在10个,无法继续添加进程n“); else printf(“请输入插入pcb的数据:n“); printf(“1、进程名:“); scanf(“%s“,&pcbi.name); printf(“2、该进程的优先级(1-10):“); scanf(“%d“,&pcbi.order); printf(“3、运行时间“); scanf(“%d“,&pcbi.time); for(y=0;y0)jilu=0; else printf(“输入已经完成n您输入的数据为:n进程名: %sn优先级: %dn运行时间: %dn“,pcbi.name,pcbi.order
5、,pcbi.time); printf(“-n“); strcpy(ghosti.name,pcbi.name); ghosti.order=pcbi.order; ghosti.time=pcbi.time; pcbi.status=1; ghosti.status=1; pcbi.wtime=pcbi.time; pcbi.ytime=0; i+; voidblock() intm; printf(“n请输入您要改变状态的进程的进程名: “); scanf(“%s“,&a_name); for(y=0;y=i;y+) if(strcmp(pcby.name,a_name)=0) a=1;
6、if(pcby.status=0) printf(“您要修改的进程已经是阻塞状态,无法更改n“); if(pcby.status=2) pcby.status=0; for(m=0;m=i;m+) if(strcmp(ghostm.name,a_name)=0) ghostm.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
7、+) if(strcmp(pcby.name,a_name)=0) a=1; if(pcby.status=1) printf(“您要修改的进程已经是就绪状态,无法更改n“); break; ; if(pcby.status=0) pcby.status=1; for(m=0;m=i;m+) if(strcmp(ghostm.name,a_name)=0) ghostm.status=1; printf(“操作已完成,进程成功改为运行状态n“); break; if(a=0) printf(“对不起!您查找的进程名不存在n“); a=0;voidstop() printf(“n请输入您要改变状
8、态的进程的进程名: “); scanf(“%s“,&a_name); for(y=0;y=i;y+) if(strcmp(pcby.name,a_name)=0) a=1; for(;yi;y+) pcby=pcby+1; i-; printf(“操作已完成,进程成功删除n“); break; if(a=0) printf(“对不起!您查找的进程名不存在n“); a=0;voidoutPut() if(i=0) printf(“对不起,没有进程存在,无法显示n“); else printf(“nn 已存在进程分别为:(状态:2表示正在运行,1表示就绪,0表示阻塞)n“); for(y=0;yi
9、;y+) if(pcby.status!=3)printf(“进程%d 进程名: %s 状态:%dn“,y+1,pcby.name,pcby.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(“
10、您输入的指令有误,请重新输入n“); break; voidorder_control() intjishi;/用于CPU运行时间计时 jishi=0; charpanduan1,panduan2;/用于判断是否继续调度 structghostjiaohuan; intgg,bl; for(gg=0;ggi;gg+) if(pcbgg.status=2) for(bl=0;bli;bl+) if(strcmp(ghostbl.name,pcbgg.name)=0) ghostbl.status=2; for(x=0;xi-1;x+) for(y=x+1;yi;y+) if(ghostx.ord
11、erghosty.order) jiaohuan=ghostx; ghostx=ghosty; ghosty=jiaohuan; /以上语句是根据优先级为进程排序 printf(“nn按照优先级调度进程,具体内容为:n“); for(x=0;xi;x+) if(ghostx.status=1) printf(“正在运行的进程: %sn优先级: %dn运行时间: %dnnn“,ghostx.name,ghostx.order,ghostx.time); for(y=0;y=i;y+) if(strcmp(pcby.name,ghostx.name)=0) pcby.status=2; ghost
12、x.status=2; ;/该语句用于更改另一个结构体进程的状态 printf(“是否继续运行直至进程运行完毕(Y/N)“); scanf(“%s“,&panduan1); if(panduan1=Y|panduan1=y) if(ghostx.status=2) jishi=jishi+ghostx.time; printf(“CPU运行时间%d,进程%s运行完毕,正在关闭!n“,jishi,ghostx.name); for(y=0;y=i;y+) if(strcmp(pcby.name,ghostx.name)=0) pcby.status=3; ghostx.status=3; ;/该
13、语句用于更改另一个结构体进程的状态 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用于表示状态为就
14、绪的进程的个数kz6用于更改ghost的状态值 =0;kz2=0;kz4=0;kz5=0; for(y=0;yi;y+) if(pcby.status=1) kz5=kz5+1; printf(“nn请输入时间片长度:“); scanf(“%d“,&x); printf(“nn按照时间片轮转调度进程,具体内容为:n“); if(kz5!=0) for(;kz4kz5;) for(y=0;yi;y+) if(pcby.status=1|pcby.status=2) for(kz1=0;kz1x;kz1+) if(pcby.status=1|pcby.status=2) kz2=kz2+1; pc
15、by.wtime=pcby.wtime-1; pcby.ytime=pcby.ytime+1; printf(“CPU运行时间:%d,正在运行进程:%sn“,kz2,pcby.name); printf(“进程名 已运行时间 未运行时间 要求运行时间n“); for(kz3=0;kz3i;kz3+) if(pcbkz3.status=1|pcbkz3.status=2) printf(“%s%12d%12d%12dn“,pcbkz3.name,pcbkz3.ytime,pcbkz3.wtime,pcbkz3.time); if(pcby.wtime=0&pcby.status!=3) prin
16、tf(“进程%s运行完毕,正在关闭!n-n“,pcby.name); kz4=kz4+1; pcby.status=3; for(kz6=0;kz6i;kz6+) if(strcmp(ghostkz6.name,pcby.name)=0) ghostkz6.status=3; kz1=x; break; printf(“-n“); printf(“注意:如果未输出过程,请检查就绪列表是否存在进程n“);voidmain() charc; for(;1;) printf(“系统主菜单n“); printf(“1、创建n“); printf(“2、阻塞n“); printf(“3、唤醒n“); p
17、rintf(“4、终止n“); printf(“5、显示n“); printf(“6、调度n“); printf(“0、退出n“); printf(“请输入操作指令: “); if(scanf(“%d“,&x) if(x=0) break; switch(x) case1: insert(); break; case2: block(); break; case3: rouse(); break; case4: stop(); break; case5: outPut(); break; case6: control(); break; case0: break; default: print
18、f(“格式非法,请重新输入n“); break; elseif(scanf(“%c“,&c) printf(“格式非法,请重新输入n“); 七、程序中使用的数据结构及符号说明structpcb charname10; intstatus; intorder; inttime; intwtime; intytime;pcb11;/该结构体用于存储已经输入的进程structghost charname10; intstatus; intorder; inttime;ghost11;/该结构体用于优先级调度时,进程的优先级排序voidinsert();/添加进程voidblock();/阻塞进程voidrouse();/唤醒进程voidstop();/删除进程voidoutPut();/输出voidcontrol();/实验二添加函数voidorder_control();/实验二添加函数voidtime_control();/实验二添加函数八、调试程序时出现问题及解决方法问题一: 现象:使用阻塞功能后,输出功能无法正常显示进程状态。 解决:在进程的结构体中添加控制进程状态的变量。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1