资源描述
****大学计算机科学系
实 验 报 告 书
实验题目: pcb的组织与维护
课程名称: 操作系统
主讲教师:
辅导教师:
课程编号:
班 级:
实验时间:
一、 实验目的:
1、通过编写和调试pcb组织与维护的模拟程序以加深对pcb组织与维护方案的理解。
2、通过编写和调试pcb组织与维护的模拟程序以加强对进程的基本情况以及进程的运行变化过程的进一步理解。
二、 实验环境:
VC 6.0++
三、 实验内容
1、通过线性方式对以pcb为唯一标志的进程进行创建、查询、添加、删除等操作。
2、通过索引方式对以pcb为唯一标志的进程进行创建、查询、添加、删除等操作。
3、通过链接方式对以pcb为唯一标志的进程进行创建、查询、添加、删除等操作。
四、 实验设计原理
1、 系统利用PCB来描述进程的基本情况以及进程的运行变化过程。PCB是进程存在的唯一标志,当系统创建一个进程时,为进程设置一个PCB,再利用PCB对进程进行管理和控制。撤销进程时,系统收回它的PCB,进程也随之消亡。进程是由程序、数据和进程控制块PCB三部分组成.PCB是进程的“灵魂”,由于进程控制块中保存了进程的地址信息,通过PCB可以得到进程程序的存储位置,也可以找到整个进程。
2、 为了便于管理,系统把所有的PCB用适当方式组织起来。一般来说,大致有以下三种组织方式:1、线性方式;2、索引方式;3、连接方式。通过这三种方式的组织进而对进程进行高效的管理。
五、 算法设计与流程
程序设计流程图如下:
1、 线性方式流程图:
否
是
是
是
否
否
是
开始
读入选择选择输入
输入是否是1
否
线性方式
是否是2
索引方式
输出:输入有误!请重新输入
请输入进程的个数
读入进程的个数n
保存这n个进程的信息,并创建n个进程
选择相应的操作
查询
添加
删除
返回首菜单
在已有的进程信息中查找对应进程号的进程信息
是否存在
输出进程信息
无该进程
把新的进程信息保存
在已有的进程信息中查找对应进程号的进程信息
是否存在
删除该进程
无该进程
线性方式代码:
#include <iostream>
#include <string>
using namespace std;
#define FALSE 0
#define TRUE 1
#define TASK_READY 3
#define TASK_WAITE 4
#define TASK_RUNNING 5
struct task_struct
{
string pname; //进程名
int pid;//进程号
int state;//进程当前状态/*3 就绪状态 4 等待状态 5运行状态*/
task_struct *next;//指向下一个的
};
/////////////////////////////////////
void showInput();
void menu(task_struct *pcb);
////////////////////////////////
int inputNum()//提示输入进程数
{
int n;
cout<<"请输入进程数:";
cin>>n;
cout<<endl;
return n;
}
void CreateList(task_struct *pcb,int n)
{
pcb->next=NULL;
task_struct *p=new task_struct;
p=pcb;
for(int i=0;i<n;i++)
{
task_struct *q=new task_struct;
int tmp;
q->pid=i+1;
cout<<"请输入第"<<i+1<<"个进程名:";
cin>>q->pname;
loop: cout<<"请输入进程状态(3为就绪状态,4为等待,5为运行):";
cin>>tmp;
if(tmp!=3&&tmp!=4&&tmp!=5)
{
cout<<"输入错误!"<<endl;
goto loop;
}
else
q->state=tmp;
if(p->next==NULL)
{
q->next=NULL;
p->next=q;
//p=q;
cout<<"Add a node"<<endl;
}
else
{
q->next=NULL;
p=p->next;
p->next=q;
//p=q;
cout<<"for Add"<<endl;
}
cout<<endl;
}
}
void display(task_struct *pcb)
{
task_struct *p;
cout<<"****************************************"<<endl;
cout<<"进程号\t进程名\t当前状态"<<endl;
for(p=pcb->next;p!=NULL;p=p->next)
{
cout<<p->pid<<"\t"<<p->pname<<"\t";
switch(p->state)
{
case 3:cout<<"TASK_READY"<<endl;break;
case 4:cout<<"TASK_WAITE"<<endl;break;
case 5:cout<<"TASK_RUNNING"<<endl;break;
}
}
cout<<"****************************************"<<endl;
menu(pcb);
}
///////////////////////////////////////////////
void output(task_struct *pcb, task_struct *p)//输入单个进程记录信息
{
cout<<"****************************************"<<endl;
cout<<"进程号\t进程名\t当前状态"<<endl;
cout<<p->pid<<"\t"<<p->pname<<"\t";
switch(p->state)
{
case 3:cout<<"TASK_READY"<<endl;break;
case 4:cout<<"TASK_WAITE"<<endl;break;
case 5:cout<<"TASK_RUNNING"<<endl;break;
}
cout<<endl<<endl<<endl<<endl<<endl;
menu(pcb);
}
void Query(task_struct *pcb)//查询
{
int pid;
cout<<"请输入要查询的进程号:";
cin>>pid;
task_struct *p;
for(p=pcb->next;p!=NULL;p=p->next)
{
if(p->pid==pid)
{
output(pcb, p);
return;
}
}
cout<<"无该进程!"<<endl;
menu(pcb);
}
void Add(task_struct *pcb)//添加
{
int tmp;
task_struct *p=new task_struct;
task_struct *q;
for(q=pcb;q->next!=NULL;q=q->next);
//if(q->next==NULL)
if(pcb->next==NULL)
p->pid=1;
else
p->pid=q->pid+1;
cout<<"请输入要添加的进程名:";
cin>>p->pname;
loop1:cout<<"请输入进程状态(3为就绪状态,4为等待,5为运行):";
cin>>tmp;
if(tmp!=3&&tmp!=4&&tmp!=5)
{
cout<<"输入错误!"<<endl;
goto loop1;
}
else
p->state=tmp;
p->next=NULL;
//if(q->next==NULL)
if(pcb->next==NULL)
pcb->next=p;
else
q->next=p;
cout<<endl<<endl;
display(pcb);
}
void Delete(task_struct *pcb)//删除
{
task_struct *p,*q;
cout<<"请输入要删除的进程号:";
int tmp;
cin>>tmp;
for(p=pcb;p!=NULL;p=p->next)
{
q=p->next;
if(q->pid==tmp)
{
p->next=q->next;
delete q;
display(pcb);
}
}
cout<<"无该进程!"<<endl;
menu(pcb);
}
////////////////////////////////////////////////
void Destroy(task_struct *pcb)//销毁链表
{
task_struct *p,*q;
p=pcb;
while(p->next!=NULL)
{
q=p->next;
p->next=q->next;
delete q;
}
delete pcb;
}
void menu(task_struct *pcb)//提示选择相应的操作
{
int m;
cout<<"1. 查询"<<endl;
cout<<"2. 添加"<<endl;
cout<<"3. 删除"<<endl;
cout<<"4. 返回首菜单"<<endl;
cout<<"选择:";
cin>>m;
cout<<endl<<endl;
switch(m)
{
case 1:Query(pcb);break;
case 2:Add(pcb);break;
case 3:Delete(pcb);break;
case 4:Destroy(pcb);showInput();break;
default:cout<<"输入有误!重新输入"<<endl;
menu(pcb);
}
}
void List()//线性方式
{
int n=inputNum();
task_struct *pcb=new task_struct;
CreateList(pcb,n);
cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
display(pcb);
}
void Hash()//索引方式
{
// int n=inputNum();
}
void showInput() //提示选择输入
{
int tmp;
cout<<"1. 线性方式"<<endl;
//cout<<"2. 索引方式"<<endl;
cout<<"请输入你的选择:";
cin>>tmp;
cout<<endl<<endl;
switch(tmp)
{
case 1:List();break;
//case 2:Hash();break;
default:cout<<"输入有误!请重新输入。"<<endl<<endl;
showInput();
}
}
void main()
{
showInput();
}
六、实验调试与结果分析(问题的发现、分析、解决方案与创新)
实验结果展示:
****************************************
进程号 进程名 当前状态
1 a TASK_WAITE
2 s TASK_READY
3 d TASK_RUNNING
****************************************
1. 查询
2. 添加
3. 删除
4. 返回首菜单
选择:
请输入要查询的进程号:2
****************************************
进程号 进程名 当前状态
2 s TASK_READY
1. 查询
2. 添加
3. 删除
4. 返回首菜单
选择:
选择:2
请输入要添加的进程名:f
请输入进程状态(3为就绪状态,4为等待,5为运行):5
****************************************
进程号 进程名 当前状态
1 a TASK_WAITE
2 s TASK_READY
3 d TASK_RUNNING
4 f TASK_RUNNING
****************************************
1. 查询
2. 添加
3. 删除
4. 返回首菜单
选择:
选择:3
请输入要删除的进程号:2
****************************************
进程号 进程名 当前状态
1 a TASK_WAITE
3 d TASK_RUNNING
4 f TASK_RUNNING
****************************************
1. 查询
2. 添加
3. 删除
4. 返回首菜单
选择:
选择:4
1. 线性方式
2. 索引方式
请输入你的选择:
14
展开阅读全文