死锁:由于竞争资源或通信时,两个线程永远相互等待的事件。
资源分类:
可重用资源:资源不能被删除,任何时刻只能有一个进程使用,例如CPU,I/O设备等,可能出现死锁
消耗资源:资源是被创建和销毁的,例如中断和通信,可能出现死锁。
出现死锁的四个必要条件:
- 互斥,某个资源在任意时刻只能有一个进程访问。
- 持有并等待:进程保持至少一个资源,并等待由其他进程占用的资源
- 非抢占:资源只要在进程使用结束后自愿释放
- 循环等待:A等B,B等C,C等A。
死锁处理的三类办法:
- 死锁预防:确保永远不会出现死锁。效率低
具体做法是切断死锁的四个必要条件:
改掉互斥,有全部资源再申请,没有就释放,按固定的顺序请求资源 - 死锁避免:在使用资源前进行判断,确保不会出现死锁后再分配。
具体做法是:
1.要求进程声明需求的最大资源数,我的资源够的话就给你,或加上之前队列里结束后释放的够的话也行
2.动态检查分配状态,利用资源分配图,确保不会出现循环等待。 - 死锁检查与恢复:检测到进入死锁后进行恢复
死锁检测:当系统定期要进行死锁检查,看看有没有死锁。
死锁恢复:即终止产生死锁的进程。终止的顺序:优先级低的,运行时间长的,占用资源多的,终止进程的数目。
进程间通信可分为:
- 间接通信,通过内核
- 直接通信
还可以分为:
- 同步通信:发送方必须等到接受方接受,
- 异步通信:发完就不管了
通信链路缓存:
- 0容量,发完必须有人接
- 有限容量:缓冲区满了就必须发
- 无限容量,想发就发,在链路中缓存
进程间通讯机制:
- 信号:进程间软件中断通知处理机制,首先在内核注册信号,告诉内核出现信号都是啥意思,调用哪个函数,然后当其他进程有信号过来是,内核就通知进程,进行处理。对信号的处理有:
捕获,忽略,和屏蔽
信号传送的信息量很小,只是一个快速通信。 - 管道:进程间基于内存文件的通信机制,进程并不关心另一端是谁。是一种间接通信机制
- 消息队列:操作系统维护的一个队列,也是一种间接的通信机制。进程创建了消息队列后,即使进程结束了,队列还是存在,所以可以不同声明周期的进程的通信。
- 共享内存:把同一段物理内存空间映射到多个进程的地址空间(感觉很像C++中的引用)。也是间接通信方式,是最快的一种通讯方式,但是没有同步机制,需要自己另外设置同步机制以避免正读正写。