锁
一、概述
在GP中,定义了三种锁
- 自旋锁(Spinlocks)
- 轻量级锁(LWLocks)
- 普通锁(Regular locks,也叫重量级锁)
自旋锁
与互斥锁有点类似。针对某一项资源,在任何时刻,最多只能有一个保持者。对于互斥锁,如果资源已经被占用,资源申请者进入睡眠状态。但自旋锁会一直循环查看当前保持者是否已经释放锁,这个循环查看的状态就被形象地称之为自旋。
自旋锁一般是短期持有的,等待竞争的锁不需要做内核态和用户态之间的切换,他们只需要等一等,等到持有自旋锁的保持者释放即可获取。所以长时间上锁是非常耗费性能的,它阻止了其他进程或线程的运行和调度。所以会有一个自旋时间,时间一到立即释放自旋锁。自旋锁没有死锁检测和出错释放,一般由内核调用。
轻量级锁
为共享内存中需要并发访问的结构体提供锁保护。 轻量级锁通过做一个标记来记录此时是否有人在使用该资源。在没有锁竞争的情况下,获取和释放一个轻量级锁都是很快的。当一个进程必须等待一个轻量级锁时,会阻塞在一个SysV信号量上,因此等待过程并不消耗CPU时间。等待进程按照申请锁的先后顺序获得授权,没有超时机制,也没有死锁检测机制。
普通锁
也叫做重量级锁,用于对数据库对象,比如表、数据记录等加锁。普通锁支持多种不同的加锁模式,同时也支持死锁检测以及在事务结束时自动释放。
我们平时接触到的都是普通锁,简单总结下:自旋锁等