《linux内核设计与实现》
内核同步介绍
1、临界区和竞争条件
临界区:访问和操作共享数据的代码段。
竞争条件:两个线程有可能处于同一个临界区中同时执行,那么就算是一个BUG,即成为竞争条件。
2、加锁
为了防止同时两个进程修改同一个数据导致出错,此时当我们进程要修改一个数据时,就需要上一把锁,以防止其他进程修改。
伪并发:在一个程序内通过处理信号去实现同步
真并发:通过对称多处理器去实现同步
在内核抢占时能并发访问的成为抢占安全代码(preempt-safe)
在对称多处理器能避免并发访问的成为SMP安全代码
在内核编译中有CONFIG_SMP和CONFIG_PREEMPT选项,根据这两个选项可以配置我们是否需要锁的机制。
内核可能发生并发执行的原因:
1、中断:因为中断随时发生,可能打断正在执行的代码
2、软中断和tasklet:内核在任何时刻都可能调度,因此也可能打断正在执行的代码
3、内核抢占:内核具有抢占性,因此内核的任务可能被其他任务抢占
4、睡眠及与内核空间的同步:内核的进程可能睡眠,这就会唤醒调度程序,导致调度新的用户进程执行
5、剁成多处理:两个或多个处理器可以同时执行代码
3、死锁
1、自死锁:当一个线程试图获取自己就已经拥有的锁时就会造成死锁
步骤:获得锁->再次试图获得锁->等待锁重新可用
2、ABBA死锁:
线程