TAS与CAS-用于锁的指令支持
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:https://www.cnblogs.com/upnote/p/13193856.html
参考:https://juejin.cn/post/6844903853393985550
参考:https://en.wikipedia.org/wiki/Test-and-set
参考:https://en.wikipedia.org/wiki/Compare-and-swap
参考:https://stackoverflow.com/questions/3659336/compare-and-swap-vs-test-and-set
TAS(Test and Set)与CAS(Compare and Swap),两个重要的硬件同步指令。算是在指令级上,支持各类锁实现的基础存在。
TAS(Test and Set)
test-and-set指令: 作为一个原子不被中断的操作指令,在硬件设计上,仅允许同一时间一个处理器执行该指令,从而保证了它的单一原子性操作。
---from wikipedia:
In computer science, the test-and-set instruction is an instruction used to write 1 (set) to a memory location and return its old value as a single atomic (i.e., non-interruptible) operation. If multiple processes may access the same memory location, and if a process is currently performing a test-and-set, no other process may begin another test-and-set until the first process's test-and-set is finished.
有了硬件保证的只有一个处理器执行该指令,就不用担心多核处理器情况和执行指令的同步困扰。
test-and-set顾名思义,它提供的操作是:
- 把给定的内存地址设置为1
- 然后返回之前的旧值
// 伪代码// 只要硬件保证了start,end其间单处理器执行,且不被打断,就算是实现指令的原子性int test_and_set(int* lockPtr){int oldValue;// --- start of atomic segment ---oldValue = *lockPtr;*lockPtr = 1;// --- end of atomic segment ---return oldValue;}
但单纯该指令保证其自身的单一原子操作,而我们需求的是某一部分代码执行的单一原子操作,这就涉及了如何利用TAS的特点,来进行锁的设计。
spinlock自旋锁的样例实现:
// 伪代码
volatile int lock = 0;
void lock(){while(test_and_set(&lock) == 1){}
}
void unlock(){lock = 0;
}
lock();
critical section // only one process can be in the section at a time
unlock();
CAS(Compare and Swap)
In computer science, compare-and-swap (CAS) is an atomic instruction used in multithreading to achieve synchronization.
CAS同样是一个同步指令,主要被用于多线程同步;
它的处理过程类似:
- 判断reg上值和输入old值是否一致,一致时改reg值为new
- 返回reg上的原值
// 伪代码// 保证了start,end其间原子执行,就实现了指令的原子性int compare_and_swap(int* regPtr, int old, int new){int org_reg_value;// --- start of atomic segment --- org_reg_value = *regPtr;if (org_reg_value == old){*regPtr = new;}// --- end of atomic segment --- return org_reg_value;}
compare-and-swap,同test-and-set相比,它使用的输入寄存器更多一些,同时它返回值的存储信息也更丰富一些;
- test-and-set使用了一个bit位作为目标设定值,表达0/1两个信息量。
- compare-and-swap可以用32位或64位作为设定值,输出值,能表达更多的信息量。
可以用来做原子添加增量值的设置,样例实现:
// 伪代码
int add(&ptr, int add){int org_value = *ptr;while(compare_and_swap(ptr, org_value, org_value+add) != org_value){org_value = *ptr;}return org_value + add;
}
当然也可以用来实现自旋锁,样例实现:
// 伪代码
volatile int lock = 0;
void lock(){while(compare_and_swap(&lock, 0, 1));
}
void unlock(){lock = 0;
}
lock();
critical section // only one process can be in the section at a time
unlock();
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
TAS与CAS-用于锁的指令支持相关推荐
- 对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)
1.对象头 Java对象头里的Mark Word里默认存储对象的HashCode.分代年龄和锁标记位. 32位JVM的Mark Word的默认存储结构如下图所示: 在运行期间,Mark Word里存储 ...
- 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理
[重难点][JUC 04]synchronized 原理.ReentrantLock 原理.synchronized 和 Lock 的对比.CAS 无锁原理 文章目录 [重难点][JUC 04]syn ...
- Java CAS无锁技术深度解析
在看AQS代码的时候,看到它很多地方调用了unsafe.compareAndSwapInt这类方法,百度了一下得知这叫CAS无锁技术. CAS原理深度分析 转自:https://blog.csdn.n ...
- 深入理解CAS 乐观锁 | Java
CAS(乐观锁) CAS 全称为 Compare And Swap 翻译过来就是比较并且交换 Synchornized 是悲观锁,线程一旦得到锁,其他的线程就只能挂起了 cas 的操作则是乐观锁,他认 ...
- JUC04-- CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类
文章目录 JUC04 课程任务概览 CAS CAS原理简介 CAS发展: CAS是什么? CAS原理: CAS优点: **CAS底层实现-引出Unsafe类** ==CAS自旋实现个人总结== Ato ...
- 面试必备:CAS无锁机制
CAS无锁机制原理,面试高频问题之一,其实,日常开发中并不会直接使用CAS无锁机制,都是通过一系列封装好的工具类来使用, 说不定面试官不提问,都不知道有这么个东西存在. 1.能说一下你对CAS的理解吗 ...
- 深入理解并发编程之CAS无锁机制与ABA问题
深入理解并发编程之CAS无锁机制与ABA问题 文章目录 深入理解并发编程之CAS无锁机制与ABA问题 前言 一.什么是CAS无锁机制 二.CAS原理分析 1.AtomicLong自增分析 2.基于At ...
- CAS无锁队列的实现
文章目录 1. 基本原理 2. 代码实现 2.1 使用链表实现无锁队列 2.2 使用数组实现环形无锁队列 3. ABA 问题及解决 4. 参考资料 1. 基本原理 源于1994年10月发表在国际并行与 ...
- C语言链表无锁化CAS,CAS无锁操作
主要讲的是<Implementing Lock-Free Queues>的论点,具体直接看论文最好.这里总结些要点. CAS就是Compare And Swap.gcc可以调用: __sy ...
- CAS(乐观锁)详细讲解
CAS(乐观锁) 什么是悲观锁.乐观锁?在Java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优越感,其实理解清楚了,这些词也就唬不住人了. s ...
最新文章
- HDU3037(卢卡斯定理)
- Jenkins配置Java项目1(Java+Maven+Tomcat+SVN/Git)
- Linux安装SNMP
- LeetCode—210. 课程表 II
- [html] table中给td设置宽度无效怎么解决?
- AdaX:一个比Adam更优秀,带”长期记忆“的优化器
- 出现ping: unknown host www.baidu.com 问题解决
- Know more about Oracle Latches
- 欧盟:2020年之前普及免费WiFi网络
- Wpf ListBox数据绑定实例1--绑定字典集合
- bootstrap带图标的按钮与图标做连接
- Dapper.net 入门demo 轻量级ORM框架
- 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:...
- javascript查看详情与收起详情
- 全国地表径流量数据获取/植被类型数据/NPP数据/土壤侵蚀数据/土壤质地分类/降雨量栅格数据/太阳辐射量数据
- 红警ol服务器维护中1003,红警OL频繁掉线怎们么办 网络断开连接解决办法
- Hugepages详解
- mp4视频怎么转换成华为P10手机适配的分辨率
- 自控力lesson14书摘——克服‘紧张症’的法则
- 存储洞察:从技术到市场
热门文章
- 农历 阴历 转换阳历算法
- 魔百盒B863AV3.2-M,B863AV3.1-M2线刷+卡刷精简固件(S905L3A-B)
- Novell NetWare 及其协议
- 有趣的符号图画(颜文字)(I have a AC dream)(神兽护体)(保佑你次次Accepted)
- 为什么要使用Tomcat?
- 跑路潮来临:解散社群,深夜遁逃,卷走百亿资金
- 怎么p出模糊的照片_照片模糊了怎么办 如何利用美图秀秀变清晰
- 如何寻找综述性论文?
- php怎么把图片设置为背景,ppt怎么把图片设为背景
- 基于DNN的IMDB电影数据集文本分类