当前位置:文档之家› 操作系统实验之进程管理实验报告

操作系统实验之进程管理实验报告

philosopher[i % 5].finish(); if (!b[(i % 5 + 1) % 5])
b[(i % 5 + 1) % 5] = philosopher[(i % 5 + 1) % 5].eat(); if (!b[(i % 5 + 4) % 5])
b[(i % 5 + 4) % 5] = philosopher[(i % 5 + 4) % 5].eat();
六、自我评价与总结
本次操作系统实验是模拟进程管理过程,解决哲学家的就餐问题。个人本 次实验还比较顺利,使用了比较熟悉的 c++语言进行算法的编写,比较巧妙的 定义了两个类来定义哲学家和筷子对象的属性以及相应的动作,方便在各种就 餐过程中对筷子的资源进行申请和释放,以及哲学家实现相应的动作。另一个 觉得比较好的地方是解决了死锁问题,通过判断当前哲学家是否可以同时拿起 左右筷子来避免死锁。
left.putdown(); right.putdown(); cout << "The philosopher " << Phi_num << " is thinking." << endl; sleep(1); } void finish() { sleep(1); cout << "The philosopher " << Phi_num << " has finished eating." << endl; think(); } };
}; bool b[5]; int i, j; srand(time(0)); j = rand() % 5; for (i = j; i < j + 5; i++) {
b[i % 5] = philosopher[i % 5].eat(); cout << endl << "********************************************************" << endl; } for (i = j; i < j + 5; i++) { if (b[i % 5]) {
①至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,
最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;
②仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐;
③规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲
学家则相反。
本实验中采取方法 2.
三、数据结构及功能设计
//放下筷子 void putdown() {
available = true; } };
//Philosopher 类
class Philosopher { private:
ChopStick &left, &right; int Phi_num; public: Philosopher(int num, ChopStick &c1, ChopStick &c2): left(c1), right(c2) {
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称
计算机操作系统
开 课 学 院 计算机科学与技术学院
指导老师姓名
学生姓名
学生专业班级
2016 — 2017 学年 第一学期
实验二 进程管理
一、设计目的、功能与要求
1、实验目的
掌握进程管理的相关内容,对进程的同步和互斥,及信号量机制有深入的 理解。
2、功能设计
通过 philosopher 类定义五个哲学家对象,通过 Chopstick 类定义五只筷
子对象。生成一个 0-4 的随机数,对应首先开始就餐的哲学家。该哲学家开始
就餐,拿起左右手筷子,然后顺时针或者逆时针对其他四个哲学家依次进行吃
饭动作,吃饭之前判断是否可以拿起筷子,不能拿起则进行等待,若拿起了一
int id; bool available; //是否可以拿起筷子 public: ChopStick(int i = 0) {
id = i; available = true; } //拿起筷子 bool takeup() { while (!available)
return false; available = false; return true; }
1、数据结构
定义筷子类 Chopstick 和哲学家类 Philosopher,Chopstick 中包含筷子编
号 id,筷子的状态 available(表示筷子是否可用)。包含 takeup 拿起筷子函
数和 putdown 放下筷子函数,相当于申请筷子资源和释放筷子资源。
Philosopher 类中包含哲学家左右手的两只筷子 left、right 以及哲学家的
不足之处为,在本次实验中没有使用多线程的方法,与同学讨论发现使用 c++中多线程操作可以节约很多代码和空间,算法实现简单。而且其中带有了 p 操作和 v 操作不用自己重新定义。提高了代码的可读性。
本次实验通过解决哲学家就餐问题算法实现,对这进程管理的理解更加深 刻了,也通过实验结果的比较,掌握了死锁问题的解决方法。通过这样一个一 个小实验,也一定程度上锻炼了我的编程能力。
五、测试用例及运行结果、分析
测试结果截图:
分析:产生了一个随机数 0,并依次加 1 对每个哲学家进行分析。分析时首先看 左筷子是否可用,然后看右筷子,若有一个不可用则放下手中的另一只筷子,并 说明 need waiting。然后再下一时间段对每个哲学家再次分析,直到每个哲学 家都吃上饭,程序结束。 通过实验结果可得,程序正确运行,且解决了死锁问题。
Phi_num = num; } bool eat() {
bool br, bl; bl = left.takeup(); if (!bl) {
cout << "The Philosopher " << Phi_num << " is waiting the left chopstick." << endl;
} else {
b[i % 5] = philosopher[i % 5].eat(); if (b[i % 5])
continue; else
cout << "The philosopher " << i % 5 << "need waiting" << endl; } cout << endl << "********************************************************" << endl; } return 0; }
①只有拿到两只筷子时,哲学家才能吃饭; ②如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到 筷子; ③任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中 的筷子。 (3)可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样 就可能五个哲学家都用不上餐。 (4)死锁解决方案:
编号 Phi_num。包含 eat 就餐动作,think 思考动作,finish 完成就餐三种动
作。在 eat 动作中通过判断是否左右手的筷子可以同时拿起来避免程序出现死
锁问题,若可以同时拿起,进行 eat 动作,否则将另一只手中的筷子放下。
//Chopstick 类
class ChopStick { private:
{ Philosopher(0, chopstick[4], chopstick[0]), Philosopher(1, chopstick[0], chopstick[1]), Philosopher(2, chopstick[1], chopstick[2]), Philosopher(3, chopstick[2], chopstick[3]), Philosopher(4, chopstick[3], chopstick[4])
2、实现功能
模拟实现用信号量机制解决经典同步问题
3、具体要求
任选一种计算机高级语言编程实现; 实现 5 个哲学家(5 只筷子)的顺利就餐 需要避免出现死锁 使用信号量、及信号量的等待队列 使用 p 操作、v 操作
二、问题描述
(1)有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空 盘子,每两人之间放一只筷子,即共 5 只筷子。每个哲学家的行为是思考和进 餐。为了进餐,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的 左边或右边去取筷子。思考时则同时将两支筷子放回原处。 (2)规则:
只筷子但另一只筷子不能拿起,需要放下另一只手中的筷子继续等待。程序直
到所有哲学家都完成就餐才结束。
四、开发工具及主要源代码
1、开发工具
SublimeText 3 文本编辑器,采用 g++编译。
2、主要源码
//主函数
int main() {
ChopStick chopstick[5] = {
ChopStick(0k(3), ChopStick(4), }; Philosopher philosopher[5] =
sleep(1); return false; } br = right.takeup(); if (!br) { cout << "The Philosopher " << Phi_num << " is waiting the right chopstick." << endl; //右筷子不能拿起时放下左筷子 left.putdown(); sleep(1); return false; } cout << "The philosopher " << Phi_num << " is having dinner." << endl; sleep(1); return true; } void think() {
相关主题