用一致性实现锁:
自旋锁:处理器通过循环来不停尝试获得锁,直到成功为止
自旋锁两种情况:
- 程序员占用锁的时间很短
- 程序员要求锁在可用时,锁定过程的时延较低
自旋锁要阻塞处理器并且一直循环等待锁被释放,自旋锁在某些条件下是不适用的.
把锁放到cache中保证其一致性:
- 自旋(在一个紧凑的循环中不断检测和尝试占用锁)过程的实现能够在本地cache副本中完成,不需每次尝试占用锁都进行全存储访问
- 对锁的访问的局部性,最后一个使用该锁的处理器能够很快的访问
对锁的本地副本进行循环检查,直到发现可以获取该锁,通过交换操作占用该锁
处理器首先读入锁变量以检测其状态,处理器会一直进行检测的过程,直到读入的数值表示锁已被解锁为止。处理器还要跟其他进程进行竞争,看谁能够首先锁定该变量,所有进程都使用交换指令来读入以前的值并
把1存到锁变量中。
自旋锁实现cache一致性:
一旦占用锁的处理器把0放到锁中,所有其他的cache副本都变为无效而且必须取回新值来更新副本
一旦占用锁的处理器把0放到锁中,所有其他的cache副本都变为无效而且必须取回新值来更新副本
只有一个cache首先取到未锁定值(0)的副本然后执行交换,其他处理器的cache缺失得到响应后,会发现变量已经被锁定,因此必须重新检测和自旋