LINUX系统中的锁
说一下LINUX系统中的锁
互斥锁,读写锁,自旋锁
自旋锁发生死锁
死锁产生的条件
多个并发进程因争夺系统资源而产生相互等待的现象。
-
互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源;
-
请求和保持条件:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源
-
不可剥夺条件:进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放
-
环路等待条件:进程发生死锁后,必然存在一个进程-资源之间的环形链 ,环路中每个进程都在等待下一个进程所占有的资源
如何避免死锁
- 破坏请求和等待条件。 所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源
- 破坏不可抢占条件。 当进程新的资源未得到满足时,释放已占有的资源
- 破坏环路等待条件。 系统给每类资源赋予一个序号,每个进程按编号递增的请求资源,释放则相反
死锁检测和死锁恢复
- 死锁检测
- 每种类型一个资源的死锁检测
- 每种类型多个资源的死锁检测
- 死锁恢复
- 抢占恢复。 从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态
- 回滚恢复。 周期性地检查进程的状态(包括请求的资源),将其写入一个文件,当发生死锁,回滚到之前的某个时间点
- 杀死进程恢复。 终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。
信号处理机制
哪两个信号不能忽略
SIGKILL和SIGSTOP,这两种信号不能被忽略
- 它们向超级用户提供一种使进程终止或停止的可靠方法。
- 如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是示定义的。
原子操作和锁机制
原子操作实现同步