// test1.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
typedef char ElemType;
struct LNode{
ElemType data;
LNode* next;
};
struct LinkQueue{
LNode* front;
LNode* rear;
};
#include "链接队列.h"
int PCB=0;
/*1.初始化链队列 InitQueue */
/*2.插入一个元素到链队列 EnQueue */
/*3.删除头结点元素并返回 OutQueue */
/*4.读队列首元素 PeekQueue */
/*5.检查链队列是否为空 EmptyQueue*/
/*6.清楚队列所有元素,置空 ClearQueue*/
//LinkQueue BlockQ,ReadyQ,ProcessQ;//阻塞,就绪,运行。队列
// InitQueue(ReadyQ);//初始化
// InitQueue(BlockQ);//初始化
// InitQueue(ProcessQ);//初始化
void menu() //菜单||帮助
{
cout<<"功能表-------帮助菜单"<<endl;
cout<<"‘C’创建一个就绪进程"<<endl;
cout<<"‘B’阻塞当前执行进程"<<endl;
cout<<"‘P’执行一个就绪进程"<<endl;
cout<<"‘T’当前进程时间片到"<<endl;
cout<<"‘E’结束当前执行进程"<<endl;
cout<<"‘W’唤醒阻塞队列进程"<<endl;
cout<<"‘S’显示当前OS进程状态"<<endl;
cout<<"‘H’操作帮助"<<endl;
cout<<"‘Q’退出程序"<<endl;
cout<<" 请输入操作字: ";
cout<<"(‘R’随机运行上述功能)"<<endl;
// cout<<"按任意键继续操作。。。。。。。。"<<endl;
}
void Display(LinkQueue& BlockQ,LinkQueue& ReadyQ,LinkQueue& ProcessQ) //状态显示
{
// system("cls");
cout<<"\n=================================================="<<endl;
cout<<"当前就绪态进程: ";
LNode* p=ReadyQ.front;
if(p==NULL)cout<<"无就绪进程。"<<endl;
while(p!=NULL)
{
cout<<p->data<<'\t';
p=p->next;
}
cout<<endl;
cout<<"当前阻塞态进程: ";
p=BlockQ.front;
if(p==NULL)cout<<"无阻塞态进程。"<<endl;
while(p!=NULL)
{
cout<<p->data<<'\t';
p=p->next;
}
cout<<endl;
cout<<"当前执行态进程: ";
p=ProcessQ.front;
if(p==NULL)cout<<"无执行态进程。"<<endl;
while(p!=NULL)
{
cout<<p->data<<'\t';
p=p->next;
}
cout<<endl;
cout<<"剩余PCB数量:"<<9-PCB+1<<endl;
cout<<"\n======================================================"<<endl;
}
void main()
{
LinkQueue BlockQ,ReadyQ,ProcessQ;//阻塞,就绪,运行。队列
InitQueue(ReadyQ);//初始化
InitQueue(BlockQ);//初始化
InitQueue(ProcessQ); //初始化
char flag; menu(); //选择函数标志
while(1)
{
cin>>flag;
while(flag=='R')
{
switch(rand()%6)
{
case 0: flag='C';break;
case 1: flag='B';break;
case 2: flag='P';break;
case 3: flag='T';break;
case 4: flag='E';break;
case 5: flag='W';break;
//case 6: flag='S';break;
}
break;
}
switch(flag)
{
C0: case 'C':
char x;
//int i;
cout<<"\n*********创建进程功能**************"<<endl;
if(PCB<=9)
{
cout<<"请输入进程名称:";
LNode* t=ReadyQ.front;
LNode* m=ProcessQ.front;
LNode* b=BlockQ.front;
cin>>x;
C1: while(t!=NULL||b!=NULL||m!=NULL){
if(t!=NULL)
{
if(x==t->data){
cout<<"\n**************"<<endl;
cout<<"*进程名称重复*"<<endl;
cout<<"**************"<<endl;
goto C0;}
else t=t->next;goto C1;
}
if(b!=NULL)
{
if(x==b->data){
cout<<"\n**************"<<endl;
cout<<"*进程名称重复*"<<endl;
cout<<"**************"<<endl;
goto C0;}
else b=b->next;goto C1;
}
if(m!=NULL)
{
if(x==m->data){
cout<<"\n**************"<<endl;
cout<<"*进程名称重复*"<<endl;
cout<<"**************"<<endl;
goto C0;}
else m=m->next;goto C1;
}
else break;
}
/////////////////////////////////////
EnQueue(ReadyQ,x);
/////////////////////////////////////
cout<<"成功创建一个进程"<<x<<endl;
PCB++;
if(EmptyQueue(ProcessQ))
{goto P1;}
break;
}
else
cout<<"没有PCB不能创建进程"<<endl;
break;
case 'B':
char temp;
cout<<"\n*********阻塞进程功能**************"<<endl;
if(!EmptyQueue(ProcessQ))//非空
{
temp=OutQueue(ProcessQ);
cout<<"进程"<<temp<<"被阻塞"<<endl;
EnQueue(BlockQ,temp);
if(EmptyQueue(ProcessQ))
{ goto P1;}
break;
}
else
cout<<"无执行态进程,不能阻塞"<<endl;
break;
case 'W':
cout<<"\n*********唤醒进程功能**************"<<endl;
if(!EmptyQueue(BlockQ))//非空
{
cout<<"进程"<<PeekQueue(BlockQ)<<"被唤醒进入就队列。"<<endl;
EnQueue(ReadyQ,OutQueue(BlockQ));
if(EmptyQueue(ProcessQ))
{ goto P1;}
break;
}
else
cout<<"无阻塞进程,不能唤醒。"<<endl;
break;
P1: case 'P':
cout<<"\n*********执行就绪态进程功能**************"<<endl;
if(EmptyQueue(ProcessQ))//非空
{
if(EmptyQueue(ReadyQ)){cout<<"无就绪态进程。"<<endl;break;}
else
cout<<"进程"<<PeekQueue(ReadyQ)<<"执行。"<<endl;
EnQueue(ProcessQ,OutQueue(ReadyQ));break;
}
else if(!EmptyQueue(ProcessQ))
{
cout<<PeekQueue(ProcessQ)<<"进程正在执行";
cout<<",执行态进程最多只有一个。";
break;
}
case 'E':
cout<<"\n*********结束执行态进程功能**************"<<endl;
if(!EmptyQueue(ProcessQ))//非空
{
cout<<OutQueue(ProcessQ)<<" 进程结束"<<endl;
PCB--;
if(EmptyQueue(ProcessQ))
{goto P1;}
break;
}
else cout<<"无执行状进程,不能终止。"<<endl;break;
case 'T':
cout<<"\n*********时间片到功能**************"<<endl;
if(!EmptyQueue(ProcessQ))//非空
{char temp;
temp=OutQueue(ProcessQ);
EnQueue(ReadyQ,temp);
cout<<temp<<" 时间片到,载入就绪队列。 "<<endl;
if(EmptyQueue(ProcessQ))
{
goto P1;
}
break;
}
else cout<<"无执行状进程"<<endl;break;
case 'S':
cout<<"\n*********显示进程状态**************"<<endl;
Display(BlockQ,ReadyQ,ProcessQ);break;
case 'H': cout<<"\n*********帮助功能**************"<<endl;
menu();break;
case 'Q': cout<<"\n*********正在退出。。。。。**********"<<endl;
exit(0);break;
default :cout<<"没有此选C项,重新选择:"<<endl;break;
}
Display(BlockQ,ReadyQ,ProcessQ);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
利用简单的结构和控制方法模拟进程结构、进程状态和进程控制。 (二) 实验内容与步骤: 用PCB表示整个进程实体,利用随机数方法或键盘控制方法模拟进程执行中产生的事件。或者利用鼠标或者键盘中断的基于图形接口方式的进程控制管理。 具体过程: 1、 定义PCB(可以采用静态结构或动态结构):包括理论PCB中的基本内容,如内部ID、外部ID、进程状态、队列指针。由于无法实现真正的进程创建功能,在实验中只需建立PCB,用它代表完整的进程。 2、 定义进程状态转换方式:进程的状态转换是由进程内部操作或操作系统的控制引起,由于无法实现这些功能,学生可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序。随机方法指产生1-6的随机数,分别代表创建进程(c)、结束进程(e)、进程阻塞(b)、激活进程(w)、调度进程(p)、时间片到(t)等事件;键盘模拟方法指定义6种按键代表以上6种事件。 3、 根据四种事件处理就绪队列、阻塞队列和当前执行中的进程。 4、 每次事件处理后应形象地显示出当前系统中的执行进程是哪一个,就绪队列和阻塞队列分别包含哪些进程。
资源推荐
资源详情
资源评论
收起资源包目录
osNEW.rar (14个子文件)
我的osNEW
test1.dsw 518B
test1.opt 53KB
test1.plg 1KB
test1.ncb 49KB
test1.cpp 6KB
链接队列.h 1KB
Debug
test1.ilk 289KB
test1.obj 30KB
test1.pdb 577KB
test1.pch 271KB
vc60.idb 81KB
test1.exe 216KB
vc60.pdb 60KB
test1.dsp 3KB
共 14 条
- 1
资源评论
- tangshi112012-12-25感觉不错,不知道能不能用
- sodog022012-10-30界面出现了小小的问题,如:一定要区分大小写才可执行该程序
- hongmiemie05022013-05-11实验检查没用上,给同学了。同学说有bug,运行是偶尔会崩溃
yexiangyan
- 粉丝: 2
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功