资源分配图
有两个集合,一个是进程集合,另一个是资源集合,如果进程i需要某资源j的一部分,则连边i->j, 如果一个资源j的一部分被分配给了进程i,则连边j->i, 资源分配图出现了有向环是发生了死锁的必要不充分条件。因为边只表示一部分资源的分配,而不是全部资源
死锁的必要条件
- 互斥:同一时间只能有一个进程使用资源
- 持有并等待:进程至少持有一个资源正在等待其他进程持有的额外资源
- 无抢占:只能资源释放,等待任务结束后释放。
- 循环等待
死锁的处理办法
死锁预防
破坏互斥不现实,破坏持有并等待不可用,因为资源无法动态预判,需要提前分配好资源,可能发生饥饿,破坏抢占也不现实,破坏循环等待有效,将资源排序并让进程按顺序申请。
死锁避免

银行家算法
寻找安全序列是否存在的算法。主要就是绘制形成几个矩阵,各进程持有各类型资源矩阵,需求资源矩阵,可分配资源矩阵。
死锁检测与恢复
允许系统产生死锁状态
1简化资源分配图为线程等待图,如果线程等待图出现了环则发生了死锁。
2找到能结束的程序,假设他结束,然后拿走资源,循环。
杀,按照优先级杀掉死锁,剩余运行时间,占用自用资源、完成所需要的资源、需要终止的进程数量等
回滚,重启进程,这有可能导致某个进程一直被重启
IPC进程间通信
通信有两种模型:
第一是直接通信,两个进程之间直接建立链路
第二是通过内核间接通信,通过消息队列的方式,进程从消息队列中接收消息。
通信可以是阻塞或者非阻塞的
通信缓存区的大小可以是有限的或者无限的
信号
发出通知信息,软件中断和事件处理,收到信号的时候可以指定信号处理函数被调用或者依靠操作系统的默认操作,
应用程序要先注册信号处理函数,当收到信号的时候,在内核态修改应用程序的堆栈,然后跳回用户态执行,即操作系统来帮助跳转到信号处理函数执行,然后返回之前的现场
管道
管道是用来交换数据的,在内核中完成,

消息队列
管道是字节流,不是结构化数据。
Message是一个字节序列储存,Message Queues是消息数组,然后FIFO或者FILO实现。
可以通过message queues实现一种结构的数据。
共享内存
直接通信,方便、快速、高效、但是需要同步, 将同一块物理内存映射到不同的逻辑页面.