操作系统实验二
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二进程撤销模拟
一、实验目的
1) 理解进程撤销相关理论;
2) 掌握进程撤销流程。
二、实验内容
本实验针对操作系统中进程撤销相关理论进行实验。要求实验者设计一个程序,该程序可模拟撤销多个进程及其子孙进程。
1) 采用动态或静态方法生成一颗进程树(进程数目≥20);
2) 设计进程撤销算法;
3) 实现进程撤销函数,采用级联方式撤销;
4) 可动态撤销进程;
5) 可动态观察进程树的情况;
6) 测试程序并得到正确结果。
实验过程:
进程的创建(进程数目≥20):
此时树的形状为:
第一次撤销进程:
此时的树的形状为:
第二次撤销进程:
此时树的形状为:
第三次撤销进程:
此时树的形状为:
第四次撤销进程:
此时树的形状为:
第五次撤销进程:
此时树的形状为:
直到此时,所有的子孙进程均被撤销完毕。
三、实验原理
1)进程创建流程
(1) 从PCB 链中找到该进程的PCB,从中读出该进程的状态;
(2) 如果该进程处于执行状态,则终止该进程并置调度标志为真;
(3) 若该进程有子孙进程,需要撤销其子孙进程;
(4) 释放该进程占有的资源;
(5) 从PCB 链中移出该进程的PCB。
2)进程子树的删除
对于已经创建的进程树(可以参考实验 1 创建进程),在删除的时候,首先需要考虑把该进程及其子孙从整棵树中脱离出来,这样才不会破坏整棵树的完整性。
3)进程总链元素的删除
对于进程树种撤销的所有进程,必须在进程总链中进行删除。
四、思考题
1)进程撤销的核心内容是什么?
进程撤销的核心内容是撤销其相关的资源和所拥有的子孙进程。
撤销流程:
1.寻找此进程,若存在则寻找父进程,记录相应进程,若不存在则输入不存在。
2.首先查找此进程有无子进程,若存在则进入递归循环,若不存在再查找此进程的
父进程,如果父进程的子进程是此进程,则将此进程的兄弟进程作为父进程的子进程,若不是子进程,则将此进程的兄弟进程指向下一个兄弟进程。
3.从存储链表中将相应进程删除。
2)进程总链在进程撤销过程中有什么作用?
关闭相关数据。
五、核心代码
//撤销进程
void deletepc(pnode *parent,pnode *currect)
{
if (currect->sub==NULL) //如果要撤销的进程为空
{
if(parent->sub==currect)
{
parent->sub=currect->brother;
}
else
{
for(pnode*p=parent->sub;p->brother!=currect;p=p->brother);
p->brother=currect->brother;
}
pnode *tempperent;
for (tempperent=plink;tempperent;tempperent=tempperent->next) //删除进程
{
if (tempperent->next->node->pid==currect->node->pid)
{
tempperent->next=tempperent->next->next;
break;
}
}
}
else //递归调用
{
deletepc(currect,currect->sub);
deletepc(parent,currect);
}
}
六、实习总结
这次实习有了上次的铺垫,理解起来没有更复杂,但就是代码有些难理解。进程的撤销是以进程的创建为基础的,进程的撤销采用级联方式,即只要撤销了父进程,则父进程下面的子孙进程均会被撤销,这跟数据结构里面的删除结点很相似,因此理解起来不是很困难。总体感觉还好,我会继续努力的。