资源类型: R 1 , R 2 , . . . , R m R_1, R_2, ..., R_m R1,R2,...,Rm,每类资源 R i R_i Ri 有 W i W_i Wi 个实例
进程访问资源:请求(申请空闲资源)、使用(占用资源)、释放(资源状态由占用变空闲)
死锁:由于竞争资源或者通信关系,两个或更多线程在执行中出现永远相互等待只能由其他进程引发的事件。
必要条件:
死锁预防:破坏死锁必要条件,确保系统永远不会进入死锁状态
死锁避免:利用额外的先验信息,在分配资源的时候判断是否会出现死锁,只有在不会出现死锁时分配资源。
银行家算法:
线程数量为 n n n,资源类型数量为 m m m,最大需求 n × m n×m n×m 矩阵 Max
,已分配 n × m n×m n×m 矩阵 Allocation
,未来需求 n × m n×m n×m 矩阵 Need
,其中 Need[i, j] = Max[i, j] - Allocation[i, j]
当前可用资源向量Available
,Requesti
代表线程 T i Ti Ti 请求资源向量
如果 Requesti > Need[i]
,则超过线程 T i Ti Ti 最大需求,拒绝资源申请;
如果 Requesti > Available
,则资源不可用,线程 T i Ti Ti 等待,否则尝试把资源分配给线程 T i Ti Ti,并修改下列数据额结构的数值:
Available = Available - Need[i]
Allocation[i, j] = Allocation[i, j] + Requesti
Need[i] = Need[i] - Requesti
系统执行安全性算法,检查此次分配后,系统是否处于安全状态。若安全,则执行资源分配给线程 T i Ti Ti,否则恢复原来的资源分配状态,线程 T i Ti Ti 等待。
安全性算法:
Need
矩阵找到符合下面条件的行:该行对应的线程不在安全序列中且该行小于等于 Available
向量,把对应的线程加入到安全序列,如果找不到则系统处于不安全状态Available = Available + Allocation[i]
例题:
某系统有 R 1 R1 R1、 R 2 R2 R2 和 R 3 R3 R3 共三种资源,在 T 0 T0 T0 时刻 T 1 T1 T1、 T 2 T2 T2、 T 3 T3 T3 和 T 4 T4 T4 这四个线程对资源的占用和需求情况如下表,此时系统的系统总资源为 (9, 3, 6)
和可用资源向量 Available(2, 1, 2)
,试问:
如果此时线程 T 1 T1 T1 和 T 2 T2 T2 均发出资源请求向量 Request(1, 0, 1)
,为了保证系统的安全性,如何分配资源给这两个线程?说明所采用策略的原因。
解:
若此时 T 1 T1 T1 发出资源请求 Request(1, 0, 1)
,按照银行家算法检查:
Request(1, 0, 1) <= Need(2, 2, 2)
Request(1, 0, 1) <= Available(2, 1, 2)
试分配并修改相应数据结构,由此形成的线程 T 1 T1 T1 请求资源后的资源分配情况如下
利用安全性算法检查系统是否安全 ,可用资源向量 Available(1, 1, 1)
已不能满足任何线程,进入不安全状态,此时系统不能讲资源分配给线程 T 1 T1 T1
若此时 T 2 T2 T2 发出资源请求 Request(1, 0, 1)
,按照银行家算法检查:
Request(1, 0, 1) <= Need(2, 0, 2)
Request(1, 0, 1) <= Available(2, 1, 2)
试分配并修改相应数据结构,由此形成的线程 T 2 T2 T2 请求资源后的资源分配情况如下
利用安全性算法检查系统是否安全,可用资源向量 Available(1, 1, 1)
仍可满足线程 T 2 T2 T2 的资源请求,最终可得安全序列 { T 2 , T 3 , T 4 , T 1 } \{ T2, T3, T4, T1 \} { T2,T3,T4,T1}
死锁是线程提出资源请求且全部线程进入阻塞状态。如果两个申请立即得到满足,系统处于不安全状态但并没有立刻进入死锁状态,因为此时所有的线程没有提出新的资源请求,全部线程均没有因资源请求没得到满足而进入阻塞状态。
进程通信(IPC):进程进行通信和同步的机制。进程之间建立通信链路,使用 send/receive
原语交换信息。
pipe()
函数创建管道,设置 stdout
为 管道写端,设置 stdin
为管道读端。管道没有名字,所以只能由有亲缘关系的进程使用,如父子进程之间传递信息。套接字:常用于网络编程,可以用于不同主机之间的网络通信,也可以用于同一主机的不同进程之间的通信。
信号:通知某时间发生了,如SIGPIPE,这个是在socket编程的时候,send数据给对方的时候,对方非正常关闭时,操作系统会告诉进程这个信号,即对方已经异常退出。