锁的机制在底层是怎样实现的?

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
  • 打赏
  • 举报
回复
和硬件相关的
一般来说,根本上就是关中断,然后执行一个操作,然后开中断
关了中断,就无法进行任务调度了,所以在关中断到开中断之间的操作是不会被打断的

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧