SpinLock原理和实现(SpinLock:test and set value in one instruction)

自旋锁(Spinlock)的底层实现原理 源码参考自鸿蒙内核 v26.08的自旋锁实现源码。 阅读详情
SpinLock 自旋锁。听起来非常地高深,专业啊!一把自己会旋转的锁。

其实没那么深奥的!

简单地说,获得Spinlock就是个判断全局变量,改全局变量的操作。(当然,实际还要处理time-out)

AcquireSpinLock

Do

nop

While lock==1

Lock=1

 

ReleaseSpinLock

Lock=0

 

当然,以上逻辑判断和赋值必须在一条指令完成,并且考虑SMP问题。

 

实现SpinLock 或者 ,Lock-Free算法时,需要具体的比较和交换操作(compare and swap - CAS)

 

//     逻辑如下.当然,要求比较和赋值在原子级别实现,否则SMP可能会有几个CPU错误地同时获得spinlock.这是我们要避免的. 这就是用lock cmpxchg8b的原因

bool TestAndSwap(int * memvalue,int TestValue,int NewValue)

{

       if(*memvalue == TestValue)

       {

              *memvalue = NewValue;

              return true;

}

else

{

       return false;

}

 

}

 

P5 指令 cmpxchg8b

cmpxchg8b m64

比较m64和edx:eax组成的64bit数

if m64=edx:eax

zf=1

ecx:ebx->m64

else

zf=0

m64->edx:eax

 

它有什么用?

 

bool TestAndSwapCmpxchg8b(_int64 * memvalue,_int64 TestValue,_int64 newvalue)

{

       _asm{

       mov eax,LODWORD(TestValue)

mov edx,HIDWORD(TestValue)

mov ebx,LODWORD(newvalue)

mov ecx,HIDWORD(newvalue)

lock cmpxchg8b qword ptr memvalue

jz equl

}

//     mem和testvalue不等

return false;

equl:

return true;

 

 

}

 

AcquireSpinLock(lock * lck)

{

       do

{

       //       just null loop

}

while(!TestAndSwap(lck->value,0,1));

}

ReleaseSpinLock(lock * lck)

{

lck->value = 0;

}

 

类似的 x86还有其他指令也能实现test and set

比如 BTS m32,imm

测试位偏移处的值。如为1,则CF->1

如不为1,则CF->0且测试位被设置为1.这对实现Spinlock那是相当的方便啊!

事实上Win2K就是用的lock bts.

具体见Win2K source spininst.asm : KiInst_AcquireSpinLock函数实现

void demo_bset()

{

 

       long value = 0;

 

       _asm {

              lock bts value,0

              jc is_set

              jmp not_set

       }

 

is_set:

       printf("is set:%X/n",value);

       goto done;

not_set:

       printf("not set:%X/n",value);

       goto done;

done:

       return ;

 

}

 
总结:
spin lock - 一个指令能实现测试和设置,都可以来实现spinlock。如果是SMP,则要加上lock 前缀。
PV qspinlock原理 1 前言 自旋锁(spinlock)是用来在多处理器环境中工作的一种锁。如果内核控制路径发现spinlock是unlock,就获取锁并继续执行;相反,如果内核控制路径发现锁由运行在另一个CPU上的内核控制路径lock,就在周围“旋转”,反复执行一条紧凑的循环指令,直到锁被释放。spinlock的循环指令表示“忙等”:即使等待的内核控制路径无事可做(除了浪费时间),它也在CPU上保持运行。 spinlock的实现依赖这样一个假设:锁的持有线程和等待线程都不能被抢占。但是在虚拟化场景下,vCPU可能在任意时刻 阅读详情

相关推荐

【16】linux命令/工具,systemd,文件操作,动静态库,信号,socket

apt install python3-pip --fix-missing(断开vpn,cp /etc/apt/sources.list /etc/apt/sources.list.bak,python3 -m pip install --upgrade pip,apt-get update,pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)设置时间,联网,apt-get install vim。

持续更新ing... 6788

内核同步机制之spinlock介绍

内核同步机制--spinlock简介

qq_40352506的博客 4052

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 408

自旋锁实现机理 spin_lock

自旋锁的概念 自旋锁(spin lock)是一种典型的对临界资源进行互斥访问的手段,它是基于系统原子操作为基础,自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图获得一个被已经持有(争用)的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用,要是锁未被争用,请求锁的执行线程就可以立即得到它,继续执行。 先看一下自旋锁实现的数据结构: typedef struct { union { u32 slock; struct __raw_tickets { u16 owner;

u011721450的博客 2079

从 IDoc 状态 51 到重新过账,ALE 错误处理在项目里到底该怎么做

如果项目里开发自定义 message type 和 IDoc type,错误处理就不只是顾问操作问题,而是 ABAP 代码质量问题。入站 function module 需要把业务校验结果清晰地写入 IDoc status record,让 WE02 和 BD87 能看到可理解的消息。最怕的是程序直接 RAISE exception,或者 CATCH 以后写一条笼统的错误,比如 process failed。这样的日志在生产系统里几乎没有排查价值。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1215

ck3m多轴运动控制器笔记1:电机的配置与注意事项

利用PMAC(CK3M)运动控制器来实现对电机的控制,对具体的配置流程和注意事项讲解

p975468132的博客 4642

英飞凌TC264学习(五)

英飞凌TC264学习(五) 1.OLED屏 示例: 主函数: int core0_main (void) { //char txt[16]; // 关闭CPU总中断 IfxCpu_disableInterrupts(); // 关闭看门狗,如果不设置看门狗喂狗需要关闭 IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword()); IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_ge

May the Force be with you 3612

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 383

OS19.【Linux】进程状态(1)

介绍了操作系统中的进程状态分类,包括运行状态、阻塞状态、挂起状态和就绪状态,并对比了不同操作系统教材中的定义差异。重点分析了Linux内核中的进程状态实现(R/S/D/T/t/X等),通过实验演示了进程在不同状态下的表现。特别解释了D状态(不可中断睡眠)的特性及其与S状态的区别,并提供了模拟高IO场景的代码示例。文章还涉及进程调度算法、前台/后台进程、虚拟内存管理等核心概念,最后介绍了交换分区及其查看方法。这些内容为理解操作系统进程管理机制提供了全面指导。

zhangcoder的博客 记录学习轨迹~ 1896

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 518

power bi 演唱会-佐罗

我是业务分析人员,注重使用性,因此,课程不到 30% 的内容就可以解决目前为止我碰到的所有业务问题,剩下的 70% 内容是帮助我提升,优化,升华,精益求精用的,比如第三方工具,比如代码运行速度优化,比如查询逻辑优化等等。系统性上来说,结构明晰,安排上非常有条理,层层递进;《BI 真经》,中有真经二字,略显夸大,而当我第一次证明了这点的时候,我也非常惊讶,这就是我做以下所有事情的一切动力。《BI 真经》综合考量思想性,系统性,本质性,创新性,通用性,技巧性,启发性,对比其他课程有压倒性的显著优势。

v_1090213742的博客 911

C++高性能算法与并行编程实战:从核心原理到深度优化

在计算机科学中,算法的时间与空间复杂度是评估程序效率的基础理论,它决定了程序处理数据规模的上限。然而,当数据量达到十亿级别时,仅靠优化算法复杂度往往不够,必须结合现代硬件的并行计算能力。并行编程技术,如多线程与任务分解,能够将计算负载分布到多个CPU核心,是实现性能数量级提升的关键。其技术价值在于充分挖掘多核处理器潜力,应对海量数据处理、实时图形渲染和高频交易等高性能计算场景。本文聚焦于C++高性能算法与并行编程的工程实践,深入探讨了如何通过缓存友好性设计减少内存访问延迟,并利用SIMD向量化指令集提升数据

weixin_30520015的博客 432

如何安装最新版本的 SAP ABAP Development Tool ( ADT ) ,并且能够随时升级

下载链接:https://tools.hana.ondemand.com/#abap 首先安装 Eclipse IDE for Java Developers 找到适合自己操作系统的 Eclipse 安装包: 安装之后,打开Eclipse: Install -> New Softwares, 输入 url:https://tools.hana.ondemand.com/latest 全部安装: 安装完毕之后,新建一个 ABAP Project,本地 SAP GUI 里添加的系统,会自动带出来:

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4286

操作系统内核内存管理:从分页机制到伙伴系统实战解析

内存管理是操作系统核心功能,通过物理内存与虚拟内存的映射机制实现进程隔离和资源分配。其基本原理涉及内存分页、页面置换算法等关键技术,MMU硬件负责地址转换和内存保护。在工程实践中,Linux内核采用伙伴系统算法管理物理内存,有效解决外部碎片问题;Slab分配器则优化小对象分配性能。虚拟内存管理通过多级页表实现地址空间映射,写时复制技术提升进程创建效率。这些内存管理技术为系统稳定性、安全性和性能优化提供基础支撑,在操作系统开发、嵌入式系统和多核架构中具有广泛应用价值。

weixin_33836874的博客 350

网规第三版:第4章网络资源设备(完结)

第 4 章 网络资源设备 调整内容: 更新主流网络设备(交换机、路由器、防火墙)的技术参数与选型标准 增加国产化网络设备与信创产品的相关内容 精简已淘汰的设备类型与技术指标

鹿鸣天涯 268

国产数据库全解析:openGauss、OceanBase、TiDB与KingbaseES的核心优势与应用场景指南

本文将深入剖析openGauss、OceanBase、TiDB和KingbaseES这四款主流国产数据库的核心内容,并针对国产化过程中给出使用建议,以帮助企业根据自身需求选择合适的数据库解决方案。国产数据库在性能、扩展性、兼容性、安全性等方面展现出强大实力,能够满足不同行业、不同场景的需求。企业在进行国产化过程中,应充分考虑业务特点、技术栈、团队能力等因素,结合上述分析,选择最适合自身的国产数据库产品。随着国产数据库技术的持续发展与生态完善,它们将成为推动企业数字化转型、保障数据安全的重要力量。

java专栏 8782

Linux中的spinlock机制

但锁保护的并不是这段代码本身,而是其中使用到的多核/多线程共享的变量,它「同步」(或者说串行化)的是对这个变量的访问,通俗的语义就是“我有你就不能有,你有我就不会有”。但是,当spinlock的值被更改时,所有试图获取spinlock的CPU对应的cache line都会被invalidate,因为这些CPU会不停地读取这个spinlock的值,所以"invalidate"状态意味着此时,它们必须重新从内存读取新的spinlock的值到自己的cache line中。但现实中更多的场景并不会那么简单,。

Tony的博客 561

容器化部署指南——Docker/K8s环境下的OpenClaw实践(附Dockerfile)

通过本文的详细指导,你已经掌握了OpenClaw在Docker和Kubernetes环境中的容器化部署方法。从基础镜像构建到高级部署策略,从开发环境到生产环境,你现在已经具备了完整的容器化部署能力。 容器化技术为OpenClaw提供了灵活、可扩展、可移植的部署方案,能够满足不同规模和需求的应用场景。通过合理使用Docker和Kubernetes,你可以实现高效的部署管理和运维自动化。 在实际应用中,建议根据具体的业务需求选择合适的部署策略,并结合监控、日志、安全等最佳实践,确保系统的稳定性和可靠性。同时

博客 498

终于彻底搞清楚了 MySQL spin-lock 之一次CPU问题定位过程总结

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

erghtt的博客 912

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

转: Linux spinlock_t

我的经验:如果出现死锁的情况,检查:1. lock 和 unlock是否成对出现了,检查所有的程序分支。2.是否有同时需要2个和2个以上的锁的情况,避免掉这种情况。3.如果在timer等软中断中出现死锁,可能是没有使用spin_lock_bh这一类的锁。reference: http://www.chinaitpower.com/2005September/2005-09-13/200...

weixin_30877181的博客 676

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

qspinlock 自旋锁的原理以及实现

文章目录qspin-lock的原理以及实现没啥用的前言介绍数据结构介绍锁结构CPU副本代码分析初始化加锁解锁与尝试解锁一些问题我们到底在等待什么? qspin-lock的原理以及实现  ticket spinlock已经有大量完善的分析文章,arm64 在kernel在4.16rc6之后就将默认的spinlock改为了qspinlock,目前分析的文章较少,并且看了下还是很难理解,我自己还是啃代码看完的,所以这里做个记录。 另外,还没遇到过qspinlock引起的问题,没看到运行时的相关数据结构,这篇文章只

feisezaiyue的博客 5002

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【C++】:浅析自旋锁 SpinLock

自旋锁用法及特点浅析

Mr.Sugarcane 1939

自旋锁原理及基于原子引用手写自旋锁

自旋锁原理介绍及手写自旋锁

liulianglin的专栏 1132

深入分析Linux自旋锁

前言:       在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的模块。但是在我的ARMv7的单核CPU(TI的A8芯片)中测试的时候,不会锁死,并且自旋锁可以多次获取。实验现象和我对自旋锁和休眠的理解有出路。       我后来我将这个模块放到自己的PC上测试,成功锁死了,说明我的模块原理上没有问题。但是为什么在ARM上会这样呢???后来我将模块给了我的

weed_hz的专栏 1051

Linux内核自旋锁详解

自旋锁(Spinlock)是Linux内核中最基本的同步机制之一,特别适用于嵌入式系统中的短期锁定需求。它通过"忙等"方式实现,持续检查锁是否可用,而不会让出处理器。自旋锁是嵌入式Linux系统中重要的同步机制,适合短临界区保护。在资源受限的嵌入式环境中,正确使用自旋锁能有效避免竞态条件,同时保持系统的响应性和效率。但需要谨慎设计锁定策略,避免性能问题和死锁风险。

weixin_63577471的博客 1164

Spinlock 的设计与实现

spinlock 用于多核环境下的并发操作的互斥。 1. TAS lock (test-and-set) 这是最简单的spinlock,CPU会在硬件上提供一些指令来帮助OS实现spinlock, 比如x86就有xchg,LOCK指令前缀等指令。。。 test_and_set()可以利用这些指令对某个memory地址,来原子地完成: 写入true到这个地址,同时返回这个地址储存的旧的值。

jianchaolv的专栏 1477
上一篇: 如何监视 某一特定网卡 的数据
下一篇: 转:永远不要跟父母说的十句话,谁没说过?
hephaestus
博客等级 码龄27年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值