当前位置: 首页 > news >正文

2. 并发解决架构图

文章目录

  • 一. 原子性操作实现
    • 1.1 CPU支持的原子性操作
    • 1.2 CPU原子性实现总结图
  • 二. 并发架构解决图解

一. 原子性操作实现

1.1 CPU支持的原子性操作

​ 我们以intel CPU举例,因为不同厂商对于CPU的原子性指令,都有各自的独特支持。因为我们在线上使用linux居多,并且是intel芯片。

这里就需涉及看intel开发手册,来了解intel提供了哪些原子性机制。但看之前我们可以猜测下,都会几种分类的原子性操作?CPU操作段描述符,脏页写回等,这属于CPU内部的操作,所以这种操作属于CPU自己的实现,而非我们关系,这种统称为自动原子性操作。还有一种是CPU提供给上层软件来操作保证的原子性指令,用于上层应用的复杂指令间的原子性保证。下面进行验证。

我们看的是intel 开发手册vol 3。

这里讲解锁原子性操作,也就是intel自己实现的指令原语

  1. 保证原子性操作
  2. 总线锁,使用lock前缀
  3. 缓存一致性协议

并还阐明若数据不在CPU缓存里,锁会退化成总线锁。

在这里插入图片描述

多处理器支持以下特征

  1. 保证系统内存一致性
  2. 保证缓存一致性
  3. 可预测指令写的顺序性
  4. 在一组处理器之间分配中断处理
  5. 通过利用当代操作系统和应用程序的多线程和多进程特性来提高系统性能。

而这里最重要一点保证了指令写的顺序性,也就是自己的原子性操作,解决了指令重拍问题

在这里插入图片描述

intel CPU自己实现了保证单字节,16bit/32bit的原子性

在这里插入图片描述

CPU自己还实现了,xchg指令的原子性,但我们使用时,无需考虑多核CPU带来的并发问题。

切换进程

段描述符加载

脏页

中断请求

在这里插入图片描述

lock指令的使用,是CPU提供给上层应用开发而产生

当使用lock需要搭配其他指令,来限制内存的独占性,但也要考虑内存的大小锁,导致的性能问题

在这里插入图片描述

1.2 CPU原子性实现总结图

这里笔者直接画了图,对上述的知识点做了总结

在这里插入图片描述

intel cpu
自带原子性操作
lock前缀

二. 并发架构解决图解

​ 上面讨论了,并引申了很多术语上的东西,那么我们作为应用,如何合理利用并解决并发问题?

​ 这里直接上图讲解,当多个线程执行同一个代码段时(代码段由多个指令构成),如何保证原子性?

这里就需要基于CPU指令的原子性来实现,CPU执行单指令时是保证原子性的,那么就通过CPU提供的指令,对一个标志位进行处理,若修改成功,代表抢到锁,可以执行代码段。若没抢到,则进入等待队列进行排队。但这里又引申出一个新的问题,若多个CPU同时执行失败,那么排队的并发问题如何解决?还是CPU的原子性指令。不过这时采用一个CAS自旋转方式,通过lock cmpxchg方式来实现,进行合理的队列增加。当修改成功标志位的CPU执行完代码段时,就可以唤醒等待队列中的CPU,进行下一步处理。

在这里插入图片描述

http://www.dtcms.com/a/350719.html

相关文章:

  • kanass V1.1.6版本发布,支持OpenApi便于与外部系统更好的集成
  • 【Linux】timerfd定时器
  • MCP技术详解:探秘模型上下文协议的工作机制与应用
  • 并行多核体系结构基础——概述(笔记)
  • 管理型交换机与非管理型交换机的优缺点对比
  • Coze用户账号设置修改用户昵称-前端源码
  • JavaScript数据表格方案AG Grid主题定制新升级:Figma 设计系统全面打通设计与开发
  • 舰船摇摆下的坐标变换技术
  • coze工作流200+源码,涵盖AI文案生成、图像处理、视频生成、自动化脚本等多个领域
  • Metabase 部署与实践:从测试环境到生产环境的完整指南
  • celery prefetch-multiplier
  • 【人工智能】人工智能在企业中的应用
  • 理解Vuex的辅助函数,分析mapState、mapGetters、mapMutations和mapActions各个应用场景
  • [信号与系统个人笔记]第二章 连续时间信号与系统的时域分析
  • 【MySQL】MySQL介绍及安装
  • 查看mariadb服务是否启动
  • 2025 BrunnerCTF remobile 部分wp
  • 编译型语言(C/C++):从源码到.exe 的完整链路
  • 语音识别:概念与接口
  • LeetCode 面试经典 150_双指针_验证回文串(25_125_C++_简单)(双指针)
  • 【JVM内存结构系列】六、“特殊区域”:直接内存、栈上分配与TLAB
  • JavaScript 对象 Array对象 Math对象
  • Spring Boot 结合 Jasypt 实现敏感信息加密(含 Nacos 配置关联思路)
  • 计算机网络:HTTP、抓包、TCP和UDP报文及重要概念
  • 简述Myisam和Innodb的区别?
  • 面试题:reids缓存和数据库的区别
  • Android FrameWork - Zygote 启动流程分析
  • 【0419】Postgres内核 buffer pool 所需共享内存(shared memory)大小
  • 物流架构实践:ZKmall开源商城物流接口对接与状态同步
  • Pytorch框架的训练测试以及优化