进程同步互斥以及通信机制
进程之所以会产生同步和互斥问题,一切源于进程的并发执行。如果是单个进程的话,是不可能产生互斥和同步问题的。
一个最经典的例子就是ATM问题:
进程互斥
由于各个进程要求使用共享资源,而这些资源需要排他性使用,各个进程之间竞争使用这些资源,这一关系称为进程互斥。
临界资源:系统中某些资源一次只允许一个进程使用
临界区:各个进程中对某个临界资源实施操作的程序片段
临界区使用原则:
- 没有进程在临界区时,想进入临界区的进程可以进入
- 不允许两个进程同时处于临界区
- 临界区外运行的进程不得阻塞其他进程进入临界区
- 不得时进程无线等待进入临界区
进程互斥软件解决方案
通过编程技巧,使用自旋锁,进行忙式等待。
进程互斥硬件解决方案
进程同步
进程同步是指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。一个经典进程同步问题就是:生产者/消费者问题。
信号量及PV操作
信号量:一个特殊变量,用于进程间传递信息的一个整数值
定义:
对信号量可以执行的操作:初始化、P操作、V操作
信号量及PV操作解决互斥问题
信号量及PV操作解决生产者/消费者问题
#信号量及PV操作解决读者/写者问题
解法:
rc用来记录读者的数量,不需要每一个读者都执行PV操作,因为读可以共享,所以只需要第一个读者做P操作,最后一个读者做V操作,这样操作使得rc成为临界变量,其读写需要保持互斥。
管程(Monitor)
管程由关于共享资源的数据结构及在上操作的一组过程组成。作为一种同步机制,管程需要保证互斥和同步。
互斥:由编译器负责保证。
同步:管程中设置条件变量及等待/唤醒操作解决同步问题。
(1)HOARE管程
等待队列:定义了入口等待队列位于管程内部的紧急等待队列保证互斥进入管程
条件变量:管程内部说明和使用的一种特殊类型的变量,可以执行wait()和signal()操作
应用:在Java中可以用类似管程解决生产者/消费者问题
(2)MESA管程
将HOARE管程中的signal()改为notify(),避免了两次额外的进程切换。
进程通信
为什么需要通信?
进程的同步和互斥属于低级进程通信,效率低,对用户不透明。当进程之间要传送大量数据时,应当利用OS提供的高级通信工具,保证高效的传输大量数据。
进程通信基本方式
- 共享内存
- 管道
- 消息传递
- 客户端-服务器系统:套接字、远程过程调用(RPC)
举例:
消息传递中有SEND和RECEIVE原语,可以用PV操作实现两种原语,从而可以用消息传递实现生产者/消费者问题。