doc: lockref介绍文档

This commit is contained in:
fslongjin 2022-10-06 21:44:19 +08:00
parent 1067ae7da8
commit 112775fd6b
3 changed files with 37 additions and 0 deletions

View File

@ -8,3 +8,4 @@
:maxdepth: 1
locks
lockref

View File

@ -0,0 +1,35 @@
(_lockref)=
# lockref
  lockref是将自旋锁与引用计数变量融合在连续、对齐的8字节内的一种技术。
## lockref结构
```c
struct lockref
{
union
{
#ifdef __LOCKREF_ENABLE_CMPXCHG__
aligned_u64 lock_count; // 通过该变量的声明使得整个lockref的地址按照8字节对齐
#endif
struct
{
spinlock_t lock;
int count;
};
};
};
```
## 特性描述
  由于在高负载的情况下,系统会频繁的执行“锁定-改变引用变量-解锁”的操作这期间很可能出现spinlock和引用计数跨缓存行的情况这将会大大降低性能。lockref通过强制对齐尽可能的降低缓存行的占用数量使得性能得到提升。
  并且在x64体系结构下还通过cmpxchg()指令,实现了无锁快速路径。不需要对自旋锁加锁即可更改引用计数的值,进一步提升性能。当快速路径不存在(对于未支持的体系结构)或者尝试超时后,将会退化成“锁定-改变引用变量-解锁”的操作。此时由于lockref强制对齐只涉及到1个缓存行因此性能比原先的spinlock+ref_count的模式要高。
## 关于cmpxchg_loop
  在改变引用计数时cmpxchg先确保没有别的线程持有锁然后改变引用计数同时通过`lock cmpxchg`指令验证在更改发生时没有其他线程持有锁并且当前的目标lockref的值与old变量中存储的一致从而将新值存储到目标lockref。这种无锁操作能极大的提升性能。如果不符合上述条件在多次尝试后将退化成传统的加锁方式来更改引用计数。
## 参考资料
  [Introducing lockrefs - LWN.net, Jonathan Corbet](https://lwn.net/Articles/565734/)

View File

@ -29,6 +29,7 @@
| _irq() | 在加锁时关闭中断/在放锁时开启中断 |
| _irqsave()/_irqrestore() | 在加锁时保存中断状态,并关中断/在放锁时恢复中断状态 |
&emsp;&emsp;当您同时需要使用自旋锁以及引用计数时,一个好的方法是:使用`lockref`. 这是一种额外的加速技术,能额外提供“无锁修改引用计数”的功能。详情请见:{ref}`lockref <_lockref>`
## 详细介绍
### semaphore信号量