
相关链接|死锁的必要条件
¶概念
¶临界区
-
临界区:进程中涉及临界资源的代码段
-
进入区.用于检查是否可以进入临界区的代码段。
-
退出区:将临界区正被访问的标志恢复为未被访问标志。
-
剩余区:其他代码

¶同步进制应该遵守的准则

¶进程同步机制
¶软件同步机制
-
软件同步机制
使用编程方法解决临界区问题
-
硬件同步机制
使用特殊的硬件指令,可有效的实现进程互斥
-
信号量机制
-
管程机制
¶信号量机制


¶信号量的使用
-
定义信号量
一种临界资源,定义一个信号量
互斥 —— 临界资源 —— s
-
初值
s.value= 资源总数 -
PV操作
进临界区前
P(s)退出临界区
V(s)
做题小点
V操作是唤醒一个进程
并不是说停下当前进程执行另一进程
而是,将唤醒进程从当前信号量的阻塞队列中取出,放入就绪队列,等待系统调度。
¶利用信号量实现前驱/同步

¶管程机制
管程定义的是公共的数据结构,如消息队列
进程定义的私有的数据结构,对进程是封闭的,进程无法访问
感觉像是将进程的同步与互斥封装到资源的使用中
就像是,在使用套接字时,会有个函数专门管理连接请求,在使用的过程中,我们发现,会有一个模式:即,当调用函数进行网络连接时,如果当前没有连接请求,调用函数的进程就会阻塞,而程序中不用显示的引用PV操作,而是利用库函数,对进程状态进行管控,简化了同步过程。
在进程访问资源时,都会调用管程,以申请资源,从而达到进程互斥的效果。
管程的三个特性
-
模块化(封装性)
-
抽象数据类型
-
信息隐蔽
¶经典的进程同步问题
¶生产者消费者模型
¶一个生产者,一个消费者,一个缓冲区

¶多个生产者,多个消费者,n个缓冲区
首先,生产者们与消费者们会相互竞争缓冲区队列,因为他们都会对缓冲区队列状态产生改变
其中,生产者们要竞争空位,以放入产品,消费者们要相互竞争产品。
所以还有空位信号量和物品信号量

但申请空位/商品,必须在申请缓冲区队列之前,可以这样理解,先申请空位/商品,在申请进入缓冲区放/拿商品。
而且如果先申请进入队列,而恰好没有空位,此时进程会阻塞,而进程已经进入 进入队列的临界区,此时其他进程也讲无法进入队列临界区,导致消费者无法进入临界区消费,最后导致死锁。
¶读者写者问题


写者需要等待所有读者进程均退出后才能接着写
如果当前无读者,则可能资源处于“写”状态,需要申请;
如果当前有读者,说明当前资源处于“读”状态,无需申请;
如果当前所有读者均读完(readcount == 0 即没有读者了),可能等待队列中有写者在被阻塞,则最后一个读者负责唤醒“写进程”。

¶哲学家进餐问题

破坏死锁的任何一个必要条件即可死锁的必要条件
¶信号量使用总结


