模拟进程创建、终止、阻塞、唤醒原语--附带注释(共13页)_第1页
模拟进程创建、终止、阻塞、唤醒原语--附带注释(共13页)_第2页
模拟进程创建、终止、阻塞、唤醒原语--附带注释(共13页)_第3页
模拟进程创建、终止、阻塞、唤醒原语--附带注释(共13页)_第4页
模拟进程创建、终止、阻塞、唤醒原语--附带注释(共13页)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目:计算机操作系统模拟院系:信息学院专业:计算机科学与技术 班级:2013级1班辽宁大学实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。三、实验环境:1、硬件:pc机及其兼容机。2、软件:Windows XP,Turbo C或C+、VC+等。四、实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。2、设计主函数,采用菜单结构(参见后面给出的流程图)。3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看

2、各队列中进程的变化情况。五、实验要求:进程名:用P1,P2标识。优先级:为实验题目二做准备。运行时间:为实验题目二做准备。状态为:就绪、运行、阻塞,三种基本状态。指针:指向下一个PCB。1、进程PCB中应包含以下内容:进程名优先级运行时间状态指针2、系统总体结构:开始系统主菜单1创建2阻塞3唤醒4终止5显示0退出请输入您需要的功能(05):输入选择=?543210退出创建阻塞唤醒终止显示结束另加实验二:模拟进程调度功能/*PCB的组织方式:线性方式*/#include "stdio.h"#include "string.h"#include "

3、windows.h"typedef structchar p_name10;/进程名char p_pro;/优先级 1-3个级别 1.低 2.中 3.高char p_status;/运行状态 0.阻塞 1.运行 2.就绪int p_runtime;/运行时间int p_wait;/等待时间struct PCB *next;/指针,指向下一个PCBPCB;void Run(PCB *head)/任何时候保证程序里面至少有一个进程在运行PCB *p=head->next;/直接将P指向第一个结点while(p!=NULL)/遍历一遍链表,将所有就绪队列等待时间加1,防止前面结点因为

4、唤醒又进入运行状态if(p->p_status='2')p->p_wait+;/将等待时间加1p=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;

5、p=p->next;return;void Insert(PCB *head,PCB *temp)/插入链表函数PCB *p;p=head;/将头结点保存起来while(p->next!=NULL)p=p->next;p->next=temp;temp->next=NULL; int Check(PCB *head,PCB *temp)PCB *p=head;while(p->next)p=p->next;if(strcmp(p->p_name,temp->p_name)=0)return 0;return 1;void Create(PC

6、B *head)/创建进程函数int chk=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("进程队列已有该名称进程,创建失败,即将返回主界面

7、.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请输入该进程状态:&

8、quot;);scanf("%c",&temp->p_status);getchar();*/Insert(head,temp);/调用插入链表函数system("pause");Run(head);void Show(PCB *head)/显示队列进程函数int ready=1,block=1,run=1;PCB *p=head,*q;system("cls");if(p->next=NULL)printf("目前系统中没有进程.请返回主界面创建进程!n");system("paus

9、e");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(" 进程等待时间:%dn",q->p_wait

10、);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(" 进程运行时间:%dn",q->p_runtime);/printf(" 进程已运行时

11、间:");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(" 进程等待时间:%dn

12、",q->p_wait);q=q->next;printf("n");printf("进程显示完毕.");system("pause");void Block(PCB *head)/阻塞进程函数char name10;PCB *p=head;/保护头结点system("cls");printf("t-阻塞进程-n");printf("n输入你要放入阻塞队列的进程名称:");scanf("%s",name);getchar();p=p-

13、>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将该进程放入阻塞队列nn");system("pause");p->p_status='0'printf("n该进程已经被放入阻

14、塞队列n");system("pause");elseif(p->p_status='0')printf("n该进程已在阻塞队列中.n");system("pause");if(p->p_status='2')printf("n该进程正在就绪队列中.不可放入阻塞队列n");system("pause");Run(head);void Delete(PCB *head,PCB *temp)/*head为链表头结点,temp为将要删除的结点*/P

15、CB *p=head,*q=temp->next;while(p->next!=temp)p=p->next;p->next=q;free(temp);void Stop(PCB *head)/终止进程函数char name10;PCB *p=head;system("cls");printf("t-终止进程-n");printf("n输入你要终止的进程名称:");scanf("%s",name);getchar();p=p->next;while(p)if(strcmp(p->

16、p_name,name)=0)break;p=p->next;if(!p)printf("进程队列中无该进程.n");system("pause");Delete(head,p);/调用删除结点函数printf("n进程终止成功n");system("pause");Run(head);void Wakeup(PCB *head)/唤醒进程函数char name10;PCB *p=head;/保护头结点system("cls");printf("t-唤醒进程-n");p

17、rintf("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将该进程放回就绪队

18、列中n");system("pause");p->p_status='2'p->p_wait=2;printf("n该进程已经被放入就绪队列中n");system("pause");elseif(p->p_status='1')printf("n该进程正在运行.不可唤醒n");system("pause");if(p->p_status='2')printf("n该进程正在就绪队列中.不可唤醒n"

19、;);system("pause");void prior_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_pro < p->p_pro)temp=p;/将此时优先级最大的结点地址给临时空间保存p=p

20、->next;printf("nn");printf("经过调度,此时程序中运行的进程是:n");printf("n 进程名:%s",temp->p_name);printf(" 进程优先级:%c",temp->p_pro);printf(" 进程运行时间:%dn",temp->p_runtime);printf("n该进程PCB显示完毕!n");system("pause");Delete(head,temp);Run(head)

21、;void time_Sche(PCB *head)int ready=1;PCB *p=head,*q,*temp=NULL;/保护头结点p,temp为时间片用完将要删除时,保护的临时结点system("cls");if(p->next=NULL)printf("目前系统中没有进程.请返回主界面创建进程!n");system("pause");return;/*列出就绪队列列表*/q=p->next;/指针指到第一个结点printf("n-就绪队列-n");while(q)if(q->p_sta

22、tus='2')printf("%d)进程名:%s",ready+,q->p_name);printf(" 进程优先级:%c",q->p_pro);printf(" 进程运行时间:%dn",q->p_runtime-);/printf(" 进程已运行时间:");if(q->p_runtime=0)temp=q;q=q->next;if(temp!=NULL)Delete(head,temp);printf("n");system("paus

23、e");void Scheduling(PCB *head)/调度程序while(1)int choose;system("cls");printf("1.优先级调度n");printf("2.时间片调度n");printf("0.返回主菜单n");printf("n请输入选项:");scanf("%d",&choose);getchar();switch(choose)case 1:prior_Sche(head);break;case 2:time_Sc

24、he(head);break;case 0: system("cls"); return;break;default:printf("请输入0-2的数字n");system("pause");system("cls");break;void Menu()printf("t-模拟系统进程创建、终止、阻塞、唤醒-");printf("n");printf("1.进程创建n");printf("2.阻塞进程n");printf("3.唤醒进程n");printf("4.终止进程n");printf("5.显示进程n");printf("6.调度进程n");printf("0.退出n");printf("nn");printf("t-完美分割线-n");printf("功能介绍:n");printf(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论