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

上传人:罗晋 文档编号:8846301 上传时间:2021-01-19 格式:DOC 页数:13 大小:713.50KB
返回 下载 相关 举报
模拟进程创建、终止、阻塞、唤醒原语,操作系统原理.doc_第1页
第1页 / 共13页
模拟进程创建、终止、阻塞、唤醒原语,操作系统原理.doc_第2页
第2页 / 共13页
模拟进程创建、终止、阻塞、唤醒原语,操作系统原理.doc_第3页
第3页 / 共13页
模拟进程创建、终止、阻塞、唤醒原语,操作系统原理.doc_第4页
第4页 / 共13页
模拟进程创建、终止、阻塞、唤醒原语,操作系统原理.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《模拟进程创建、终止、阻塞、唤醒原语,操作系统原理.doc》由会员分享,可在线阅读,更多相关《模拟进程创建、终止、阻塞、唤醒原语,操作系统原理.doc(13页珍藏版)》请在三一文库上搜索。

1、操作系统原理 题 目:模拟进程创建、终止、阻塞、唤醒原语院 (部): 管理工程学院专 业: 信息管理与信息系统班 级: 信管112姓 名: 王楷仁 学 号: 2011021686 实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。三、实验环境:1、硬件:pc机及其兼容机。2、软件:Windows OS,Turbo C或C+、VC+、VS.net、Java等。四、实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。2、设计主函数,采用菜单结

2、构(参见后面给出的流程图)。3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。五、算法流程图 开始系统主菜单1创建2阻塞3唤醒4终止5显示0退出请输入您需要的功能(05):输入选择=?543210退出创建阻塞唤醒终止显示结束六、程序清单#include #include struct pcbchar name10;int status;int order;int time; int wtime; int ytime;pcb11;/该结构体用于存储已经输入的进程struct ghostchar name10;int status;int

3、 order;int time;ghost11;/该结构体用于优先级调度时,进程的优先级排序char a_name10;int i=0,y,a=0,x,z,jilu;void insert();void block();void rouse();void stop();void outPut();void control();/实验二添加函数void order_control();/实验二添加函数void time_control();/实验二添加函数void insert()jilu=0;/jilu是一个用于判断的变量,在重复时进行判断跳过if(i=10)printf(进程已经存在10个,

4、无法继续添加进程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,pcbi.time);printf(-n);strcpy(ghosti.name,pcbi.nam

5、e); ghosti.order=pcbi.order; ghosti.time=pcbi.time;pcbi.status=1; ghosti.status=1; pcbi.wtime=pcbi.time; pcbi.ytime=0; i+;void block()int m;printf(n请输入您要改变状态的进程的进程名: );scanf(%s,&a_name);for(y=0;y=i;y+)if(strcmp(pcby.name,a_name)=0)a=1;if(pcby.status=0)printf(您要修改的进程已经是阻塞状态,无法更改n);if(pcby.status=2)pc

6、by.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;void rouse()int m;printf(n请输入您要改变状态的进程的进程名: );scanf(%s,&a_name);for(y=0;y=i;y+)if(strcmp(pcby.name,a_name)=0)a=1;if(pcby.status=1)printf(您要修改的进程已经是就绪状态,无法更改n);break

7、;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;void stop()printf(n请输入您要改变状态的进程的进程名: );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

8、(操作已完成,进程成功删除n);break;if(a=0)printf(对不起!您查找的进程名不存在n);a=0;void outPut()if(i=0)printf(对不起,没有进程存在,无法显示n);elseprintf(nn 已存在进程分别为:(状态:2表示正在运行,1表示就绪,0表示阻塞)n);for(y=0;yi;y+)if(pcby.status!=3)printf(进程%d 进程名: %s 状态: %dn,y+1,pcby.name,pcby.status);void control()for(;1;)printf(进程调度子菜单n0 :返回主菜单n1 :优先级调度n2 :时间片

9、轮转调度n请输入您想要进行的操作的指令 :);scanf(%d,&x);if(x=0)break;switch(x)case 0:break;case 1:order_control();break;case 2:time_control();break;default:printf(您输入的指令有误,请重新输入n);break;void order_control()int jishi;/用于CPU运行时间计时 jishi=0; char panduan1,panduan2;/用于判断是否继续调度 struct ghost jiaohuan;int gg,bl;for(gg=0;ggi;gg

10、+)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.orderghosty.order)jiaohuan=ghostx;ghostx=ghosty;ghosty=jiaohuan;/以上语句是根据优先级为进程排序printf(nn按照优先级调度进程,具体内容为:n);for(x=0;xi;x+)if(ghostx.status=1)printf(正在运行的进程: %sn优先级: %d

11、n运行时间: %dnnn,ghostx.name,ghostx.order,ghostx.time); for(y=0;y=i;y+) if(strcmp(pcby.name,ghostx.name)=0) pcby.status=2; ghostx.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

12、运行完毕,正在关闭!n,jishi,ghostx.name); for(y=0;y=i;y+) if(strcmp(pcby.name,ghostx.name)=0) pcby.status=3; ghostx.status=3;/该语句用于更改另一个结构体进程的状态 if(x=(i-1) printf(所有进程全部运行完毕!n-n); else printf(-n是否继续调度(y/n); scanf(%s,&panduan2); if(panduan2=N|panduan2=n)break; else break;printf(如果无输出内容,请检查就绪队列是否存在进程);void time

13、_control()int z,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(pcby.status=1)kz5=kz5+1;printf(nn请输入时间片长度: );scanf(%d,&x);printf(nn按照时间片轮转调度进程,具体内容为:n);if(kz5!=0)for(;kz4kz5;) for(y=0;yi;y+) i

14、f(pcby.status=1|pcby.status=2) for(kz1=0;kz1x;kz1+) if(pcby.status=1|pcby.status=2) kz2=kz2+1; pcby.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

15、%12dn,pcbkz3.name,pcbkz3.ytime,pcbkz3.wtime,pcbkz3.time); if(pcby.wtime=0&pcby.status!=3) printf(进程 %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);void ma

16、in()char c;for(;1;)printf(系统主菜单n);printf(1、创建n);printf(2、阻塞n);printf(3、唤醒n);printf(4、终止n );printf(5、显示n);printf(6、调度n);printf(0、退出n);printf(请输入操作指令 : );if(scanf(%d,&x)if(x=0)break;switch(x)case 1:insert();break;case 2:block();break;case 3:rouse();break;case 4:stop();break;case 5:outPut();break;case

17、6:control();break;case 0:break;default:printf(格式非法,请重新输入n);break;else if(scanf(%c,&c)printf(格式非法,请重新输入n);七、程序中使用的数据结构及符号说明struct pcbchar name10;int status;int order;int time; int wtime; int ytime;pcb11;/该结构体用于存储已经输入的进程struct ghostchar name10;int status;int order;int time;ghost11;/该结构体用于优先级调度时,进程的优先级排序void insert();/添加进程void block();/阻塞进程void rouse();/唤醒进程void stop();/删除进程void outPut();/输出void control();/实验二添加函数void order_control();/实验二添加函数void time_control();/实验二添加函数八、调试程序时出现问题及解决方法问题一:现象:使用阻塞功能后,输出功能无法正常显示进程状态。解决:在进程的结构体中添加控制进程状态的变量。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1