社区
C++ 语言
帖子详情
锁的机制在底层是怎样实现的?
panpanf1
2008-11-17 03:13:59
如题
...全文
711
16
打赏
收藏
锁的机制在底层是怎样实现的?
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hai040
2008-11-18
打赏
举报
回复
学习
mLee79
2008-11-18
打赏
举报
回复
早些版本的sparc情况不是很清楚, 不过 sparc V8 V9 是有 ldstub , swap , cas 指令做原子操作的... 早期的处理器应该很少拿来做 SMP 的吧, 单处理器下没这些麻烦, 不过不大了解这些情况 ...
linux中的atomic_t类型之所以只影响24个bits偶觉得应该不是因为 sparc 没有原子操作指令, 而是因为 sparc 的自旋锁是用 ldstub 实现的, ldstub 会将 0xff 写入字节,并返回寄存器中的原始值...
WingForce
2008-11-17
打赏
举报
回复
如果没有记错或者是我过去的理解有错的话,linux中的atomic_t类型之所以只影响24个bits就是因为sparc体系不支持原子操作指令。
mLee79
2008-11-17
打赏
举报
回复
很多操作系统都可以关中断的三, 包括 NT 系列大家做 rootkit 也都是关中断的干活三.. 嵌入式系统好像大部分都可以在用户态关中断的 ... 不过这些关中断貌似都可以用一套复杂的同步机制来避免 ...
偶感兴趣的是是否有机器 "没有提供原子操作指令"..
独孤过儿
2008-11-17
打赏
举报
回复
呵呵,我提供一个确定的开关中断的场合吧,在嵌入式的os里面,uC/OS-II是允许开关中断的,它是分别用两个宏
来实现的,叫OS_ENTER_CRITICAL和OS_EXIT_CRITICAL
mLee79
2008-11-17
打赏
举报
回复
基本上内核也只在初始化的时候会关中断, 初始化完成后就很少见关中断的...
那些要关中断跑临界区指令的通常都是些根本没有现代意义操作系统概念的, 像些啥嵌入式的小程序啊, DOS啊虾米的, 没必要实现一套复杂的同步机制 ...
偶倒孤陋寡闻, 还没听说过啥处理器"没有提供原子操作指令", 这东西根本就不需要提供, 基本上只要是单独的一条机器指令本来就是原子的 ...
jieao111
2008-11-17
打赏
举报
回复
关中断确实很少用的。。。关于加锁,把锁变量和严格轮换法结合起来那个算法,叫什么来着,给忘了,,可以参考《操作系统:设计与实现》,,我想信号量也是一种加锁方式把
独孤过儿
2008-11-17
打赏
举报
回复
呵呵,mLee79老大说的是对的。
开关中断只是一种IPC实现的手段,而且这种手段也不是常用的,基本都是在内核态用的,用户态不可能给用。想
象一下,要是把开关中断的权限给了用户程序,一旦有程序关了中断,却忘了重新打开,那后果会怎样...
WingForce
2008-11-17
打赏
举报
回复
好吧,我承认我以偏概全了,在某些没有提供原子操作指令的硬件上,是以开关中断来实现的。。。
mLee79
2008-11-17
打赏
举报
回复
谁告诉你要关中断的, 只要是一条单独的机器指令就是原子的, 在多处理器上需要锁定总线, 也就是加 lock 前缀.
比如 随便实现几个原语, atomic_incl , atomic_decl , atomic_CAS , atomic_CAS2 哪一个需要关中断的 ...
%ifdef _X_UP_
%define _X_LOCK_
%else
%define _X_LOCK_ lock
%endif
@_XPEER2_atomic_incl@4:
mov eax , 1
_X_LOCK_ inc DWORD [ecx+0]
jnz short @inclOK@
xor eax , eax
@inclOK@:
ret
@_XPEER2_atomic_decl@4:
mov eax , 1
_X_LOCK_ dec DWORD [ecx+0]
jnz short @declOK@
xor eax , eax
@declOK@:
ret
@_XPEER2_atomic_CAS@12:
mov eax , [esp+4]
_X_LOCK_ cmpxchg [ecx],edx
mov eax , 1
jz short @CASDone@
xor eax , eax
@CASDone@:
ret 4
@_XPEER2_atomic_CAS2@12:
push ebx
push ebp
mov ebp , ecx
mov ecx , [edx+4]
mov ebx , [edx+0]
mov edx , [esp+12]
mov eax , [edx+0]
mov edx , [edx+4]
_X_LOCK_ cmpxchg8b [ebp]
mov eax , 1
jz short @CAS2Done@
xor eax , eax
@CAS2Done@:
pop ebp
pop ebx
ret 4
WingForce
2008-11-17
打赏
举报
回复
[Quote=引用 5 楼 mLee79 的回复:]
没听说过加锁还要关中断的, 那系统还能跑么, 还不跟蜗牛一样...
计算机硬件保证CPU不会在一条指令执行的过程中发生中断, 如果一个任务可以由一条单一的指令完成, 那它就是原子的, 操作系统实现的锁机制通常都由少量的几个同步原语所构成,比如 lockedIncl , lockedDecl , lockedAdd, lockedExchg, CAS ( Compare-And-Swap ) , CAS2 等 ...
你可以找找 linux 或者 nt 的内核代码看看, 也没啥神秘的 ...
[/Quote]
所谓的同步原语就是先关中断,然后执行几条指令,再开中断
mLee79
2008-11-17
打赏
举报
回复
没听说过加锁还要关中断的, 那系统还能跑么, 还不跟蜗牛一样...
计算机硬件保证CPU不会在一条指令执行的过程中发生中断, 如果一个任务可以由一条单一的指令完成, 那它就是原子的, 操作系统实现的锁机制通常都由少量的几个同步原语所构成,比如 lockedIncl , lockedDecl , lockedAdd, lockedExchg, CAS ( Compare-And-Swap ) , CAS2 等 ...
你可以找找 linux 或者 nt 的内核代码看看, 也没啥神秘的 ...
herman~~
2008-11-17
打赏
举报
回复
学习
toadzw
2008-11-17
打赏
举报
回复
你可以看一下操作系统的部分,这是一个很难的实现,有硬件与软件方法;软件方法在操作系统这本书中有介绍,好像是波兰的科学家实现的;
lonelywinter340
2008-11-17
打赏
举报
回复
加锁就是关中断,解锁就是开中断
进程切换和线程切换其实是由系统的时钟中断引发的,关了中断就不会发生进程或线程切换,起到加锁的作用
WingForce
2008-11-17
打赏
举报
回复
和硬件相关的
一般来说,根本上就是关中断,然后执行一个操作,然后开中断
关了中断,就无法进行任务调度了,所以在关中断到开中断之间的操作是不会被打断的
第16讲 synchronized
底层
如何
实现
?什么是
锁
的升级、降级?1
所谓
锁
的升级、降级,就是 JVM 优化 synchronized 运行的
机制
,当 JVM 检测到不同的竞争状况时,会自动切换到适合的
锁
实现
,这种切换就是
锁
的升级
第16讲synchronized
底层
如何
实现
?什么是
锁
...1
极客时间 | Java核心技术36讲所谓
锁
的升级、降级,就是 JVM 优化 synchronized 运行的
机制
,当 JVM 检测到不同的竞争状况时,会自动切换
MySQL如何
实现
锁
机制
?
底层
原理是什么?
第一个阶段是“
锁
定阶段”,在这个阶段,事务可以申请需要的
锁
,但是如果发现有其他事务已经持有了对应资源的
锁
,就会被阻塞等待,直到能够获取到所需的
锁
为止。在这个阶段,事务可以申请并持有共享
锁
和排它
锁
。如果在释放
锁
的过程中发现自己持有的
锁
与其他事务的
锁
发生了冲突,就需要等待其他事务释放
锁
后才能继续释放自己持有的
锁
。MySQL在
实现
锁
机制
的过程中还使用了一些优化策略,例如记录
锁
(Record Lock)、间隙
锁
(Gap Lock)和临键
锁
(Next-Key Lock)等,以提高
锁
的效率和并发度。
Redis 分布式
锁
底层
是如何
实现
的?
1.首先利用 setnx 来保证:如果 key 不存在才能获取到
锁
,如果 key 存在,则获取不到
锁
2.然后还要利用 lua 脚本来保证多个 redis 操作的原子性 3.同时还要考虑到
锁
过期,所以需要额外的一个看门狗定时任务来监听
锁
是否需要续约 4.同时还要考虑到 redis 节点挂掉后的情况,所以需要采用红
锁
的方式来同时向 N /2+1个节点申请
锁
,都申请到了才证明获取
锁
成功,这样就算其中某个 redis 节点挂掉了,
锁
也不能被其他客户端获取到
lock
锁
的
底层
实现
内部使用了CAS(Compare and Swap)操作和内部队列等
机制
来
实现
线程的排队和等待。,它们的
底层
实现
都依赖于
底层
操作系统提供的原子操作或同步
机制
。在不同的操作系统和硬件平台上,
锁
的
底层
实现
可能会有所不同,以满足并发编程的需求。采用了一种乐观读策略,对于读操作,它不需要线程阻塞,而是使用版本戳(stamp)来判断数据是否被修改。接口只是一个抽象的同步
机制
,具体的
实现
类决定了
锁
的具体行为和性能特点。
锁
的
底层
实现
可以有多种方式,这取决于具体的
实现
类。的
底层
实现
使用了类似于CAS的乐观
锁
机制
。
C++ 语言
64,282
社区成员
250,470
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章