进程创建与撤消

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
E.front=E.rear=(QueuePtr)malloc(sizeof(QNode));
if(!R.front) exit(OVERFLOW);
if(!E.front) exit(OVERFLOW);
R.front->next=NULL;
E.front ->next =NULL;
return OK;
int PRIORITY;
};PCB pcb[100]; //结构体数组
typedef struct QNode //单链表
{ int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct LinkQueue//链队列
{QueuePtr front;
④功能测试:从显示出的就绪队列状态,查看操作的正确与否。
(2)详细设计:
①数据结构定义:
结构体PCB:
struct PCB{
char NAME[10];
long ID;
float TIME;
int PRIORITY;
};PCB pcb[100];
②函数设计
给出CREATE()、KILL()、Display()、Main()的流程图描述;
}
}menu();
}
void kill()//进程终止
{ long id; QNode *p;
cout<<"请输入要终止的进程ID:";
cin>>id;
p=R.front->next;
if(p==NULL) cout<<"就绪进程为空!";
while(p!=NULL)
{if(id==pcb[N].ID)//终止进程是队列最后一个
(1)总体设计:
①数据结构定义:
结构体PCB:进程名、ID、运行时间、优先级等,队列的排序按创建时间或优先级排序。PCB空间—结构体PCB数组文档收集自网络,仅用于个人学习
就绪队列指针
空队列指针
②函数
CREATE()—进程创建:从PCB空间申请一个空PCB,填入进程参数,插入就绪队列;
KILL()—进程终止:将指定的就绪进程移出就绪队列,插入空队列;
{if(N==1) //队列中只有一个进程,且是终止进程
{R.front =R.rear;R.front ->next =NULL;N--;cout<<"进程已终止!";break;}文档收集自网络,仅用于个人学习
else //队列中进程多个
{while(p!=NULL)
{if(p->next->next ==NULL)
{pcb[p->data]=pcb[p->data+1];//修改PCB数组里的值
if(p->next ->next ==NULL)
{p->next =NULL;R.rear =p;cout<<"进程已终止!";break;}
p=p->next;
} N--; break;
}
p=p->next ;
}menu();
就绪队列输出函数Display()—输出就绪队列中的进程信息,以便观察创建或撤消活动的结果;
主函数Main()—功能选择、输入新进程参数、调用创建函数、输出就绪队列;输入进程名称、调用终止函数、输出就绪队列;文档收集自网络,仅用于个人学习
③主界面设计:进程创建、进程撤销、就绪队列显示菜单;数据输入和就绪队列显示区。
QueuePtr rear;
}LinkQueue;LinkQueue R,E;
int N,m;//N为当前进程数
void menu();
int InitQueue()//就绪队、空队的初始化
{ R.front=R.rear=(QueuePtr)malloc(sizeof(QNode));文档收集自网络,仅用于个人学习
}
void create()//进程创建
{ char name[20];long id;float time; int priority;
int n;QNode *p;
cout<<"请输入要创建进程的数目:";
cin>>n;
for(int i=1;i<=n;i++)
{cout<<"进程ID:";cin>>id;
for(int j=i-1;j<=N;j++)
{while(id==pcb[j].ID)
{cout<<"进程ID已存在"<<endl;
cout<<"进程ID:";cin>>id;
}
}
cout<<"进程名:";cin>>name;
cout<<"运行时间:";cin>>time;
cout<<"优先级:";cin>>priority;
p->data=N;p->next=NULL;
R.rear->next=p; R.rear=p;
}
for(i=1;i<=N;i++)//按优先级排队
{for(int j=i+1;j<=N;j++)
if(pcb[i].PRIORITY<pcb[j].PRIORITY)
{ pcb[0]=pcb[i];
pcb[i]=pcb[j];pcb[j]=pcb[0];
N++;//保存当前就绪进程数
strcpy(pcb[N].NAME,name);
pcb[N].ID =id;
pcb[N].TIME =time;
pcb[N].PRIORITY =priority;
p=(QueuePtr)malloc(sizeof(QNode));//插入就绪队列
if(!p) exit(OVERFLOW);
以CREATE()为例如下:
(3)调试与测试:列出你的测试结果,包括输入和输出。
四、实验总结
通过这次试验了解到了进城创建与撤销,并对以前的知识进行了复习,通过使用结构体和指针,实行进程的创建与撤销,我的程序设计能力得到提高,文档收集自网络,仅用于个人学习
五、附录
带注释的源程序。
#include<iostream.h>
实验一:进程创建与撤消(模拟)
一、实验目的
1、加深对进程概念的理解和进程创建与撤消算法;
2、进一步认识并发执行的实质。
二、实验内容
本实验完成如下三个层次的任务:
(1)系统级—以普通用户身份认识windows的进程管理。通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。文档收集自网络,仅用于个人学习
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
struct PCB //结构体PCB
{char NAME[20];
long ID;
float TIME;
p=p->next ;
}menu();
}
void exit()//退出系统;
{exit(0);}
void main()
{ InitQueue();
pcb[0].ID =0;
menu();
}Leabharlann Baidu
void menu()
{cout<<'\n'<<"1.进程创建"<<'\n'<<"2.进程撤销"<<'\n'<<"3.就绪队列显示"<<'\n'<<"4.退出"<<endl;文档收集自网络,仅用于个人学习
(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。
(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。
三、实验步骤
1、windows的进程管理
当前状态
切换前
切换后
撤销
2、VC++进程创建与撤销工具
3、进程创建与撤销的模拟实现
}
void display()
{QNode *p;
p=R.front->next;
cout<<"ID"<<" "<<"名字"<<" "<<"运行时间"<<" "<<"优先级"<<endl;文档收集自网络,仅用于个人学习
while(p!=NULL)
{ cout<<pcb[p->data].ID<<""<<pcb[p->data].NAME<<" "<<pcb[p->data].TIME <<" "<<pcb[p->data].PRIORITY<<endl;文档收集自网络,仅用于个人学习
{p->next =NULL;R.rear =p;N--;cout<<"进程已终止!";break;}p=p->next ;文档收集自网络,仅用于个人学习
}
}
}
if(id==pcb[p->data].ID)
{ if(R.front==R.rear)cout<<endl<<"队列为空!";
while(p!=NULL)
int choice;
cout<<"请选择:";
cin>>choice;
switch(choice)
{case 1:create();break;
case 2:kill();break;
case 3:display();break;
case 4:exit();
default :exit();
}
}
相关文档
最新文档