临界区和竞争条件
访问和操作共享数据的代码段称为临界区(临界段)。
多个执行线程(如进程、中断处理程序,内核线程等)同时执行临界区代码,可能导致资源共享,因此需要避免在临界区中并发访问。
因此临界区代码在执行结束前不可被打断,整个临界区需要如同是一个不可分割的指令一样。
两个执行线程在同一个临界区同时执行,如果发生这种情况,称为竞争条件。
即使单进程的多个线程共享文件,或者在一个程序内部处理信号,也可能产生竞争条件,导致并发。虽然这种并发并不是真的同时发生,而是交叉进行,属于伪并发。
避免并发和防止竞争条件称为同步。
原子操作可以保证交错不可能发生,因为处理器会从物理上确保这种不可能。
锁的使用是自愿的、非强制的,它属于一种编程者自选的编程手段。
Linux实现了几种不同的锁机制。
各种锁机制之间的主要区别在于当锁已经被其它执行线程持有因而不可用时的行为表现,比如等待,睡眠直到锁可用为止。
锁是采用原子操作实现的。
死锁的产生原因是执行线程(一个内部或者多个相互)在相互等待锁。
锁的争用(指锁正在被占用时有其它执行线程试图获得该锁)导致系统性能降低。
加锁粒度用来描述加锁保护的数据规模。
锁保护的不是临界区,而是临界区使用的数据。