经典的IPC

最近在复习进程间通信,在这里对经典的IPC问题做个总结。

1、哲学家就餐问题

问题描述:

有一张圆形的就餐桌,上面摆放着5副叉子。五位哲学家围桌而坐,这些哲学家只做两件事情思考和就餐。对每位哲学家都是思考一会然后拿起左手和右手的两个叉子吃饭,也就是说哲学家就餐的基本条件是获取两个叉子。


我们要做的就是设计出一种方案让这些哲学家能够合理的就餐。

方法1:

最简单的方法就是对于任何一个哲学家,如果他想要就餐就直接去取左边的叉子,然后在去取右边的叉子。如果获得这两个叉子,那么这个哲学家就去就餐,如果不能同时获取两个叉子,就放下之前获取的叉子进行思考。思考一段时间后再去拿叉子。

这是一个最简单的想法,但是所出现问题就是如果5个哲学家同时拿起左手边的叉子,那么他们将不能获取右手的叉子,然后都放下叉子进行思考一段时间后再取叉子。然后又是只能取到左手的叉子不能拿到右手的叉子,.....这样一直重复操作。任何一个哲学家都不能就餐,都是“饥饿”的。

方法2:

在方法1的基础上使用一个“互斥锁”,也就是说任何一个哲学家如果想要就餐,他必须通过pthread_mutex_lock获取互斥锁。得到锁后才能申请叉子去就餐。通过这分析,我们可以得知任何时刻都能有哲学家在就餐。

由于要使用互斥锁,最多只能有一个哲学家就餐,不会出现多个哲学家同时就餐。因为5个叉子,我们期待有两个哲学家同时就餐,但是使用互斥锁只能有一个哲学家就餐。这就使得发生资源浪费,并行性比较差的问题。

方法3:

我们这么近解决,当一位哲学家想要就餐时,它首先要做的动作是检查该哲学家左边、右边的两位哲学家分别在做什么。如果相邻的两个哲学家都没有就餐,那么这个哲学家就可以去拿叉子了。如果相邻的两个哲学家有一个在就餐,那么这个哲学家肯定不能够达到就餐的条件,因此继续思考。这样可以是资源(叉子)得到充分的利用,并且能够最大的并行。

2、读者-写者问题

问题描述:

现在有一个数据库,有两种类型的程序。一种是写程序(写者),用于修改数据库中的数据;另一种是读程序(读者),用于读取数据库中的数据。根据读者写者的性质我们可以知道:

1)当有一个读者正在读取数据库时,后来的新的读者可以进入数据库访问数据,但是任何写者都不允许进入数据库;

2)当有一个写者正在修改数据库时,后来的任何读者写者都不允许进入数据库;

所出现的问题:这样会造成一个问题:就是如果读者先占用了数据库,每个读者要在数据库中停留5分钟,并且随后读者以流的形式每隔2分钟来一个读者。这样如果按照前面的思想,任何写者将永远得不到数据库访问权限,知道所有的读者处理完毕。

解决方法:调整下策略,当一个读者正在访问数据库时来了一个写者,那么在写者到达之后到达的读者都进行阻塞,不让其继续进入数据库中。而是等待当前数据库中的读者处理完退出,写者进入数据库中。

应用:

读者-写者问题对应一种锁机制-------读写锁;

当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞;

当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须直到所有的线程释放锁;

当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须直到所有的线程释放锁.
通常, 当读写锁处于读模式锁住状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值