目录
1. 利用信号量实现进程的同步和互斥
利用信号量实现进程互斥
为使多个进程能互斥地访问某临界资源,只须为该资 源设置一个互斥信号量 mutex,并设其初始值为 1,然后将各进程访问该资源的临界区 CS 置于 wait(mutex) 和 signal(mutex) 操作之间即可。 在进程互斥中使用 P、V 操作,须在同一程序段成对出 现同一信号量的 P、V 操作,否则会造成系统瘫痪。
注意:
实现互斥的信号量的PV操作必须在同一程序当中成对的出现
利用信号量实现进程同步
与此同时,可以利用信号量来描述前趋图
wait和signal操作必须成对出现
同步的wait操作在互斥的wait操作前
2. 生产者消费者问题
生产者—消费者”问题 (producer/consumer problem) 是最著名的进程同步问题。 它描述了一组生产者向一组消费者提供产品,它们共享 一个有界缓冲池,生产者向其中投放产品,消费者从中 取得产品。 它是许多相互合作进程的抽象,如输入进程与计算进 程;计算进程与打印进程等。
设置两个资源信号量和一个互斥信号量
注意:
empty是空缓冲区的数目,其初值是有界缓冲池的大小n
full满缓冲区的数目,其初值是1
互斥信号量的初值是1
即
注意:
两个P操作的顺序不当会导致死锁的出现
3. 哲学家就餐问题
此算法可以保证不会有相邻的两位哲学家同时进餐。 若五位哲学家同时饥饿而各自拿起了左边的筷子,这使 五个信号量 chopstick 均为 0,当他们试图去拿起右边 的筷子时,都将因无筷子而无限期地等待下去,即可能 会引起死锁。
4. 读者写者问题
读者优先
需要设置一个共享变量,两个互斥信号量
需要注意的是,对于共享变量Readcount的访问也是互斥的。
第一位读者阻止写者
最后一位读者允许写者
写者优先
注意:
写者优先增加了一个读写互斥信号量S
读者写者问题的变形
使用信号量解决读者写者问题
5. 经典同步问题例题
例题1:
例题2:
例题3:
例题4:
注意本题当中对S的PV操作,应该放在不同程序段,因为笼子里一次只可以放一个,必须消费者V操作以后,生产者才可以继续放。
例题5:
例题6:
6. 管程机制
基本思想: 把访问某种临界资源的所有进程的同步操作 都集中起来,构成一个所谓的“秘书”进程(管程), 凡是访问临界资源的进程,都需要报告“秘书”,由秘 书来实现诸进程的同步。
管程的定义: 一个数据结构和在该数据结构上能被并发进程所执行的一组操作,这组操作能使进程同步和改变 管程中的数据。
管程的组成:①管程的名称;②局部于管程内部的共享 数据结构说明;③ 对该数据结构进行操作的一组过程; ④ 对局部于管程内部的共享数据设置初始值的语句。
管程中的共享变量在管程外部是不可见的,不能被任何 外部过程访问。管程相当于围墙,把共享变量和对它进 行操作的若干过程围了起来。 外部只能通过调用管程中所说明的外部过程(函数)来 间接地访问管程中的共享变量。 一个进程通过调用管程内的一个过程而进入管程。 管程通常是用来管理资源的,因而在管程中设有进程等 待队列以及相应的等待及唤醒操作。 管程每次只允许一个进程执行,从而实现了进程的互斥
使用管程解决生产者消费者问题
注意:此处的full 和 empty均为条件变量
管程与进程的区别
注意
管程定义是公共数据结构
7. 进程通信
共享存储器
消息传递系统
管道通信
易错知识点
1. 临界区是指进程当中用于访问临界资源的那段代码
2. 信号量机制是一种有效实现进程同步和互斥的机制;进程的并发执行不需要信号量。
3. 进程进入临界区必须满足互斥条件,进程进入临界区但没有离开就进入阻塞是可以的;
例如:
一个正在访问临界资源的的进程由于申请等待I/O操作而中断,它允许其他进程抢占处理器,但是它不允许其他进程进入它的临界区。
4. PV操作是一种低级进程通信原语;PV操作由一种不可中断的过程组成
5. 原语是不可分割的指令序列
6. 管程外过程调用管程内数据结构的说明不是管程的组成部分
7. 管程当中的signa操作与信号量机制当中的V操作不同,信号量机制当中的V操作一定会改变信号量的值S=S+1,但是管程当中的signal是针对某个条件变量的,若不存在因为该条件而阻塞的进程,则 signal不会产生任何影响
8. 信箱通信是一种间接通信
9. 管程不仅可以实现进程间的互斥,还可以实现进程间的同步;管程是由编程语言支持的进程同步机制;在任何时候,只可以由一个进程在管程当中;管程当中定义的变量只可以被管程内的过程访问
10. 若X是管程当中的条件变量,则当进程执行x.wait()时所做的工作是阻塞该进程,并将其插入x的阻塞队列。
11. 信号量机制可以实现让权等待