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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28352347/article/details/67646364

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


实现互斥控制的几种方式

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


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


银行家就餐问题:待完善






猜你喜欢

转载自blog.csdn.net/qq_28352347/article/details/67646364
今日推荐