原子操作的原理和本质

本文重点:

概念:原子操作
内容:原子操作的本质和实现


基本概念:

分解概念:涉及的知识点
1、 并行和并发
2、 如何保证操作的原子性
3、 cache一致性
4、 原子操作的实现-软件
5、 原子操作的实现-硬件


详细解释:

1、 并行和并发

原子(atomic):是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。

并发:单核cpu上,当多个线程在在操作时,把cpu运行时间划分为若干时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状态。

并行:多核cpu上,当一个核心处理器执行一个线程时,另一个核心处理器可以同时执行这个线程。

2、 如何保证操作的原子性

(1)使用总线锁保证原子性
(2)使用缓存锁保证原子性

3、 cache一致性
缓存一致性主要是通过MESI协议实现。
4、 原子操作的实现-软件
所谓的锁,本质上只是内存中的一个整形数,不同的数值表示不同的状态,比如1表示空闲状态和加锁状态。加锁时,判断锁是否空闲,如果空闲,修改为加锁状态,返回成功,如果已经上锁,返回失败,解锁时,就把锁状态修改为空闲状态。
我们可以把上锁的过程具体表示为:

  • 读内存表示锁的变量

  • 判断锁的状态

  • 如果已经加锁,返回失败

  • 否则把锁设置为上锁状态, 返回成功

    上面的每一个步骤都对应一条汇编语句,可以认为这每一步操作都是原子的,什么情况会导致两个线程同时获取到锁?
    中断: 当线程A执行完第一步后,发生了中断,os调度线程B,线程B也来加锁并且加锁成功,此时又发生中断,OS调度线程A执行,从第二步开始,也加锁成功。
    多核: 见上面例子。
    那么怎么解决呢? 能不能让硬件做一种加锁的原子操作呢? 大名鼎鼎的“test and set”指令就是做这个事情的,该指令将读取内存、判断和设置值作为一个原子操作。单核环境下,锁的操作肯定是原子性了,多核呢?貌似还是不行,因为多个核心他们的锁操作是没有干扰的,都能够同时执行“test and set”,还是会出现两个线程同时获取到锁的情况, 所以硬件提供了锁内存总线的机制,在锁内存总线的状态下执行“test and set”操作就可以保证一个只有一个核执行成功,也就保证了不会存在多线程获取到锁的情况。
    5、 原子操作的实现-硬件
    cpu会通过对总线加锁的手段来解决多核同时获取锁的情况,它到时是怎么实现的呢? 在cpu芯片上有一个HLOCK Pin,可以通过发送指令来操作,将#HLOCK Pin电位拉低,并持续到这条指令执行完毕,从而将总线锁住,这样同一总线上的其他CPU就不能通过总线来访问内存了。最开始这些功能是用来测试cpu的,后来被操作系统实现而封装成各种功能:关键代码段,信号量等。
    在加锁的代码编译成汇编后,会有个lock指令前缀:

Causes the processor’s LOCK# signal to be asserted during execution of the accompanying instruction (turns the instruction into an atomic instruction). In a multiprocessor environment, the LOCK# signal insures that the processor has exclusive use of any shared memory while the signal is asserted.

lock会使得紧跟在其后的指令变成atomic instruction,暂时的锁一下总线,指令执行完,总线就解锁了。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
操作系统中锁的底层实现原理是通过操作系统提供的锁机制来保证临界区资源的安全。在多线程编程中,为了保证数据的一致性,操作系统引入了锁机制。锁的本质是通过操作系统底层的机制来实现的。在硬件层面,CPU提供了原子操作、锁内存总线等机制,操作系统根据这些CPU硬件机制来实现锁。操作系统利用这些机制,可以保证在某一个时间点上,只能有一个线程进入临界区,从而保证临界区中操作数据的一致性。不同的高级语言可能会提供不同的锁接口,但底层调用的都是操作系统提供的锁。因此,要真正理解锁的底层实现原理,需要了解操作系统是如何实现锁的。 #### 引用[.reference_title] - *1* [java基础(十一)操作系统中锁机制](https://blog.csdn.net/xqhadoop/article/details/79592132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [操作系统中锁的原理](https://blog.csdn.net/qq_40860852/article/details/102662308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值