操作系统原理 题 目:模拟进程创建、终止、阻塞、唤醒原语 院(部):
管理工程学院 专 业:
信息管理与信息系统 班 级:
信管 姓 名:
学 号:
实验题目一:模拟进程创建、终止、阻塞、唤醒原语 一、题目类型:必做题目。
二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。
三、实验环境:
1、硬件:pc机及其兼容机。
2、软件:Windows OS,Turbo C或C++、VC++、VS.net、Java等。
四、实验内容:
1、设计创建、终止、阻塞、唤醒原语功能函数。
2、设计主函数,采用菜单结构(参见后面给出的流程图)。
3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。
五、算法流程图 开始 系统主菜单 1…创建 2…阻塞 3…唤醒 4…终止 5…显示 0…退出 请输入您需要的功能(0-5):
输入选择=? 5 4 3 2 1 0 退出 创建 阻塞 唤醒 终止 显示 结束 六、程序清单 #include #include struct pcb { char name[10];int status;int order;int time;int wtime;int ytime;}pcb[11];//该结构体用于存储已经输入的进程 struct ghost { char name[10];int status;int order;int time;}ghost[11];//该结构体用于优先级调度时,进程的优先级排序 char a_name[10];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个,无法继续添加进程\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;y0)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++;} } } void block(){ int m;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;} void rouse(){ int m;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;} void stop(){ printf(“\n请输入您要改变状态的进程的进程名: “);scanf(“%s“,&a_name);for(y=0;y<=i;y++){ if(strcmp(pcb[y].name,a_name)==0){ a=1;for(;y现象:使用阻塞功能后,输出功能无法正常显示进程状态。
解决:在进程的结构体中添加控制进程状态的变量。
操作系统课程设计银行家算法模拟实现
操作系统课程设计编程序模拟银行家算法