原子性

原子性这个概念初想是非常简单的。它表示一个操作序列就像一个操作一样不被打断,而不像一个操作序列一样中间容许被打断。但是细想下来还是挺有点意思的。首先需要确定的就是什么是一个操作?而什么不是一个操作却是一个操作序列?其次需要确定的是如何叫做像?怎么着就是不像了?另外,还有一个牵扯进来的概念就是原子性的范围和其在什么程度上实施这种保证。或许我这儿说的有点形而上,那我们就形而下的举出例子抓住原子性这个概念的直观感觉。
先举一个CPU指令集中常见的一个指令:CAS。看到这个指令我就仿佛看到了大家脸上的某种意味的笑容。呵呵,是的,它完成两个操作,一个比较,一个交换,后一个完不完成依赖于前一个操作的结果,从逻辑上说,它们是两个操作,可是它们特意被实现为不可打断的。这就是一个经典的原子指令。我们分析一下,这里面什么是我们前文提到的操作,什么是操作序列?什么是不容打断性?其实现的范围如何?其实现在什么程度上能保证不被打断?比较和交换是上文提到的操作,它们的逻辑顺序组合式操作序列,CPU在硬件级别实施了不容打断性,由于CPU级别实现了这种不容打断性,那么在整个计算机系统中其不容打断性都得到了保证,也就是说,这种不容打断性实现的范围是全系统。只要计算机没有断电,器件正常而且正常运行,这种不容打断性就是能够保证的。显然,计算机在执行该原子操作的一般的时候突然断电,并不能保证原子性了。这就是该原子性的保证强度,可以说是比较强的。尤其是我们假设把计算机系统定义为run machine的时候,可以说在全系统的范围都能得到强保证。
看到这儿,我们总希望深入一步,CPU是如何实施这种保证的。虽说我并不想探讨这个技术细节的问题(一般情况下,我更愿意探讨概念而不是细节,原因是概念不变而物理实现细节恒变),但是还是有某些要求导致我需要探讨物理实现。
CPU 首先把这个操作序列实现为一条指令,然后采用某种措施保证该指令执行期间不会被打断,一般情况下这种保证措施是总线的占据而不释放。有时候有些人愿意把这个叫做总线锁定。这就是实现方式,我不想更进一步的深入到如何锁定总线而不释放,如果有兴趣知道,参见相关的硬件文档。
通常情况下,与我们而言,我们要求更高级更符合我们需求的原子性,而不是CPU级别实现的原子性。最明显的例子就是信号量相关P、V操作。P、V操作要求是原子性的。也就是说,无论是P(一直等到有信号状态,然后置成无信号状态,用语言描述就是while (s == 0) {wait}; s = s - 1),还是V(置成有信号状态s = s + 1),都要保证其过程不被打断。这时候,我们就是依赖于CPU给我们提供的原子性保证,来实现我们这个相对来说更高级一点的原子性的操作序列。它是如何实现的并不是我们关注的焦点,我们还是想要分析一下这个所谓的P、V原子性操作序列的实现特质。我们分析一下,这里面什么是我们前文提到的操作,什么是操作序列?什么是不容打断性?其实现的范围如何?其实现在什么程度上能保证不被打断?第一个个问题似乎跟具体实现有关系,我们不深入讨论什么是其操作步骤了,操作序列显然就是P或者V本身的所有操作。它们的实现不容被打断。这没什么可说的,但我们马上就遇到了真正有趣的问题的,实现范围!在什么范围内起保证不被打断?在整个计算机系统?在一个进程中?或者还有什么别的范围?显然,这是一个问题。这里我并不想给出一个具体的说法,因为显然可以有很多说法。那么,其实现在什么程度上保证不被打断呢?显然,这个问题跟实现范围的问题有所纠缠,如果其实现范围是全系统,那么在整个计算机系统的任意时间内,P、V操作都保证不被打断,而如果其实现范围是进程,那么在该进程活动步骤中,P、V操作保证不被打断,但并不保证进程不会在正在执行P或者V操作的时候被打断而切换到另一个进程中。更不要说计算机系统因故停机对它们的打断了。
从上面的两个形而下的例子中,我们是不是能比较清晰的给出一个关于“如何叫做像?怎么着就是不像了?”的一个答案了。
最初我们的定义是其实现就是一个不容打断的操作序列,现在我们看到,只要在某种范围和程度上,看起来这个操作序列没有被打断就行了。这就使所谓的“像是没有被打断”的真实含义。
下面我还想更进一步讨论一下关于数据库事务中的原子性问题。
数据库事务中的原子性,可以用要么全做,要么不做来概括。看出来了么?它其实是上面原子性的目的。所以我们把数据库中的事务的这个特性叫做原子性是相当切题的。但是它似乎跟我们所说的原子性有点微妙的区别。这是真的么?
其实我们还可以用上面的范围和程度等来分析数据库事务中的原子性的特征。这儿我就把它当成一个练习留给读者了。我想顺带提一下的是:对于分布式数据库事务的两阶段提交这个非常出名和非常聪明的保持原子性的办法,是(似乎是)Jim Cray提出来的,他现在在Microsoft工作,而Microsoft的DTC可以说是分布式事务实现的鼻祖。看来我们也不能太看扁了 Microsoft:)。
现在我们是否可以回答原子性究竟是什么了呢?我打开门把你们迎接进来,却没有告诉你们正确的出口,这个答案得你们自己找。祝你们好运。
头歌 HBase 事务:原子性 本实验任务要求使用HBase的原子性操作完成数据更新,重点掌握HBase的事务机制和原子性操作特性。实验内容主要包括:1、在命名空间"ms"下创建"province"表;2、使用checkAndPut原子操作向行键"1005"的"info:address"列插入数据"tw"。HBase通过WAL日志和MVCC机制保证行级操作的原子性,其中checkAndPut操作会先检查指定列的值是否匹配,再决定 阅读详情

相关推荐

Lua脚本的原子性

Lua脚本之所以被认为是原子性的,主要源于Redis的内部实现机制和Lua脚本的执行方式。

TheMilkyWayisbri的博客 1569

事务四大特征:原子性,一致性,隔离性和持久性。

事务四大特征:原子性,一致性,隔离性和持久性。 1、原子性(Atomicity) 一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。` 2. 一致性(Consistency) 一致性代表了底层数据存储的完整性。它必须由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持..

妃宫千早 1万+

中移物联ML307C模组OPENCPU笔记2

本文介绍了如何编译和运行一个DEMO程序,以官方SDK为例。

weixin_43700831的博客 1887

什么是原子性

什么是原子性? 类比物理机,拥有缓存一致性协议来规定主内存和高速缓存之间的操作逻辑,那么 JMM 中主内存与工作内存之间有没有具体的交互协议呢? Of Course!JMM 中定义了以下 8 种操作规范来完成一个变量从主内存拷贝到工作内存、以及从工作内存同步回主内存这一类的实现细节。Java 虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的。 暂时放下到底是哪 8 种操作,我们先谈何为原子? 原子(atomic)本意是 “不能被进一步分割的最小粒子”,而原子操作(atomic oper

doupengzp的博客 8560

手把手教你构建轻量级CLIP模型:从理论到实践

本文手把手教你从零构建一个轻量级CLIP模型,深入解析其核心原理——对比学习,并提供完整的代码实践。通过精简的模型架构、数据准备和训练循环实现,帮助读者彻底理解多模态模型如何让图像与文本在共享空间中对齐,为学习更复杂的AI模型打下坚实基础。

weixin_29100927的博客 326

Nacos 2.3.2实战:5分钟搞定达梦数据库插件配置(含避坑指南)

本文详细介绍了在Nacos 2.3.2中配置达梦数据库数据源插件的完整实战流程。通过解析SPI插件机制,提供从环境准备、插件编译部署到核心配置的逐步指南,并重点分享了驱动加载、SQL兼容性等高频问题的避坑解决方案,助力开发者高效完成国产化数据库适配。

weixin_29200485的博客 499

什么是原子性?原子性的定义?如何保证原子性?

在并发编程中,原子性是一种非常重要的概念,用于确保多个线程或进程对共享数据的访问不会导致数据不一致或不确定的结果。原子性操作可以理解为是不可分割的操作,要么完全执行,要么不执行,不存在中间状态。在并发环境下,如果多个线程同时访问和修改相同的数据,如果没有保证原子性,可能会导致数据损坏、计算错误或其它异常结果。

weixin_47302495的博客 6649

[面试]SoC验证工程师面试常见问题(三)

SoC 验证工程师面试中,SystemVerilog、UVM 和 SystemC 的代码题目通常涵盖面向对象编程、约束随机化、UVM 组件设计、内存建模等主题。通过练习上述示例题目和理解关键点,你可以更好地应对现场编码环节。如果有具体的面试方向(如特定协议验证)或公司偏好,可以提供更多信息,我会进一步定制题目和答案。祝你面试顺利!

元直的博客 1621

数据库:事务的基本特征 —— 原子性、隔离性、一致性、持久性

一、事务 事务是一组操作的集合,集合里的所有操作要么全部执行成功,要么全部失败回滚。 二、事务的特征(ACID) 1、原子性(Atomicity) 事务所包含的操作,要么全部执行成功,要么全部失败回滚。 2、隔离性(Isolation) 多用户访问数据库时,多个并发事务,之间的操作,需要相互隔离。 每个事务需要有,独立的...

weixin_41565755的博客 6436

【招聘测评题】中的(行测)图形推理题基本逻辑总结(附例题)

参加招聘的时候,一般提交完简历就需要做测评试卷,测评里面除了性格分析的题,一般会有几十道类似公务员行测的素质测评题,让人很是挠头,据说题库多取自北森。刷题用处不大,这里总结一下图形推理题中常考的几个基本逻辑。

Yujian2563的博客 7万+

ESP32-CAM 赋能 AI 视觉巡检小车:自主避障与目标追踪实现全解析

本文基于 ESP32-CAM 实现了低成本 AI 视觉巡检小车的核心功能,硬件成本<100 元,兼顾自主避障与目标追踪。算法升级:移植 YOLOv5nano 量化模型(INT8),提升目标检测精度(如识别巡检场景中的 “异常物体”“人员”);无线拓展:通过 MQTT 协议将巡检图像、距离数据上传到阿里云 / 腾讯云,实现远程监控;多传感器融合:增加温湿度(DHT11)、红外测温(MLX90614)模块,扩展巡检维度;路径规划:结合 SLAM 算法,实现自主建图与路径巡检。

weixin_42300449的博客 368

计算机体系结构——指令系统——原子指令

假设一个场景如core1,core2共享一片数据区间,但是同一时间只有一个core能够独占此数据区间,为避免两core同时发送请求导致竞争现象,于是二者约定了一个共享的全局变量作为“锁”,使得在进行存储器原子读和原子写操作时任何其他操作都不得插入。

知识,既贵,又便宜。 7576

Cesium中级开发教程之二十二:视锥体

教程示例网站:https://thomaz529.github.io。

883

诡异的并发之原子性

上一节我和大家一起打到了并发中的恶霸可见性,这一节我们继续讨伐三恶之一的原子性。 序、原子性的阐述 一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。 我理解是一个操作不可再分,即为原子性。而在并发编程的环境中,原子性的含义就是只要该线程开始执行这一系列操作,要么全部执行,要么全部未执行,不允许存在执行一半的情况。 我们试着从数据库事务和并发编程两个方面来进行对比: 1、在数据库中......

Java学习之道 6405

Android性能分析深度指南:Perfetto工具全面解析

本文深入探讨Android性能优化工具Perfetto的应用与实践。作为Google推出的新一代追踪系统,Perfetto整合了CPU调度、内存分配、电池状态等多维度分析功能,通过高性能数据处理和可视化界面帮助开发者定位性能瓶颈。文章系统介绍了Perfetto的架构原理、配置方法和核心功能,包括CPU性能分析、内存泄漏检测等关键技术。通过电商应用卡顿优化的实战案例,展示了如何利用数学建模(如帧时间公式$T_{\text{render}}\leq16.67\text{ms}$)指导性能调优。

郑伟强dev的专栏 144

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

什么是原子性?volatile能保证原子性吗?

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 811

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

volatile的原子性

volatile的两个优点 volatile可以保证可见性,有序性,但是不能保证原子性,这也是今天写代码时候忽略的问题。 什么是原子性 原子性即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 测试代码 初始问题版 public class Part implements Runnable { private volatile static int a ...

peony的博客 7441

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

voliate不能保证原子性,如何保证原子性

volatile的定位:轻量级的可见性与有序性保证,不解决原子性问题。原子性保障方案简单场景 →。高并发单变量 →Atomic原子类。复杂逻辑 →Lock显式锁。极致性能 → CAS(需谨慎使用)。选择方案时需结合性能需求代码复杂度和业务场景综合评估。

qq_40453972的博客 1037

你对java的原子性了解多少?

在Java中,原子性是指一个操作是不可被中断的整体操作。原子性确保一个操作在多线程环境下执行时,不会被其他线程干扰,要么完全执行成功,要么完全不执行。通过运行这个测试程序,可以看到无论多少个线程执行,最终计数器的值都是正确的,这得益于。Java实现原子性的原理主要依赖于底层硬件和虚拟机的支持。我们创建了多个线程,并启动它们来并发地访问计数器。方法,将计数器的值增加指定的次数。最终,我们输出计数器的最终值。方法可以保证对计数器的操作具有原子性。类来存储计数器的值,并定义了。类提供了原子性的操作。

热爱技术,享受生活 1万+

MySQL怎么实现原子性?

原子性(Atomicity)要求事务是一个不可分割的操作单元,事务中的操作要么全部成功提交,要么全部失败回滚,不会停留在中间状态。MySQL 通过以下机制实现原子性:1.Undo Log:记录事务前的数据状态,支持回滚。2.Redo Log 和两阶段提交:确保已提交事务的持久性和日志一致性。3.崩溃恢复机制:通过日志回滚未完成事务或重放已提交事务。4.锁与 MVCC:隔离事务操作,避免中间状态被其他事务读取。

qq_39126115的博客 2344

Redis 的原子性操作

首先需要明确一个关键概念:Redis 的原子性是指单个命令的执行是 "不可中断" 的—— 当一个命令开始执行后,直到其执行完毕,Redis 不会中断它去执行其他命令。Redis 支持通过 Lua 脚本执行自定义逻辑,且整个 Lua 脚本的执行过程是原子性的—— 脚本执行期间,Redis 不会中断或执行其他命令。需要特别注意的是:Redis 仅保证 "单个命令" 的原子性,多个命令的组合并不天然具备原子性。当需要多个命令组合实现原子性时,Redis 提供了两种方案:MULTI/EXEC事务和Lua 脚本。

Toroto5的博客 2048

redis-3.2.100 源码层面事务原子性与非原子性分析

前言:最近在看redis,看迷糊了,有说redis是非原子性的,有说redis是原子性的??当时很懵逼-,然后花了点时间查了查资料,配合大佬的文章,结合自己使用redis写了这个。

m0_74106235的博客 1664

STM32原子性设置

在嵌入式系统中,普通的读-改-写操作可能导致竞态条件或不一致的状态,特别是在中断或多任务环境下。例如:在 STM32 中,GPIOx_BSRR 提供了一种 原子性 方式来设置和清除 GPIO 引脚的输出状态,避免了上述读-改-写带来的问题。假设我们要控制 PA8 的状态:通过写入 的 低 16 位 的第 8 位来实现: 这里 GPIO_BSRR_BS8 是位 8 对应的宏,写入 时不会影响其他位。 2. 清除 PA8 为低电平 通过写入 的 高 16 位 的第 8 位来实现: 这里 GPIO_

Flocx的博客 1745

如何实现事务原子性?PolarDB原子性深度剖析

简介:在巍峨的数据库大厦体系中,查询优化器和事务体系是两堵重要的承重墙,二者是如此重要以至于整个数据库体系结构设计中大量的数据结构、机制和特性都是围绕着二者搭建起来的。他们一个负责如何更快的查询到数据,更有效的组织起底层数据体系;一个负责安全、稳定、持久的存储数据,为用户的读写并发提供逻辑实现。我们今天探索的主题是事务体系,然而事务体系太过庞大,我们需要分成若干次的内容。本文就针对PolarDB事务体系中的原子性进行剖析。 作者 | 佑熙 来源 | 阿里技术公众号 一 前言 在巍峨的数据库大厦体.

阿里云云栖号 1193

memcached原子性

在计算机科学中,原子性是指操作要么完全成功,要么完全失败的特性,中间状态对外部不可见。对于 Memcached 来说,原子性意味着在并发情况下,多个客户端同时执行某个操作时,操作结果是完全一致且不可分割的。Memcached 是一个多线程的服务端系统,允许多个客户端并发访问。在这种情况下,原子性对于确保数据一致性至关重要。Memcached 提供了几种原子操作,如setaddreplaceincrdecr和。这些操作在并发场景下能够保证一定程度的原子性。Memcached 提供了若干原子操作,如set。

Flying_Fish_roe的博客 551
上一篇: 同步
下一篇: String的length
lifeNet
博客等级 码龄20年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值