锁专题(12)高并发进阶 Exchanger 双方栅栏源码深度解析
Exchanger
简介
有时我们须要对元素进行配对和交换线程的同步点,使用 exchange 方法返回其伙伴的对象,这时我们就须要使用线程类中的 Exchanger 类了,
简而言之,可以在不同线程间交换数据。
使用入门
废话少说,直接上代码。
定义执行类
private static class ExchangeRunnable implements Runnable {
...
2020-10-17 08:15:55 |
Lock
锁专题(11)简单,快速,实用的非阻塞和阻塞并发队列算法
说明
这个是李大狗在 juc 中提到的算法论文,找了半天网上也没有。
于是决定自己翻译一下。
论文作者:Maged M. Michael Michael L. Scott
翻译作者:老马啸西风
ps: 最近发现自己的文章被各种盗,别人的 SEO 还比自己的高,醉了醉了。
摘要
借鉴以前的作者的想法,我们提出了一种新的非阻塞并发队列算法和一种新的双锁队列算法,其中一个队列和一个出...
2020-10-17 08:15:55 |
Lock
锁专题(10)Linux的HBO实现
HBO
如果存在锁争用限制了Linux的可扩展性,那么到目前为止使用的方法是更改Linux内核中自旋锁的使用方式。
锁可以分解为多个锁,可以更改算法来避免锁(例如上面讨论的用于解剖页面表输入操作的方法)等等。
尽管这些都是有效的方法:对于具有4个以上处理器的系统,为什么不看到自旋锁争用的一般性问题,而是寻求对自旋锁算法本身进行修改以解决争用?
我们需要的是一种反向偏移算法,该偏移...
2020-10-17 08:15:55 |
Lock
锁专题(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