- 浏览: 367273 次
- 性别:
- 来自: 阿里巴巴
文章分类
- 全部博客 (207)
- Maven (5)
- Cassandra (2)
- Hadoop (3)
- LDAP (2)
- SOA (7)
- 认证、加密、安全 (6)
- 搜索引擎相关技术 (3)
- REST (7)
- 数据库 (11)
- Java 基础相关 (38)
- UML (1)
- Java NIO 框架 (3)
- javassist (1)
- Bean容器 (4)
- 网络编程 (1)
- NoSQL (4)
- XML、Json (1)
- JS (2)
- Google (6)
- Warp-MVC (2)
- 持久层 (2)
- sitebricks (1)
- MVC (6)
- CSS (2)
- JPA (2)
- RDBMS (5)
- cache (4)
- tomcat (1)
- 其它 (3)
- eclipse (1)
- bigpipe (1)
- RDBMS MySQL (1)
- MySQL (2)
- ant (1)
- 前端 (2)
- Groovy (1)
- linux (3)
- Scala (1)
- zookeeper (1)
- redis (2)
- 测试 (1)
- 监控 (1)
- mac (3)
- 区块链 (3)
- 工具 (1)
最新评论
-
masuweng:
好好好,辛苦了!!
Spring Data JPA 简单介绍 -
masuweng:
Spring Data JPA 简单介绍 -
zhangjianxinjava:
您好,大神本人小白一个最近在研究不知道可否 通过邮箱进行交流, ...
JAVA Metrics度量工具 - Metrics Core -
xzs603:
http://zhengdl126.iteye.com/blo ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
JavaStart:
运行mysql2redis 的install.sh 文件为何提 ...
mysql到redis的复制
1 Overview
Linux内核中常见的同步机制有Atomic Operation,Spin Locks,Semaphore,Mutex等。其中Spin Locks和Semaphore都支持读/写锁。此外,Linux内核还支持一种更轻量级的读/写锁定机制:Sequential Lock。跟其它读/写锁定机制相比,Sequential Lock有以下特点:
- 在获取锁时偏向写锁。只要他人不持有写锁,那么获得写锁的操作总是能够成功。
- 读操作时不需要获得锁(即读操作永远不会被阻塞),然而在有些情况下读操作需要重试。
- Sequential Lock更轻量级,可伸缩性相对更好。
2 Linux Kernel's Implementation
以下是2.6版本的内核中,Sequential Lock的实现:
typedef struct { unsigned sequence; spinlock_t lock; } seqlock_t; static inline void write_seqlock(seqlock_t *sl) { spin_lock(&sl->lock); ++sl->sequence; smp_wmb(); } static inline void write_sequnlock(seqlock_t *sl) { smp_wmb(); sl->sequence++; spin_unlock(&sl->lock); } static __always_inline unsigned read_seqbegin(const seqlock_t *sl) { unsigned ret = sl->sequence; smp_rmb(); return ret; } static __always_inline int read_seqretry(const seqlock_t *sl, unsigned iv) { smp_rmb(); return (iv & 1) | (sl->sequence ^ iv); }
以上代码中,通过使用spin lock保证了write操作的原子性。需要注意的是,Linux spin lock是非可重入锁,这也是read_seqretry方法中可以通过(iv & 1)判断一个写操作是否正在进行中的原因。此外,Linux spin lock只能保证原子性,为了避免由于编译器或者处理器对指令的重排序(例如x86平台不会对写操作重排序,但是可能会对读操作进行重排序)所导致的潜在问题,seqlock使用memory barrier(smp_wmb和smp_rmb)保证了内存可见性。
seqlock的用法如下:
To define a seqlock:
seqlock_t mr_seq_lock = DEFINE_SEQLOCK(mr_seq_lock);
The write path:
write_seqlock(&mr_seq_lock); /* write lock is obtained... */ write_sequnlock(&mr_seq_lock);
The read path:
unsigned long seq; do { seq = read_seqbegin(&mr_seq_lock); /* read data here ... */ } while (read_seqretry(&mr_seq_lock, seq));
seqlock的典型使用场景如下:
- 跟读操作的数量相比,写操作的数量很少。
- 在锁获取时,希望写操作优先。
使用seqlock的注意事项:
- 读操作耗时应比较短,否则容易导致过多次的读重试。
- 由于在读的过程中写操作可能正在修改数据,因此读操作可能会读取到某种不一致的状态。所以进行读取时,需要保护性的验证,以避免因读取不一致的错误数据导致错读。
3 Sequential Lock in Java
本想自己实现一个Java版本的Sequential lock,但是在Google了之后发现Makoto YUI已经提供了一比较好的实现,在其基础之上稍加改动之后的实现如下:
public final class SequentialLock { // private volatile int counter; /** * */ public int readBegin() { return this.counter; } public boolean readRetry(int v) { return (v & 1) == 1 || this.counter != v; } public synchronized void writeLock() { // if((this.counter & 1) != 0) { throw new IllegalStateException("sequential lock is NOT reentrantable"); } // ++this.counter; } public synchronized void writeUnlock() { ++this.counter; } }
首先,SequentialLock不是可重入的。其次由于读操作没有获得锁,因此读写之间需要额外的机制以保证内存可见性:对其volitle counter成员变量的读写保证了Sequential Lock保护的数据之间的happens bofore语义。
4 Reference
Linux Kernel Development 3rd Edition, Robert Love
发表评论
-
浮点数计算
2020-08-25 16:15 328@Test public void test2() ... -
AQS、ReentrantLock、CLH锁 、MCS锁 分析
2018-12-25 23:45 6851. ReentrantLock的介绍 Reentran ... -
Java并发编程:CountDownLatch、CyclicBarrier、Semaphore、Phaser
2015-02-26 16:41 1373在java 1.5中,提供了 ... -
技术网站资料
2014-07-17 11:53 0http://javakaiyuan.com ht ... -
Java之死-前言
2014-07-15 10:14 756用了好多年的java之后越来越感觉其并不像 ... -
通过JVM获取相关的服务器信息 .
2013-01-07 20:18 2173http://blog.csdn.net/zgmzyr/art ... -
Java中使用OpenSSL生成的RSA公私钥进行数据加解密
2012-10-25 11:34 4383openssl genrsa -out rsa_pr ... -
java开源
2012-05-29 14:34 1500开源不是开放编译器的源代码,而是写了一个软 ... -
用Ant打Jar包--在Manifest中引用Classpath
2012-03-15 13:20 1595用Ant打Jar包--在Manifest ... -
分布式锁服务器
2011-11-07 22:14 1954在分布式系统中如何 ... -
Java 7 Fork/Join 并行计算框架概览
2011-11-05 16:26 1077http://www.iteye.com/topic/ ... -
Apache Jakarta Commons 工具集简介
2011-11-03 11:22 1601org.apache.commons.collectio ... -
JDBC batch批处理Statement executeBatch 详解
2011-09-28 13:25 2754http://blog.csdn.net/basene ... -
代码动态生成利器ASM
2011-09-22 20:02 1060前言 代码生成器(code generato ... -
Fastjson技术内幕
2011-09-13 23:51 1343文章来源:http://code.alibabatech.co ... -
基于Spring可扩展Schema提供自定义配置支持
2011-08-07 16:01 1236在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直 ... -
Mule 与 Spring2.0's extensible XML configuration mechanism
2011-08-07 15:50 1365mule2.2.1已经采用从sprin ... -
alibaba fastjson(json序列化器)序列化部分源码解析
2011-08-03 21:11 2025本文copy自http://www.flydmeng.co ... -
JVM 远程调试 参数
2011-07-28 09:49 1894远程调试 参数 -server -Xdebug -Xnoag ... -
Hessian远程调用及序列化协议
2011-06-28 18:22 3023demo中客户端和服务端的hessian版本都是4.0.7,下 ...
相关推荐
in Java), linked lists, stacks, queues, recursion, random numbers, files (text, binary, random access, indexed), binary trees, advanced sorting methods (heapsort, quicksort, mergesort, Shell sort), ...
非顺序光线追踪(Non-Sequential Ray Tracing)是光学设计软件ZEMAX中的一项高级功能,与传统的顺序光线追踪相比,它提供了更为复杂且灵活的光线处理方式。在顺序光线追踪模式下,光线必须按照预定义的顺序通过一...
Detection of anomalous trajectories is an important problem in the surveillance domain. Various algorithms based on learning of normal trajectory patterns have been proposed for this problem. Yet, ...
role in modeling user behaviors, various sequential recom- mendation methods have been proposed. Methods based on Markov assumption are widely-used, but independently com- bine several most recent ...
时间序列分析——The main focus of this book is on a systematic development of the theory of sequential hypothesis testing (Part I) and changepoint detection (Part II). In Part III, we briefly describe...
SPMF is an open-source data mining mining library written in Java, specialized in pattern mining. It is distributed under the GPL v3 license. It offers implementations of 82 data mining algorithms ...
**序贯蒙特卡洛(Sequential Monte Carlo, SMC)**是一种统计计算方法,用于解决在高维度或复杂概率模型中的采样问题。它也被称为粒子滤波器,尤其在贝叶斯推断和动态系统建模中广泛应用。SMC通过一系列的采样步骤来...
Mining Sequential Patterns
GSP(Generalized Sequential Pattern)算法是序列模式挖掘中的一种经典方法,尤其在理解用户行为、市场趋势以及各种时间序列数据中有着广泛的应用。下面将详细阐述GSP算法以及其在Java环境下的实现。 GSP算法,...
Sequential events in a single computation are not concurrent. For example, if a particular computation performs the operations identified by events 1, 2 and 3 in that order, then clearly and 1 ! 2 and...
DataStage Sequential File Stage是ETL(提取、转换、加载)过程中用于处理文本文件的一个关键组件。这个stage专门设计用于读取和写入简单的文本文件,它具有灵活性和可配置性,能够适应各种数据处理需求。以下是对...
### Processor Architecture: Sequential Implementation #### 引言 处理器架构(Processor Architecture)是计算机系统的核心组成部分之一,它定义了处理器的设计原则和技术实现方式。本篇内容将深入探讨处理器...
level language, this book applies the Deitel signature live-code approach to teaching programming and explores the Java® 9 language and APIs in depth. The book presents concepts in fully tested ...
Sequential 是一个专为JavaScript开发者设计的工具,它允许用户在浏览器环境中直观地观察和理解代码的执行过程。这个创新的平台提供了一种序列化的视图,使开发者可以更深入地了解代码的每一步操作,对于学习、调试...
在本文中,我们将深入探讨如何在STM32F103ZET微控制器上移植LWIP(Lightweight IP)协议栈,并利用sequential编程接口来实现一个TCP客户端。STM32F103ZET是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M3...
myNodePath = zookeeper.create(lockPath + "/lock-", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); } public void unlock() throws Exception { zookeeper.delete(myNodePath, -1); ...
**标题解析:Sequential Minimal Optimization for SVM** Sequential Minimal Optimization(SMO)是一种用于训练支持向量机(Support Vector Machines,简称SVM)的有效算法。SVM是一种监督学习模型,广泛应用于二...