操作系统中几个典型的互斥问题的探究

这学期开了操作系统课,老师系统的讲解了很多东西,尤其是进程间并发的问题。


实现互斥控制的几种方式

1.信号量:分为互斥信号量与资源信号量。以p/v操作实现对资源的控制机制。p操作为reduce,v操作为increase,并且具有通知机制,如一个典型的生产者消费者用信号量实现

semaphore num = 0;
semaphore mutex = 1;


//生产者                           //消费者

while (true) {                  while (true) {
produce();                       P(num);
P(mutex);                         P(mutex);
填充buffer;                     消费buffer;
V(mutex);                         V(mutex);
V(num);                           consume();
}                                         }


其中num为资源信号量,mutex为互斥信号量。


2.管程。 之前我用过java的synchronized,这个就是一个很好的管程实现多线程并发同步的例子

管程概念:管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计


3.其实还有其他的几种方式,如共享内存,消息队列,socket等。上课主要讨论的就是那两种




之前也写过一些多线程的程序,所以对这里比较感兴趣,而且并发时的线程安全和控制也是一个难的点。接下来就写一点对这几个问题的理解吧。

1.生产者消费者

2.读者/写者

3.银行家就餐问题


上面已经用p/v操作实现了一个简单的生产者与消费者的例子。其实在生产过程中,我们不可能用一个数字就代表了缓冲区,一般是用消息列队来实现。而且当模型较为复杂的时候,会出现多个消费者与多个生产者,我们需要加互斥锁来实现控制。


对读者/写者问题,需要进行互斥操作的就是读-写,写-写两组操作,对于读-读无限制。其次,是读优先还是写优先,也是需要考虑的问题,因为可能会产生饥饿(如读优先,写操作可能一直不能进行)。


银行家就餐问题:待完善






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值