【操作系统实验】Linux环境下⽤进程实现哲学家进餐问题——C语⾔完整代码
+详细实验报告
【注意】代码在⽂末,以下为详细实验报告
【实验⽬的】
  以哲学家进餐问题为例,学习并熟悉Linux下进程通信、同步机制的具体实现⽅法,主要是了解并掌握信号量机制和避免死锁的使⽤⽅法,使得不会出现哲学家饥饿的情况,并进⼀步熟悉Linux系统的相关指令的调⽤。
【实验内容】
  5个位哲学家共⽤⼀张圆桌,分别坐在周围的五张椅⼦上,在圆桌上有5个盘⼦和5双筷⼦,他们的⽣活⽅式是交替的进⾏思考和进餐。平时哲学家进⾏思考,饥饿时便试图取⽤其左右最靠近他的筷⼦,只有在他拿到两只筷⼦时才能进餐。进餐完成之后,放下筷⼦继续思考。  利⽤进程实现哲学家进餐问题,使哲学家不会出现饿死现象,亦即避免进程之间的死锁问题。筷⼦为临界资源,⼀段时间内只允许⼀位哲学家使⽤,为实现对筷⼦的互斥使⽤, 可⽤⼀个信号量表⽰⼀只筷⼦;五个信号量构成信号量数组
Chopstick[i],Chopstick[(i+1)%5]。
【实验环境】(含主要设计设备、器材、软件等)
【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)
⼀、解决⽅法
哲学家进餐问题避免哲学家被饿死的解决⽅法有:
(1)⾄多四个⼈同时拿左边的筷⼦,保证⾄少有⼀个⼈可以进餐,最终释放筷⼦使更多的⼈进餐。linux下gcc编译的四个步骤
(2)仅当哲学家的左右两⽀筷⼦均可⽤时,才允许他拿起筷⼦进餐。
(3)规定奇数号哲学家先拿起其左边的筷⼦,再拿右边的,偶数号哲学家则相反。总会有某⼀⼈进餐。
利⽤进程实现以上三种解决⽅法。
⼆、数据结构
  对于第⼀个⽅法,定义了⼀个变量room,使得最多只允许四个哲学家同时进餐,避免死锁,⽽对于第⼆个⽅法,定义了⼀个记录型信号量mutex,对左右的筷⼦进⾏互斥访问,进⽽避免死锁。
三、算法描述
1.⽅法⼀
内容:⾄多四个⼈同时拿左边的筷⼦,保证⾄少有⼀个⼈可以进餐,最终释放筷⼦使更多的⼈进餐。
步骤:
(1)初始化筷⼦的信号量,同时初始化room为4,保证最多四个哲学家进餐。
(2)对每⼀个哲学家在进餐之前进⾏如下原⼦操作
Wait(room),Wait(chopstick[i]),Wait(chopstick[(i+1)%5]),
Signal(chopstick[i]),Signal(chopstick[(i+1)%5]),Signal(room)
(3)若出现四个哲学家同时拿起了左⼿边的筷⼦,则第五个⼈必须等待,直到他两边的筷⼦空闲才可以进⾏进餐,这样就避免了哲学家在进餐过程中出现饥饿现象,也就是死锁。
(4)哲学家开始进餐。
(5)删除信号量和共享内存,释放空间。
2.⽅法⼆
内容:仅当哲学家的左右两⽀筷⼦均可⽤时,才允许他拿起筷⼦进餐。
步骤:
(1)初始化筷⼦的信号量,同时初始化mutex为5,对筷⼦进⾏互斥访问。
(2)对每⼀个哲学家在进餐之前进⾏如下原⼦操作
Wait(mutex),Wait(chopstick[i]),Wait(chopstick[(i+1)%5]),
Signal(mutex),Signal(chopstick[i]),Signal(chopstick[(i+1)%5])
  在这⾥是先执⾏mutex的V操作,原因在于如果哲学家已经拿起了⼀双筷⼦开始进餐之后,为了不让别的哲学家⼀直等待,需要⽴即释放该信号量,以便于与他不相邻的哲学家可以进餐。
(3)哲学家开始进餐
(4)删除信号量和共享内存,释放空间
3.⽅法三
内容:规定奇数号哲学家先拿起其左边的筷⼦,再拿右边的,偶数号哲学家则相反。总会有某⼀⼈进餐。
步骤:
(1)初始化筷⼦的信号量。
(2)对偶数号哲学家在进餐之前进⾏如下原⼦操作
Wait(chopstick[(i+1)%5]),Wait(chopstick[i]),
Signal(chopstick[(i+1)%5]),Signal(chopstick[i])
在这⾥是规定偶数号哲学家先拿起右边的筷⼦,再拿起左边的筷⼦。
(3)对奇数号哲学家在进餐之前进⾏如下原⼦操作
Wait(chopstick[i]),Wait(chopstick[(i+1)%5]),
Signal(chopstick[i]),Signal(chopstick[(i+1)%5])
在这⾥是规定奇数号哲学家先拿起左边的筷⼦,再拿起右边的筷⼦。
(4)哲学家开始进餐
(5)删除信号量和共享内存,释放空间
4.进⾏错误判断
  这⾥进⾏的错误判断主要是通过调⽤函数来判断,信号量是否成功初始化、进程是否成功创建以及共享内存是否设置好,详见如下
            图1 error 判断
5.原⼦操作——P操作和V操作
  P操作、V操作对封装的信号量进⾏“减1”“加1”操作。
  在LINUX下,通过使⽤ semop 函数改变信号量的值。以下P、V操作分别使⽤两种代码书写⽅式
            图2 P操作(wait)
            图3 V操作(signal)
四、程序流程图
1.⽅法⼀流程图
内容:⾄多四个⼈同时拿左边的筷⼦,保证⾄少有⼀个⼈可以进餐,最终释放筷⼦使更多的⼈进餐。
            图4 ⽅法⼀流程图
2.⽅法⼆流程图
内容:仅当哲学家的左右两⽀筷⼦均可⽤时,才允许他拿起筷⼦进餐。
            图5 ⽅法⼆流程图
3.⽅法三流程图
内容:规定奇数号哲学家先拿起其左边的筷⼦,再拿右边的,偶数号哲学家则相反。总会有某⼀⼈进餐。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。