操作系统实验二(进程撤销模拟实现)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机操作系统实验报告
实验内容:进程撤销模拟实现
实验类型:设计型
指导教师:***
专业班级:
姓名:
学号: ******
实验地点:东6E304
实验时间:2017/10/16
一、实验目的
1.掌握进程撤销相关理论
2.掌握进撤销流程
二、实验内容
1.采用动态或静态方法生成一颗进程树(进程数目≥20)
2.设计进程撤销算法
3.实现进程撤销函数,采用级联方式撤销
4.可动态撤销进程
5.可动态观察进程树的情况
6.测试程序并得到正确结果
三、实验要求
1.编写程序完成实验内容
2.画出撤销函数流程图
3.撰写实验报告
四、实验设备
1.PC机1台安装visual c++ 6.0
五、测试
1.构建1棵进程树,该树至少包含4层
2.对该树中的多个进程进行删除,至少对一个含有孙子进程的进程进行删
除
六、实验思考
1.进程撤销的核心内容是什么?
根据撤销进程的标志号从相应对列中查找并移除它;将此进程所拥有的资源归还给其父进程或操作系统;若此进程有拥有子进程,先撤销其所有字进程以防止它们脱离控制;回收pcb并将其归还至pcb池;最后转向进程调度程序工作。
2.可否采用其它的撤销方法?
可以,在撤销进程的时候可以通过递归撤销进程的子孙进程来一步一步撤销进程。
附:核心代码
int revokepc(int para){
int nid[101];
int counter=0;
pnode *p,*p1,*p2,*pp;
int pflag;
int parent;//父节点id号
pflag=0;
p1=plink;
for(p=p1->next;p;p=p->next){
if(p->node->pid == para){
//find the process
parent = p->node->ppid;
//找p的父节点
pp = find(parent);
pflag = 1;
break;
}else{
p1 = p;
}
}
if(!pflag)
{
//the process is not exist
printf("process id %d is not exist!\n",para);
return -1;
}
if(pp->sub == p){
//p是pp的第一个子节点
if(p->brother){
pp->sub = p->brother;
}else{
pp->sub = NULL;
}
}else{
//p不是pp的第一个子节点
if(p->brother){
p1->brother = p->brother;
}else{
p1->brother = NULL;
}
}
p1->next = p->next;
//找子孙节点
int head=0,rear=0;
pnode *zz[101];
zz[rear++]=p->sub;
while(rear>head){
p=zz[head++];
if(p){
nid[counter++]=p->node->pid;
if(p->sub){
zz[rear++]=p->sub;
}
p1=p->brother;
while(p1){
nid[counter++]=p1->node->pid;
if(p1->sub){
zz[rear++]=p1->sub;
}
p1=p1->brother;
}
}
}
for(int i=0;i p1=plink; p=p1->next; while(p){ if(p->node->pid==nid[i]){ p1->next = p->next; break; }else{ p1=p; p=p->next; } } } showdetail(); }