《Linux操作系统原理分析之进程管理2》》(4)
- 3 进程管理
- 3.5 P、V操作
- 3.5.1 信号量
- 3.5.2 信号量的应用
- 3.5.3 进程同步机制
- 3.6 进程通信
- 3.6.1 消息通信
- 3.6.2 信箱通信
- 3.7 死锁
- 3.7.1 死锁的定义
- 3.7.2 死锁产生的必要条件
- 3.7.3 死锁的预防
- 3.7.4 死锁的避免
- 3.7.5 死锁的检测
- 3.7.6 死锁的解除
3 进程管理
3.5 P、V操作
PV操作必须是原子操作。
操作 | 说明 | 本质 | 实现 |
---|---|---|---|
P操作 | 申请信号量 | 申请获得临界资源中某块资源的使用权限 | 临界资源数sv的值在P操作后,计数器减 1;sv的值为0,挂起进程的执行。 |
V操作 | 释放信号量 | 归还临界资源中某块资源的使用权限 | 临界资源数sv的值在V操作后,计数器加 1;因sv为0被挂起的进程恢复执行。 |
3.5.1 信号量
1、信号量的定义: 信号量 S(Semaphore)是一个记录性变量。
2、S.value 的取值及意义:
取值 | 含义 |
---|---|
S.value >0 | 表示系统当前可用的该类资源的数目 |
S.value <=0 | 其绝对值表示系统中因请求该类资源而被阻塞的进程数目 |
3、信号量的操作:
除初始化之外,信号量仅能由 P、V 两条原语,即 P、V 两种操作来改变。
3.5.2 信号量的应用
1、实现进程互斥
用信号量解决几个进程互斥进入临界区的问题,几个进程共享一个公用信号量 mutex(互斥信号量)。
每个进程进入临界区必须先执行 P(mutex),退出临界区后执行 V(mutex)。对于 n 个进程同时共享一个临界资源,则 mutex 的取值为 1 ~ -(n-1)。
举例:有 1 台打印机 2 个进程,则 mutex 的取值为?
2、互斥:A和B两个进程无法同时执行。
3.5.3 进程同步机制
1、生产者-消费者问题
示例:父亲给盘子放苹果,母亲放橘子;儿子只吃苹果,女儿只吃橘子。父母是生产者,儿女是消费者,盘子是缓冲区。
映射:共享使用固定大小缓冲区的两个进程(生产者和消费者)在实际运行中存在的问题。
说明:生产者数量不限,消费者数量不限,缓冲区大小不限。
目标:分析进程与缓冲区之间的互斥关系。
注意:
在缓冲区为空时,消费者不能再进行消费
在缓冲区为满时,生产者不能再进行生产
消费者之间互斥,生产者之间互斥,但是生产者和消费者之间不影响
注意条件变量与互斥锁的顺序
2、读者-写者问题
描述:如购票系统,多人可同时查看,但是一个进程正在修改,其他进程则不能访问,否则可能同一个座位多次销售。
映射:多个进程同时访问共享数据时实际出现的问题。
目标:分析进程间读、读共享;写、写互斥;写、读互斥。
3、哲学家进餐问题
描述:有5个哲学家围坐在一个圆桌上,每两个哲学家之间都有一根筷子,哲学家平时进行思考,只有当他们饥饿时,才拿起筷子吃饭。规定每个哲学家只能先取其左边筷子,然后取其右边筷子,然后才可以吃饭。如果筷子已在他人手上,则需要等待。进餐完毕后,放下筷子继续思考。
要求:
只有当哲学家饥饿时才试图拿起左、右两根筷子。
如果筷子已在他人手上,则需等待。
只有同时拿起两根筷子才可以进餐。
目标:避免临界资源分配不当造成的死锁现象。
映射:进程间死锁问题。
解决:
1、最多允许四个哲学家同时就餐。2、奇数哲学家先拿左边筷子,偶数哲学家相反,先拿右边筷子;保证相邻的哲学家同时拿筷子时,有一个会被直接阻塞。
3.6 进程通信
类型 | 说明 |
---|---|
低级通信 | 交换信息量小。常用变量、数组等方式。例进程同步和互斥 P、V 操作。 |
高级通信 | 交换信息量大。采用缓冲、管道、信箱、共享区等方式。 |
根据通信实施方式和数据存取方式可分为三类:
- 共享存储器系统:相互通信的进程共享某些数据结构和共享存储区(如寄存器、数组等)。
- 消息传递系统
- 管道通信系统(共享文件)基于文件系统,用一个打开的共享文件连结两个相互通信的进程 。(以自然字符流方式读写)
3.6.1 消息通信
把需要在进程间传递的一组信息看作一个消息。在系统中设置一个存放消息的存储区域,称为消息缓冲区,它可以同时存放一定数量的消息。
通信原语:1) send 原语2) receive 原语
3.6.2 信箱通信
信箱:是一种公共的存储区,是通信的一种中间实体。
组成:
信箱头:描述信箱(信箱名称、信箱大小、信箱方向以及拥有该信箱的进程名等。
信箱体:存放消息,由若干格子组成,每个格子放一信件。(格子数目及大小在创建信箱时确定)
分类 | 说明 |
---|---|
单向信箱 | 只发不答 |
双向信箱 | 即发也收 |
公用信箱 | 与多个进程通信(按优先级处理) |
3.7 死锁
3.7.1 死锁的定义
所谓死锁,是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都无法向前推进,死锁是计算机系统和进程所处的一种状态。
3.7.2 死锁产生的必要条件
1、 互斥条件
2、 不剥夺条件
3、 请求与保持条件
4、 循环保持条件(进程资源图):存在一种进程资源的循环等待。
3.7.3 死锁的预防
死锁预防:设置某些条件,破坏产生死锁的必要条件中的一个或多个即可。
A. 破坏互斥条件:(应保证对临界资源的互斥访问,故不大可能实现)
B. 破坏不剥夺条件:当进程资源请求不能立即满足时,必须释放所有已获得的资源。
C. 破坏请求与保持条件:静态地一次性分配资源
D. 破坏循环等待条件:有序资源分配法。
1) 对资源进行编号;2)进程申请资源时,必须以编号递增方向申请。
3.7.4 死锁的避免
死锁的避免:在资源的动态分配过程中,用某种方法防止系统进入不安全状态。
系统状态 | 说明 |
---|---|
安全状态 | 在某个时刻,系统能按某种顺序,如〈P1 , P2 ,┉ Pn 〉来为每个进程分配需要的资源,直至最大需求,是每个进程都能顺利地完成。则称此时的系统状态为安全状态。〈P1 , P2 ,┉ Pn 〉为安全序列。 |
不安全状态 | 在某个时刻,系统不存在这样一个安全序列,则称此时的系统状态为不安全状态。 |
3.7.5 死锁的检测
死锁定理:S 为死锁状态的充分条件是,当且仅当 S 状态的资源分配表是不可完全简化的。
可完全简化 :不死锁
不可完全简化 ⇒ 死锁(死锁定理)
简化方法:寻找过程资源图中即不孤立又不阻塞的节点(进程节点)删去请求边和分配边。
具体如下:
1) 在资源分配表中,找一个即不阻塞也非独立的进程点 Pi,在顺利情况下,Pi 可获得所需资源而继续执行,直至运行完毕,再释放其占有的所有资源。(a)—(b)
2) P1 释放资源后,使 P2 获得资源而继续运行, P2 完成后又释放出所有的全部资源。(b)—(c)
3) 在进行一系列的简化后,若能消去图中所有边,使所有进程都成为孤立点。则称该图可完全简化,否则称该图为不可完全简化。
3.7.6 死锁的解除
将系统从死锁状态解脱出来,有两种方法:
1) 资源剥夺法(抢占):当发生死锁后,从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态。
2) 撤销进程法(终止):采用强制手段,从系统中撤销一个或部分死锁进程,并剥夺这些进程的资源,供其他死锁进程使用。