资源描述
附件(四)
深 圳 大 学 实 验 报 告
课程名称: 操作系统
实验项目名称: 进程(线程)同步及死锁
学院: 计算机与软件学院
专业: 计算机科学与技术
指导教师:
报告人: 学号: 班级:
实验时间: 2015/10/23
实验报告提交时间: 2015/11/13
教务处制
一、实验目得与要求:
实验目得:
在多进程(线程)运行环境中,进程(线程)之间并发执行,如果对进程(线程)访问临界资源(如公共变量)得操作不加限制,就会产生“与时间有关"得错误。为防止这类错误,必须用同步机构控制进程(线程)对临界资源(公共变量)得访问。
在一个进程(线程)需要两个或两个以上得临界资源时,如果申请与推进顺序不当,会造成死锁,即多个进程(线程)因竞争临界资源而造成得一种僵局,若无力作用,这些进程(线程)都将永远不会再向前执行。
本实验利用Window系统提供得同步机制,来协调线程(Thread)间得并发执行,并比较各种预防死锁得措施,以加深对同步机制与死锁得理解,并学会在并发程序中引用同步机构,并预防死锁得编程方法。
实验要求:
熟悉Windows操作系统及VC程序设计方法。
二、方法、步骤:
设计解决哲学家就餐问题得并发线程。
假定有6个哲学家,围着圆桌交替地进行思考与进餐;每次进餐时,必须同时拿到左右两边得两只筷子才能进餐;进餐后,再放下筷子思考。
这就是一个典型得同时需要两个资源得例子,如果申请资源顺序不当,可能会引起死锁.
本实验设计6个哲学家共享一个相同得线程Philosopher,既完成线程同步,又预防死锁发生。实验中采用了3种预防死锁得方法(摒弃‘环路等待’条件,摒弃‘请求与保持'条件,摒弃‘不剥夺’条件),要预防死锁,只采用其中得任何一种方法即可。
三.实验过程及内容:(其中:提供有简短说明得程序代码。要求:程序运行正确、符合设计要求。)
1、创建工程,注意勾选Win32 Application,点击确定
2、勾选第三个选项
3、创建菜单,有Eat、About、Exit
4、在进程(线程)同步及死锁、cpp中编写代码,此时代码有“摒弃‘环路等待’条件”、“摒弃‘请求与保持’条件”、“摒弃‘不剥夺’条件”三种代码,当检测其中一个时须将其余两个加以注释,一一检测其对死锁得影响.
运行结果:
运行前:
运行后:
5、在运行时可知,在分别“摒弃‘环路等待’条件”与“摒弃‘不剥夺’条件”得代码时不会出现死锁,而使用 “摒弃‘请求与保持’条件”时会产生死锁,在理论正确前提下,此种情况说明了代码出现错误。
6、代码解释及修改
⑴摒弃‘环路等待’条件
R1=ThreadID;
R2=(ThreadID+1)%6;
if (ThreadID = = 0)
{
R1= (ThreadID+1) % 6;
R2= ThreadID;
}
依据摒弃‘环路等待’条件,要有至少一位哲学家与其她哲学家拿筷子顺序不同,则使第0位(ThreadID = 0)哲学家从右边开始拿筷子,其她哲学家相反.
⑵摒弃‘不剥夺'条件
Wait(Mutex);
if (ChopstickUsed[R2])
{
Signal(Mutex);
goto ReleaseChopstick;//将左筷子放弃掉
}
Signal(Mutex);
若分配给得哲学家拿不到右筷子,则将她拿到得左筷子收回。
⑶摒弃‘请求与保持'条件
原代码:
Wait(Mutex);
if((ChopstickUsed[R1])||(ChopstickUsed[R2]))
{
ﻩSignal(Mutex);
ﻩgoto LoopAgain;//思考
}
Wait(ChopStick[R1]);//调用WaitForSingleObject等待信号量
DrawChopstick(hBrush[ThreadID],R1,TRUE);
Wait(ChopStick[R2]);
DrawChopstick(hBrush[ThreadID],R2,TRUE);
错误分析:此代码虽然if语句能够保证在左右筷子都没被其她线程申请并保持情况下进行拿筷子操作,但没有实现同时拿起筷子,而就是先后拿起筷子,这可能会使得别得线程在先后过程中拿起筷子,从而造成死锁。
修改代码:
HANDLE hSemaphore[2];
hSemaphore [0]=ChopStick[R1];
hSemaphore [1]=ChopStick[R2];
Wait(Mutex);
if((ChopstickUsed[R1])||(ChopstickUsed[R2]))
{
ﻩSignal(Mutex);
ﻩgoto LoopAgain;
}
Signal(Mutex);
WaitForMultipleObjects(2,hSemaphore,FALSE,INFINITE);
DrawChopstick(hBrush[ThreadID],R1,TRUE);
DrawChopstick(hBrush[ThreadID],R2,TRUE);
此代码使得if判断语句后哲学家同时拿起筷子,因而避免了死锁。
四、实验结论:(其中:提供运行结果,能对实验结果进行深入得探讨与分析、评价,并提出结论性意见与改进想法)
在线程同步运行时,如果资源管理不当则会产生死锁。
预防线程死锁得方法有:
1、 摒弃‘请求与保持’条件;
2、 摒弃‘不剥夺’条件;
3、 摒弃‘环路等待’条件.
五、实验体会:(根据自己情况填写)
本次实验内容为进程(线程)同步及死锁,就是操作系统课程重要知识点之一。由于代码老师有提供,所以编写代码难度不就是很大,难得就是对代码得理解,如果课堂知识点掌握不牢,理解代码确实有难度,不过却可以巩固知识,深入理解知识点。实验中也有许多细节问题需要注意,比如说不能一味照抄老师得代码,可以适当改写数据使得运行速度更慢,效果更明显,以及创建工程得诸多选项要注意不要出错等等,总之,想要学好该科目,就需要多多上机动手实验。
注:“指导教师批阅意见”栏请单独放置一页
指导教师批阅意见:
成绩评定:
指导教师签字:
年 月 日
备注:
展开阅读全文