操作系统pcb的组织及维护实验Word格式.docx
《操作系统pcb的组织及维护实验Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统pcb的组织及维护实验Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
PCB是进程存在的唯一标志,当系统创建一个进程时,为进程设置一个PCB,再利用PCB对进程进行管理和控制。
撤销进程时,系统收回它的PCB,进程也随之消亡。
进程是由程序、数据和进程控制块PCB三部分组成.PCB是进程的“灵魂”,由于进程控制块中保存了进程的地址信息,通过PCB可以得到进程程序的存储位置,也可以找到整个进程。
2、为了便于管理,系统把所有的PCB用适当方式组织起来。
一般来说,大致有以下三种组织方式:
1、线性方式;
2、索引方式;
3、连接方式。
通过这三种方式的组织进而对进程进行高效的管理。
五、算法设计与流程
程序设计流程图如下:
1、线性方式流程图:
无该进程
线性方式代码:
#include<
iostream>
string>
usingnamespacestd;
#defineFALSE0
#defineTRUE1
#defineTASK_READY3
#defineTASK_WAITE4
#defineTASK_RUNNING5
structtask_struct
{
stringpname;
//进程名
intpid;
//进程号
intstate;
//进程当前状态/*3就绪状态4等待状态5运行状态*/
task_struct*next;
//指向下一个的
};
/////////////////////////////////////
voidshowInput();
voidmenu(task_struct*pcb);
////////////////////////////////
intinputNum()//提示输入进程数
intn;
cout<
<
"
请输入进程数:
;
cin>
>
n;
endl;
returnn;
}
voidCreateList(task_struct*pcb,intn)
pcb->
next=NULL;
task_struct*p=newtask_struct;
p=pcb;
for(inti=0;
i<
i++)
{
task_struct*q=newtask_struct;
inttmp;
q->
pid=i+1;
cout<
请输入第"
i+1<
个进程名:
cin>
q->
pname;
loop:
请输入进程状态(3为就绪状态,4为等待,5为运行):
tmp;
if(tmp!
=3&
&
tmp!
=4&
=5)
{
cout<
输入错误!
gotoloop;
}
else
q->
state=tmp;
if(p->
next==NULL)
p->
next=q;
//p=q;
Addanode"
else
p=p->
next;
forAdd"
}
}
voiddisplay(task_struct*pcb)
task_struct*p;
****************************************"
进程号\t进程名\t当前状态"
for(p=pcb->
p!
=NULL;
p=p->
next)
p->
pid<
\t"
pname<
switch(p->
state)
case3:
cout<
TASK_READY"
break;
case4:
TASK_WAITE"
case5:
TASK_RUNNING"
menu(pcb);
///////////////////////////////////////////////
voidoutput(task_struct*pcb,task_struct*p)//输入单个进程记录信息
switch(p->
case3:
case4:
case5:
}
endl<
voidQuery(task_struct*pcb)//查询
请输入要查询的进程号:
pid;
pid==pid)
output(pcb,p);
return;
无该进程!
voidAdd(task_struct*pcb)//添加
inttmp;
task_struct*q;
for(q=pcb;
next!
q=q->
next);
//if(q->
if(pcb->
p->
pid=1;
else
pid=q->
pid+1;
请输入要添加的进程名:
loop1:
if(tmp!
gotoloop1;
p->
pcb->
next=p;
display(pcb);
voidDelete(task_struct*pcb)//删除
task_struct*p,*q;
请输入要删除的进程号:
for(p=pcb;
q=p->
if(q->
pid==tmp)
next=q->
deleteq;
display(pcb);
////////////////////////////////////////////////
voidDestroy(task_struct*pcb)//销毁链表
while(p->
=NULL)
deleteq;
deletepcb;
voidmenu(task_struct*pcb)//提示选择相应的操作
intm;
1.查询"
2.添加"
3.删除"
4.返回首菜单"
选择:
m;
switch(m)
case1:
Query(pcb);
case2:
Add(pcb);
Delete(pcb);
Destroy(pcb);
showInput();
default:
输入有误!
重新输入"
menu(pcb);
voidList()//线性方式
intn=inputNum();
task_struct*pcb=newtask_struct;
CreateList(pcb,n);
voidHash()//索引方式
//intn=inputNum();
voidshowInput()//提示选择输入
1.线性方式"
//cout<
2.索引方式"
请输入你的选择:
switch(tmp)
List();
//case2:
Hash();
请重新输入。
showInput();
voidmain()
showInput();
六、实验调试与结果分析(问题的发现、分析、解决方案与创新)
实验结果展示:
****************************************
进程号进程名当前状态
1aTASK_WAITE
2sTASK_READY
3dTASK_RUNNING
1.查询
2.添加
3.删除
4.返回首菜单
2
f
5
4fTASK_RUNNING
3
4
1.线性方式
2.索引方式