一、什么是同步机制?
并发竞争本质上是多个线程对共享资源的访问存在冲突。使用同步机制(如互斥锁、信号量等),可以确保共享资源在任何时刻只有一个线程访问。如不采取必要的同步措施,将会对一些关键数据结构进行交错访问和修改,从而导致这些数据结构状态的不一致,进而导致系统崩溃。
因此,为了确保系统高效稳定有序地运行,linux 必须要采用同步机制。
二、Linux同步机制有哪些?
- 原子操作
- 自旋锁 Spin Lock
- 读写自旋锁
- 顺序锁(seqlock,只包含在2.6内核及以后的版本中)
- 信号量 semaphore
- 读写信号量
- 互斥体 mutex
- 大内核锁(BKL,Big Kernel Lock,只包含在2.4内核中,不讲)
- 大读者锁(brlock,只包含在2.4内核中,不讲)
- RCU(对读写锁的优化,只包含在2.6内核及以后的版本中)
三、什么是死锁?如何避免死锁?
定义:死锁指的是两个或多个进程或线程互相等待对方所持有的资源而无法继续执行的情况。这种情况下,每个进程都在等待其他进程释放它需要的资源,但是没有任何一个进程会主动释放自己所持有的资源,导致所有进程都无法前进,形成了死循环,这就是死锁。
死锁产生通常需要满足以下四个必要条件:
-
互斥条件:任意时刻一个资源只能给一个进程使用;
-
不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺;
-
请求和保持条件:一个进程因请求资源而阻塞(睡眠、被高优先级的中断打断)时,对已获得的资源保持不放。
-
循环等待条件:形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个进程申请。
只有当这四个条件同时满足时,死锁才会发生。因此,预防死锁的方法就是破坏这四个必要条件之一或多个。
死锁预防:
我们可以通过破坏死锁产生的4个必要条件来 预防死锁,由于资源互斥是资源使用的固有特性是无法改变的。