《操作系统》——进程管理(中)
进程同步
- 为什么要引入进程同步的概念?
因为进程有异步性,各进程以各自独立的、不可预知的速度向前推进。但实际应用中,某两个操作的顺序是固定的(例如读数据和写数据),如何解决这种异步问题,就是“进程同步”所讨论的内容。 - 不同的进程之间会存在什么关系?
- 当单纯用本节介绍的方法解决这些问题时会遇到什么新的问题吗?
一、进程同步、进程互斥
(一)进程同步
讨论具有合作关系的两个进程的顺序问题
同步也称直接制约关系,是指未完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调工作次序而产生的制约关系。直接制约关系就是源于他们之间的相互合作。
(二)进程互斥
1、互斥概念
讨论共享某种资源(临界资源)的两个进程的访问方式问题
共享方式分为:互斥共享方式(需要互斥)、同时共享方式
对临界资源的访问必须互斥地进行,互斥,也称间接制约关系,进程互斥指当一个进程访问某临界资源时,另一个想要访问临界资源的进程必须等待,当前访问临界资源的进程访问结束,释放该资源后,另一个进程才能去访问该临界资源。
2、对临界资源互斥访问的四个部分
- 进入区:检查是否可以进入临界区,若可以进入,上锁,实现互斥
- 临界区:访问临界资源的那段代码
- 退出区:负责解除正在访问临界资源的标准,解锁,实现互斥
- 剩余区:做其他处理
3、互斥的原则
如果一个进程暂时不能进入临界区,那么该进程是否应该一直占着处理机?该进程是否有可能一直进不了临界区?——引出互斥的原则:
- 空闲让进:临界区空闲时,允许一个进程立即进入
- 忙则等待:如果临界区内有进程,其他申请临界区的进程必须等待
- 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(防止饥饿)
- 让权等待:当进程不能进入临界区,应立即释放处理机,防止进程忙等
二、进程互斥的软件实现方法
(一)单标志法
(二)双标志先检查
(三)双标志后检查
(四)Peterson算法
三、进程互斥的硬件实现方法
(一)中断屏蔽法
(二)TestAndSet(TS指令/TSL指令)
将“检查”和“上锁”一气呵成
(三)Swap指令(XCHG)指令
四、信号量机制
总结:
1、在双标志先检查法中,进入区的检查和上锁无法一气呵成,从而导致了两个进程有可能无法同时进入临界区的问题;
2、所有的解决方案都无法实现让权等待,会出现忙等
Dijkstra提出信号量机制——一种卓有成效的实现进程互斥、同步的方法
(一)信号量机制
- 信号量是一个变量(可以是一个整数,也可以是一个记录型变量),用来表示系统中某种资源的数量
- 通过wait(S)/P(S)和signal(S)/V(S)原语对信号量进行操作
(二)信号量分类
1、整型信号量
用一个整数变量,标识系统中某种资源的数量
只能有三种操作:初始化、P操作、V操作
优点:利用原语实现了检查和上锁一气呵成,避免了并发、异步导致的问题
缺点:不满足“让权等待”原则,会发生忙等
2、记录型信号量
用一个记录型数据结构表示的信号量:整型剩余资源数、指针指向等待队列
如果信号量值小于0,说明此时有进程在等待这种资源,绝对值为当前等待队列中的进程数
要知道P、V原语实现了哪些操作
五、用信号量实现进程互斥、同步、前驱关系
(一)实现进程互斥
1、注意
- 信号量mutex表示进入临界区的名额
- semaphore mutex=1;初始化信号量,表示记录型信号量(是一个数据结构(资源数+等待队列)而不是整型)
- 对不同的临界资源需要设置不同的互斥信号量
- PV操作必须成对出现
2、步骤
- 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
- 设置互斥信号量mutex,初值为1(打印机一台)
- 在进入区P(mutex)
- 在退出区V(mutex)
(二)实现进程同步
进程同步:要让各并发进程按要求有序地推进
1、步骤
- 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
- 设置同步信号量S,初始值为0
信号量S代表某种资源,刚开始是没有这种资源的,P2需要使用这种资源,而又只能由P1产生这种资源 - 在“前操作”之后执行V(S)
- 在“后操作”之前执行P(S)
(三)实现前驱关系(多级同步)
- 在前驱关系图中,要为每一对前驱关系各设置一个同步信号量,初值为0;
六、生产者-消费者问题
七、多生产者-多消费者问题
八、吸烟者问题
九、读着写着问题
十、哲学家问题
十一、管程——封装思想encapsulation
管程将同步互斥复杂的细节隐藏在管程定义的“过程”(函数)中,对外提供简单的调用接口
(一)为什么引入管程
- 信号量机制存在的问题,编写程序困难,易出错。例如需要关注PV操作的顺序。
- 能否设计出让程序员不需要再关心复杂的PV操作的机制
- 引入管程——管程是一种高级的同步机制
(二)管程的定义和基本特征
1、管程的组成
- 局部于管程的共享数据结构
- 对该数据结构进行操作的一组过程
- 对局部于管程的共享数据设置初始值
- 管程有一个名字
2、管程的基本特征
- 局部于管程的数据只能被局部于管程的过程所访问
- 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
- 每次仅仅允许一个进程在管程内执行某个内部过程
(三)拓展1:用管程解决生产者消费者问题
- 个进程必须互斥访问管程的特性是由编译器实现的
- 可在管程中设置条件变量及等待P/唤醒V操作以解决同步问题