进程同步
多进程共同完成一个任务需要等待其它进程的配合(走走停停)
信号与信号量
信号量是一种整型变量,用来判断什么时候需要睡眠以及唤醒的信息
信号量临界区保护
如果一个进程P1在修改信号量empty的中途时间片到时发生调度,切换到进程P2执行,信号量的修改会发生错误,因此需要在P1执行修改信号量的阶段给empty上锁(临界区保护)
临界区代码的保护原则:
- 互斥进入: 必须满足,保证正确性;
- 有空让进: 临界区空闲状态,应该使进程能够进入;
- 有限等待: 不能始终只有一个进程循环进入临界区,其它进程发出请求一段时间之后也能进入。
临界区代码保护方法:
- 软件方法:两个进程(Peterson算法),多个进程(Lamport面包店算法)
- 硬件方法:开关中断(只适用于一个CPU),硬件原子指令法(较好)
用临界区保护信号量(保证信号量语义正确),根据信号量语义实现多进程同步
死锁处理
死锁定义:互相等待对方持有的资源而造成谁都无法执行
死锁的四个必要条件:
- 互斥使用:
同一时刻只能有一人使用 - 不可抢占:
只能自愿放弃,主动结束使用 - 请求和保持:
进程必须占有资源,同时再去申请新的资源 - 循环等待:
在资源分配图中存在一个环路
死锁处理的四种方法:
- 死锁预防
破坏死锁出现条件
如:- 进程执行前一次性申请所有需要的资源
- 缺点1:需要预知未来,编程困难
- 缺点2:很多资源分配后很长时间才使用,资源利用率低
- 对资源类型进行排序,自愿申请必须按序进行,不会出现环路等待
- 缺点:资源浪费
- 进程执行前一次性申请所有需要的资源
- 死锁避免
检测每个资源请求,如果造成死锁就拒绝- **安全状态:**系统中的所有进程存在一个可完成的执行序列P1,…,Pn,则系统处于安全状态
- **安全序列:**可执行序列P1,…,Pn
- 找出系统中的安全序列(银行家算法,Dijkstra提出)
- 每次申请资源时执行银行家算法,判断之后会不会造成死锁
- 死锁检测+恢复
检测到死锁出现时,让一些进程回滚,让出资源 - 死锁忽略
忽略死锁问题,等待重启
PC机上装的Linux、Windows等系统都采用死锁忽略方法。