【进阶篇】线程的硬件基础

news2024/9/22 1:42:32

文章目录

    • 高速缓存
    • 缓存一致性协议
    • 写缓冲区和无效化队列

高速缓存

简介
高速缓存是主内存与处理器之间的硬件,其容量小于主存,但存取速率远高于主存。因此处理器在执行读写操作时,可直接和高速缓存交互,提高响应速度。
我们常见的变量名相当于内存地址,变量值相当于内存中的数据,而高速缓存相当于是为每个变量保留了一份副本。但其容量较小,不能长时间保存。

数据结构
高速缓存相当于一个容量极小的hashTable,key是内存地址,value是变量的值。从结构上来看,其由桶和缓存条目组成。其结构大致如下:
在这里插入图片描述
每一个缓存条目可继续划分为Tag、DataBlock、Flag三部分。DataBlock被称为缓存行,它是高速缓存与主存之间数据交换的最小单元;Tag包含了与缓存行中数据内存地址的部分信息;Flag用来表示缓存行的状态信息。
在这里插入图片描述
缓存命中
现在来简单说一下缓存命中的流程;当处理器在进行读取时,会先进行内存地址解码操作,解码结果包括tag、index、offset三部分数据;index相当于桶的编号,用来定位内存结构中桶的编号;tag用来定位桶对应的缓存条目,根据缓存条目的Tag进行比较;offset时缓存条目里缓存行内的位置偏移量,它用来定位一个变量在一个缓存行中存储起始位置。根据这三个来定位缓存数据,如果能找到缓存条目中的Flag,则说明缓存命中了,否则为缓存未命中。

现在处理器一般都具有多个层次的高速缓存,分为一级缓存、二级缓存、三级缓存等,一级缓存集中在cpu的内核中,访问效率极高,一般分为两部分,一部分用于存储指令,另一部分用于存储数据。离cpu越近的高速缓存,存取速率越快,但其制造成本也就越高,因此容量越小。
(图片来源百度)
在这里插入图片描述

缓存一致性协议

当多个线程在访问同一变量时,其中一个线程更新了该变量,需要其他线程立刻察觉到。为了解决这个问题,处理器之间需要一种通信机制------缓存一致性协议。
MESI(Modified-Exclusive-Shared-Invalid)协议是一种广为使用的缓存一致性协议。它可以保证多个线程在读共享数据时是支持并发的,但写操作是独占的。
正如它的名字一样,MESI将缓存条目状态划分为如下4种,并在此基础上定义了一组消息用于协调各个处理器读写内存的操作。
一个缓存条目中的Flag值具有以下4种可能:

状态含义是否与其他处理器中缓存中值一致是否与主存中值一致
Invalid(无效的,标记为I)该状态表示缓存行中不包含任何内存地址对应的值,也就是缓存未命中,它是缓存条目的初始状态。
Shared(共享的,标记为S该状态表示缓存行中存在相应内存地址的变量值的副本。且其他处理器缓存中可能也具有相同的副本。因此,如果状态为Shared,则说明其他处理器中高速缓存的值与本处理器缓存的值一样,且都为Shared。该状态表示当前处理器缓存中的值与主存一致。
Exclusive(独占的,标记为E)该状态表示缓存行存在相应内存地址的变量值的副本。且该处理器以独占的方式保留了内存地址数据的副本,其他处理器缓存中不具有该副本。该状态表示当前处理器缓存中的值与主存一致。
Modified(更改过的,标记为M该状态表示相应缓存行中存在内存地址更新后的数据。由于MESI协议只能在同一时刻有一个处理器对主存进行更新操作,因此同一时刻,多个处理器中只能有一个处理器中的缓存条目是该状态。该状态的缓存条目,其中缓存数据与主内存中的数据不一致。

现在来描述一下使用MESI协议的处理器是如何是先读写操作的。假设内存地址A上的数据为S可能是处理器P1和P2共享的数据。
先来看下MESI中的消息体的消息类型:

消息名称消息类型描述
read请求通知其他处理器、主存,表示当前处理器准备读取地址中的数据。该消息包含待读取数据中的内存地址
Read Response响应该消息由主存或者其他处理器提供,包含被请求读取的数据。
Invalidate请求通知其他处理器将对应的缓存条目状态置为I,表示删除指定内存地址的副本数据
Invalidate Acknowledge响应接收到Invalidate消息的处理器必须回复该消息,表示删除了其高速缓存上相应的副本数据
Read Invalidate请求该消息是由Read 和Invalidate消息组合的复合消息。告知其他处理器要更新一个数据,并且要其他处理器删除其高速缓存中相应的副本数据。

当P0要读取数据S时,会根据地址A找到本处理器上的缓存条目,如果P0找到的缓存条目中的Flag为M、S、E,则P0可以直接读取本处理器中地址A对应的数据S,其无需向总线中发送任何消息。如果P0找到的缓存条目为I,则说明本处理器中高速缓存不存在S的副本,此时需要向总线中发送Read消息来读取地址A的数据,其他处理器P1或者主存需要灰度Read Response以提供相应的数据。
P0接收到Read Response 时,会将其中携带的数据S存入相应的缓存行中并将缓存条目中的状态更新为S。当P0发送Respone时,P1会嗅探总线中的消息,然后从消息体中取出待读取的内存地址,找到本处理器中的缓存条目,如果状态不为I,则说明存在数据的副本,则P1构造 Read Respone消息并将数据副本所在的整块数据塞入消息中。
如果P1找到的相应缓存条目状态为M,则P1可能在向Read Response消息前将相应缓存行中的数据写入主内存,先保证主内存中的数据时最新的。发送完Read Response后,相应的缓存条目状态会更新为S。
如果P1找到的相应缓存条目状态为I,则P1不做任何处理,发送Read Response消息的可能是主内存。

当P0向地址A中写数据时,它先会根据A来找到本处理器中的缓存条目,如果缓存条目的状态为E或者M,则说明该处理器已经拥有了该数据的写权限,则P0会将数据直接写入到缓存行中,并将缓存条目更新为M。
如果P0找到的缓存条目状态不为E、M,则需要向总线中发送Invalidate消息来获取数据的所有权,其他处理器接收到Invalidate消息后会将本处理器高速缓存相应的缓存条目状态更新为I(相当于删除变量的副本)并回复Invalidate Acknowledge消息。P0必须在接收到所有处理器的消息后才能更新缓存条目。
如果P0找到的状态为S,说明P1的高速缓存可能也保留了A对应的数据副本。此时P0需要向总线中发送Invalidate消息,在接收到所有处理器回复的Invalidate Acknowledge 消息之后会将相应的缓存条目状态改为E,然后将数据写入相应的缓存条目,之后把状态更新为M。
如果P0找到的状态为I,则表示处理器不包含地址A对应的数据副本,此时P0需要向总线中发送Read Invalidate消息,P0在接收到所有处理器返回的 Read Response和Invalidate Acknowledge 消息之后会将相应的缓存条目的状态更新为E,然后将数据写入相应的缓存条目,之后把状态更新为M。

写缓冲区和无效化队列

更新中。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2049. 统计最高分的节点数目

2049. 统计最高分的节点数目题目算法设计:深度优先搜索题目 传送门:https://leetcode.cn/problems/count-nodes-with-the-highest-score/ 算法设计:深度优先搜索 这题的核心是计算分数。 一个节点的分数 左子树节点数 右子树节点数 除自…

【Opencv 系列】 第4章 直方图

文章目录[TOC](文章目录)前言1、直方图的定义、意义、特征2、直方图:2.1 灰度直方图2.2 彩色直方图前言 1、直方图的定义、意义、特征 在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,他的两个坐标分别是统…

docker安装配置镜像加速器-拉取创建Mysql容器示例

List item docker 常见命令大全docker安装docker拉取创建Mysql容器docker 安装 1、安装链接:https://blog.csdn.net/BThinker/article/details/123358697 ; 2、安装完成需要配置docker镜像加速器 3、docker 镜像加速器推荐使用阿里云的: 编…

硬件学习 软件Cadence day04 PCB 封装绘制

1.文章内容: 1. 贴片式电容 PCB 封装绘制 (型号 c0603 ) 2. 贴片式电阻 PCB 封装绘制 (型号 r0603 ) 3. 安规式电容 PCB 封装绘制 (这个就是 有一个电容,插入一个搞好的孔里面 …

社区宠物诊所管理系统

目录第一章概述 PAGEREF _Toc4474 \h 21.1引言 PAGEREF _Toc29664 \h 31.2开发背景 PAGEREF _Toc3873 \h 3第二章系统总体结构及开发 PAGEREF _Toc19895 \h 32.1系统的总体设计 PAGEREF _Toc6615 \h 32.2开发运行环境 PAGEREF _Toc13054 \h 3第三章数据库设计 PAGEREF _Toc2852…

Prometheus 告警机制介绍及命令解读

本文您将了解到Prometheus 告警模块Alertmanager的架构介绍、核心概念、命令解析和AMTool的基本使用。 Prometheus的告警模块并不存在于Prometheus中,而是 以独立项目Alertmanager存在。Prometheus服务器定义告警规则,这些规则将触发警报,将警报发送到Alertmanager。Alertma…

DaVinci 偏好设置:系统 - 解码选项

偏好设置 - 系统/解码选项Preferences - System/Decode Options解码选项Decode Options使用 GPU 进行 Blackmagic RAW 解码Use GPU for Blackmagic RAW decode允许使用 GPU 来加速 Blackmagic RAW(BRAW)媒体的解码。使用硬件加速解码 H.264/H.265Decode …

谁再用Double定义存储计算金额,我劈了他

不是三婶儿偏执,非要吐槽。家人们,咱就是说,按照基操逻辑谁会把严格金额计算相关的数据使用double类型呢… “我以为吕布已经够勇猛了,这是谁的部下?” 前几天,一同事让帮忙写段代码。内容比较常规&#xf…

Unity之ASE实现边缘光效果

一.前言 今天来实现一个简单的边缘光效果,可以应用与物体表面的一种荧光外溢的效果,特别是用在人的身体表面,会让人的皮肤更细腻,更好看。 物体上效果如下: 人体表面效果如下: 我们可以看到,这种人体表面…

Redis的整合和使用

引入依赖 <!--整合redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>添加配置 spring.redis.host127.0.0.1 spring.redis.port6379 spring.…

算法训练营 day49 动态规划 爬楼梯 (进阶)零钱兑换 完全平方数

算法训练营 day49 动态规划 爬楼梯 &#xff08;进阶&#xff09;零钱兑换 完全平方数 爬楼梯 &#xff08;进阶&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同…

PPO(proximal policy optimization)算法

博客写到一半发现有篇讲的很清楚&#xff0c;直接化缘了 https://www.jianshu.com/p/9f113adc0c50 Policy gradient 强化学习的目标&#xff1a;学习到一个策略πθ(a∣s)\pi\theta(a|s)πθ(a∣s)来最大化期望回报。 一种直接的方法就是在策略空间中直接搜索来得到最优策略&…

详解Ansible中角色的使用

目录 一、ansible roles 1、ansible 角色简介 2、roles目录结构 3、role存放的路径在配置文件ansible.cfg中定义 4、创建目录结构 二、roles的写法及应用 1、覆盖变量 2、控制任务执行顺序 三、ansible—galaxy命令工具 一、ansible roles 1、ansible 角色简介 * Ans…

VNCTF 2023复现

文章目录象棋王子电子木鱼BabyGo象棋王子 签到题&#xff0c;直接在源码中找就ok。 找到一处编码&#xff0c;在控制台输出。 flag为&#xff1a;flag{w3lc0m3_t0_VNCTF_2023~~~} 电子木鱼 需要先理清代码逻辑。 存在三个路由。 一&#xff1a;/路由用来查看当前的功德数量…

兼职任务平台收集(二)分享给有需要的朋友们

互联网时代&#xff0c;给人们带来了很大的便利。信息交流、生活缴费、足不出户购物、便捷出行、线上医疗、线上教育等等很多。可以说&#xff0c;网络的时代会一直存在着。很多人也在互联网上赚到了第一桶金&#xff0c;这跟他们的努力和付出是息息相关的。所谓一份耕耘&#…

Git详解

Git1.Git简介1.1 Git是什么1.2 Git的作用1.3 Git的简介1.4 Git的下载和安装1.5 Git的安装目录结构如下2.Git代码托管服务2.1 常用的Git代码托管服务1.Git简介 1.1 Git是什么 Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、x…

java 基于maven多模块合并打包部署

项目环境 jdk 1.8spring 2.7.xmaven 3.6 项目结构 模块功能 client – 对外service common – 共用工具切面等 main – 启动类 goods – 子模块具体实现 模块间依赖关系 client – 无依赖 common – 无依赖 main – client、common、goods goods – client、common 具体P…

[软件工程导论(第六版)]第6章 详细设计(课后习题详解)

文章目录1 假设只有SEQUENCE和DO-WHILE两种控制结构&#xff0c;怎样利用它们完成 IF THEN ELSE操作&#xff1f;2 假设只允许使用SEQUENCE和IF-THEN-ELSE两种控制结构&#xff0c;怎样利用它们完成DO WHILE操作&#xff1f;3 画出下列伪码程序的程序流程图和盒图&#xff1a;4…

C/C++每日一练(20230219)

目录 1. 用队列实现栈 2. 判断是否能组成三角形 3. 只出现一次的数字 II 附录 栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;的异同 1. 栈和队列的相同点 2. 栈和队列的不同点 1. 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;…

基于FFmpeg和Screen Capturer Recorder实现屏幕和声音的录制

当我们看到一些精彩的视频画面&#xff0c;但无法下载时&#xff0c;可以通过录屏的方式将视频和音频录制下来。 这个时候我们需要安装采集视频和音频的工具screen-capture-recorder。 以下是在windows10环境下&#xff0c;基于FFmpeg和Screen Capturer Recorder实现屏幕和声音…