一、管程
(1)管程中定义的共享数据结构只能被管程中定义的函数进行修改,想要修改共享数据结构只能进行函数调用。
(2)管程中定义了很多函数,但是同一时刻只允许一个进程使用管程中的某个函数。
管程调用中,代码由用户编写,编译器负责实现个进程互斥的进入管程中的过程,即调用管程中的函数。
此时管程中的empty与full可以看作临界区中有没有产品。
二、死锁
1、死锁概念
死锁
:在并发环境下,各进程因竟争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后若无外力干涉,这些进程都将无法向前推进。
操作系统更关心死锁和饥饿,死循环由程序员造成。
2、死锁的处理策略
2.1、预防死锁
2.1.1 破坏互斥条件
例:使用spooling技术,设置一个输出进程对各进程进行响应,打印机仍然是互斥的访问,但是可以在输出进程中对进程一个一个执行。这样就在逻辑上把独占设备改为共享设备。
2.2.2破坏不剥夺条件
2.2.3 破坏请求和保持条件
2.2.4 破坏循环等待条件
在这里插入图片描述
2.2、避免死锁
银行家算法安全序列:
银行家安全性算法(回溯):
能找到安全序列
,则此时资源分配是安全的,可以进行分配,但是如果找不到安全序列,则让进程进入阻塞状态从而避免死锁。
2.3、死锁的检测和解除
2.3.1 死锁的检测
(1)利用某种数据结构来保存资源的请求和分配信息。
(2)提供(图)算法,利用上述信息来检测系统是否已进入死锁状态。
(3)图中分为两种结点和两种边,资源结点和进程结点。进程申请资源的边和资源分配给进程的边。
对于这样的图结构,此时R1中三个资源,已经分配给进程P1两个,P2一个,R2中两个资源已经分配给P2一个,还有一个资源剩余。此时,P1向R2求求一个资源那么便可以分配。而P2向R1申请资源由于R1已经没有资源了便会阻塞,只能等P1执行完毕归还给R1资源,P2才可以开始执行。因此找到一个安全序列{P1,P2}。先消除P1的所有边,再消除P2的所有边。如果最终不能消除所有边,那么此时就是发生了死锁,而连着边的进程便会陷入死锁状态。
2.3.2死锁的解除