锁专题(10)Linux SeqLocks 结合锁定技术
结合锁定技术
一个可以结合几种锁定技术。
所描述的使用RCU机制的无锁列表操作需要自旋锁,以确保编写者具有排他性。
后缀以相同的方式使用自旋锁。
结合锁定技术的另一个示例是我提出的修改,以使对页表条目的原子操作成为可能。
这是通过将锁定从仅依赖page_table_lock更改为原子操作的组合以及页表自旋锁的使用来实现的。
在Linux内核中,针对页表上的任何操作都需要获取pag...
2020-10-17 08:15:55 |
Lock
锁专题(10)Linux SeqLocks 原子变量和使用计数器
原子变量和使用计数器
Linux提供了一个定义atomic_t类型变量的工具。
该类型的变量无法使用常规C运算符进行处理,而是需要使用访问器进行操作。
想法是这些变量可以在多处理环境中安全地进行操作而无需保护自旋锁。
以下是最常用的宏列表维护原子变量。
atomic_t x;
ATOMIC_INIT(x);
y = atomic_read(x);
atomic_set(x, ...
2020-10-17 08:15:55 |
Lock
锁专题(10)Linux SeqLocks 顺序锁
Seqlock
Seqlock是最可扩展的锁形式,如果有大量读取器,则很有用。
读者不需要写任何内存来处理这种“锁”。也许根本不应该谈论获得锁。
读者比较关键部分前后的计数器。
如果计数器在关键部分没有改变,则没有编写者处于活动状态,并且关键部分产生的结果有效。
如果已更改,则将丢弃关键部分的结果,然后再次运行。
ps: 这个思想也非常简单。读的时候不去阻塞写,如果发生了写那就重...
2020-10-17 08:15:55 |
Lock
锁专题(10)Linux Reader/Writer Spinlocks 读写自旋锁详解
目的
Reader-Writer自旋锁允许同一数据结构上的多个读取器或一个单一写入器。
如果受保护的结构经常被读取而很少被写入,则这很有用。
例如,Linux任务列表受rwlock保护。
多个进程可能正在扫描任务列表,或者单个进程可能会修改任务列表。
实现
rwlocks for Itanium的实现也使用单个32位值。
每个阅读器的锁定值都会增加。
如果锁定值是正数,则锁定...
2020-10-17 08:15:55 |
Lock
锁专题(10)Linux SpinLocks 自旋锁详解
4.1 目的
自旋锁是在Linux内核中实现的,以保护数据结构,并允许锁持有者专有地访问受自旋锁保护的结构。
自旋锁的设计既快速又简单。
只允许有限的锁嵌套(任何嵌套都需要正确记录!),没有死锁防止机制,也没有显式的争用管理。
存在多种自旋锁类型来处理并发中断或底部处理程序。
自旋锁的这些专门版本在此不予讨论,因为它们会使描述过于复杂。
主要用于界定关键部分的两个自旋锁功能是:
...
2020-10-17 08:15:55 |
Lock
锁专题(10)Linux SeqLocks 原子信号量说明
3. 原子信号量说明
Itanium 处理器提供了许多称为“信号量指令”的原子读取修改写入操作。
信号量指令之所以昂贵,是因为它们获取了专有的高速缓存行,然后以原子方式对高速缓存行执行了读取修改写入周期。
处理器无法以与其他Itanium指令相同的方式优化内存访问。
信号量指令始终是非推测性(non-speculative)的。
这意味着原子信号指令会导致管道停顿。
所有信号量操...
2020-10-17 08:15:55 |
Lock
锁专题(10)Linux SeqLocks
Effective Synchronization on Linux/NUMA Systems
要在基于Itanium的大型NUMA系统上获得令人满意的性能,必须进行有效的锁定。
当前,在Linux内核中,NUMA计算机上并行执行流的同步是通过多种机制实现的,这些机制包括原子操作,锁定和内存访问排序。
各种同步方法也可以组合以提高性能。
演讲提出了Linux onItanium上基本...
2020-10-17 08:15:55 |
Lock
锁专题(9) SynchronousQueue 同步队列源码解析
SynchronousQueue
是什么
SynchronousQueue 是这样一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。
简而言之:线程安全,阻塞。
入门案例
我们定义两个线程,一个负责写入,一个负责读取。
import java.util.concurrent.SynchronousQueue;
import java.util.concurre...
2020-10-17 08:15:55 |
Lock