这学期开了操作系统课,老师系统的讲解了很多东西,尤其是进程间并发的问题。
实现互斥控制的几种方式
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操作实现了一个简单的生产者与消费者的例子。其实在生产过程中,我们不可能用一个数字就代表了缓冲区,一般是用消息列队来实现。而且当模型较为复杂的时候,会出现多个消费者与多个生产者,我们需要加互斥锁来实现控制。
对读者/写者问题,需要进行互斥操作的就是读-写,写-写两组操作,对于读-读无限制。其次,是读优先还是写优先,也是需要考虑的问题,因为可能会产生饥饿(如读优先,写操作可能一直不能进行)。
银行家就餐问题:待完善