您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 模拟进程创建、终止、阻塞、唤醒原语--附带注释
题目:计算机操作系统模拟院系:信息学院专业:计算机科学与技术班级:2013级1班辽宁大学实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。三、实验环境:1、硬件:pc机及其兼容机。2、软件:WindowsXP,TurboC或C++、VC++等。四、实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。2、设计主函数,采用菜单结构(参见后面给出的流程图)。3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。五、实验要求:1、进程PCB中应包含以下内容:进程名优先级运行时间状态指针2、系统总体结构:系统主菜单1…创建2…阻塞3…唤醒4…终止5…显示0…退出请输入您需要的功能(0-5):进程名:用P1,P2标识。优先级:为实验题目二做准备。运行时间:为实验题目二做准备。状态为:就绪、运行、阻塞,三种基本状态。指针:指向下一个PCB。输入选择=?创建阻塞唤醒终止显示退出开始结束012345另加实验二:模拟进程调度功能/*PCB的组织方式:线性方式*/#includestdio.h#includestring.h#includewindows.htypedefstruct{charp_name[10];//进程名charp_pro;//优先级1-3个级别1.低2.中3.高charp_status;//运行状态0.阻塞1.运行2.就绪intp_runtime;//运行时间intp_wait;//等待时间structPCB*next;//指针,指向下一个PCB}PCB;voidRun(PCB*head)//任何时候保证程序里面至少有一个进程在运行{PCB*p=head-next;//直接将P指向第一个结点while(p!=NULL)//遍历一遍链表,将所有就绪队列等待时间加1,防止前面结点因为唤醒又进入运行状态{if(p-p_status=='2'){p-p_wait++;//将等待时间加1}p=p-next;}p=head-next;//将P重置在第一个结点while(p-p_status!='1'&&p!=NULL){if(p-p_status=='2')//防止线性链表前面的结点因为从阻塞唤醒后又进入运行状态{p-p_status='1';p-p_wait=2;}if(p-p_status=='1')//对上一个if进行处理{return;}p=p-next;}return;}voidInsert(PCB*head,PCB*temp)//插入链表函数{PCB*p;p=head;//将头结点保存起来while(p-next!=NULL){p=p-next;}p-next=temp;temp-next=NULL;}intCheck(PCB*head,PCB*temp){PCB*p=head;while(p-next){p=p-next;if(strcmp(p-p_name,temp-p_name)==0)return0;}return1;}voidCreate(PCB*head)//创建进程函数{intchk=0;PCB*temp;//申请临时存储空间,方便接受数据temp=(PCB*)malloc(sizeof(PCB));system(cls);printf(\t----------进程创建-----------\n);printf(\n请输入进程名:);scanf(%s,temp-p_name);getchar();/*检查进程名称,如果相同则返回主界面*/chk=Check(head,temp);if(chk==0){printf(进程队列已有该名称进程,创建失败,即将返回主界面.\n);system(pause);return;}printf(\n请输入进程优先级(1.低2.中3.高):);scanf(%c,&temp-p_pro);getchar();printf(\n请输入进程运行时间:);scanf(%d,&temp-p_runtime);getchar();temp-p_status='2';temp-p_wait=2;/*printf(\n请输入该进程状态:);scanf(%c,&temp-p_status);getchar();*/Insert(head,temp);//调用插入链表函数system(pause);Run(head);}voidShow(PCB*head)//显示队列进程函数{intready=1,block=1,run=1;PCB*p=head,*q;system(cls);if(p-next==NULL){printf(目前系统中没有进程.请返回主界面创建进程!\n);system(pause);return;}/*列出就绪队列列表*/q=p-next;//指针指到第一个结点printf(\n--就绪队列--\n);while(q){if(q-p_status=='2'){printf(%d)进程名:%s,ready++,q-p_name);printf(进程优先级:%c,q-p_pro);printf(进程运行时间:%d,q-p_runtime);printf(进程等待时间:%d\n,q-p_wait);}q=q-next;}printf(\n);/*列出运行队列列表*/q=p-next;//将指针重置到第一个结点printf(\n--运行队列--\n);while(q){if(q-p_status=='1'){printf(%d)进程名:%s,run++,q-p_name);printf(进程优先级:%c,q-p_pro);printf(进程运行时间:%d\n,q-p_runtime);//printf(进程已运行时间:);}q=q-next;}printf(\n);/*列出阻塞队列列表*/q=p-next;printf(\n--阻塞队列--\n);while(q){if(q-p_status=='0'){printf(%d)进程名:%s,block++,q-p_name);printf(进程优先级:%c,q-p_pro);printf(进程运行时间:%d,q-p_runtime);printf(进程等待时间:%d\n,q-p_wait);}q=q-next;}printf(\n);printf(进程显示完毕.);system(pause);}voidBlock(PCB*head)//阻塞进程函数{charname[10];PCB*p=head;//保护头结点system(cls);printf(\t----------阻塞进程-----------\n);printf(\n输入你要放入阻塞队列的进程名称:);scanf(%s,name);getchar();p=p-next;while(p){if(strcmp(p-p_name,name)==0)break;p=p-next;}if(!p){printf(\n队列中无该进程.\n);system(pause);}if(p-p_status=='1'){printf(\n该进程正在运行.\n);printf(\n将该进程放入阻塞队列\n\n);system(pause);p-p_status='0';printf(\n该进程已经被放入阻塞队列\n);system(pause);}else{if(p-p_status=='0'){printf(\n该进程已在阻塞队列中.\n);system(pause);}if(p-p_status=='2'){printf(\n该进程正在就绪队列中.不可放入阻塞队列\n);system(pause);}}Run(head);}voidDelete(PCB*head,PCB*temp)/*head为链表头结点,temp为将要删除的结点*/{PCB*p=head,*q=temp-next;while(p-next!=temp){p=p-next;}p-next=q;free(temp);}voidStop(PCB*head)//终止进程函数{charname[10];PCB*p=head;system(cls);printf(\t----------终止进程-----------\n);printf(\n输入你要终止的进程名称:);scanf(%s,name);getchar();p=p-next;while(p){if(strcmp(p-p_name,name)==0)break;p=p-next;}if(!p){printf(进程队列中无该进程.\n);system(pause);}Delete(head,p);//调用删除结点函数printf(\n进程终止成功\n);system(pause);Run(head);}voidWakeup(PCB*head)//唤醒进程函数{charname[10];PCB*p=head;//保护头结点system(cls);printf(\t----------唤醒进程-----------\n);printf(\n输入你要唤醒的进程名称:);scanf(%s,name);getchar();p=p-next;while(p){if(strcmp(p-p_name,name)==0)break;p=p-next;}if(!p){printf(阻塞队列中无该进程名称.\n);system(pause);return;}if(p-p_status=='0'){printf(该进程正在阻塞队列中.\n);printf(\n将该进程放回就绪队列中\n);system(pause);p-p_status='2';p-p_wait=2;printf(\n该进程已经被放入就绪队列中\n);system(pause);}else{if(p-p_status=='1'){printf(\n该进程正在运行.不可唤醒\n);system(pause);}if(p-p_status=='2'){printf(\n该进程正在就绪队列中.不可唤醒\n);system(pause);}}}voidprior_Sche(PCB*head){PCB*p=head-next,*temp=head-next;//保护头结点p,temp为将要删除的结点system(cls);if(p==NULL){printf(目前系统中没有进程.请返回主界面创建进程!\n);system(pause);return;}while(p){if(temp-p_prop-p_pro){temp=p;//将此时优先级最大的结点地址给临时空间保存}p=p-next;}printf(\n\n);printf(经过调度,此时程序中运行的进程是:\n);printf(\n进程名:%s,temp-p_name);printf(进程优先级:%c,temp-p_pro);printf(进程运行时间:%d\n,temp-p_runtime);printf(\n该进程PCB显示完毕!\n);system(pause);Delete(head,temp);Run(head);}voidtime_Sche(PCB*head){intready=1;PCB*p=head,*q,*temp=NULL;//保护头结点p,temp为时间片用完将要删除时,保护的临时结点system(cls);if(p-next==NULL){printf(目前系统中没有进程.请返回主界面创建进程!\n);system(pause);return;}/*列出就绪队列列表*/q=p-next;//指针指
本文标题:模拟进程创建、终止、阻塞、唤醒原语--附带注释
链接地址:https://www.777doc.com/doc-7094297 .html