多线程之缓存一致性协议

前言: 

  CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要  高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。 

  首先在电脑中,CPU读取RAM中的数据数据的流程是,通过I/O总线(BUS),将数据从RAM中获取需要操作的数据进CPU需要如下几个步骤

  1. CPU中的三级缓存从RAM中获取该数据。
  2. CPU中的二级缓存从三级缓存中获取改数据。
  3. CPU中的一级缓存从二级缓存中获取改数据。
  4. CPU中的寄存器从一级缓存中获取该数据。然后进行想对应的处理运算。
  5. 然后一步步返回给RAM

这是一个单核CPU的处理过程,那么现在随着技术的不断发展和CPU的不断升级,出现了多核CPU 或者一个主板上面有多个CPU的存在,那么上面的操作,在某些时候可能就是不安全的,

因为可能多个线程控制的CPU会同时对该数据进行处理和运算。那么我们该如何解决这种办法呢?

首先我们可能想到在BUS IO总线上进行锁定,但是换个角度思考,如果总线锁定了,那么会对后面其他CPU的执行命令造成堵塞。

多核CPU多级缓存一致性协议MESI

多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。

加入了这个一致性的方法,就解决了缓存可能造成的不一致的问题。具体流程是怎么走的呢?

  1. 首先还是前面的流程,当CPU1进行读取数据的时候,把数据读取到自己的 缓存中时,会给该数据内容打上一个标记E(独享),该数据就我有,其他人都没有(在此时,CPU会时刻监听其他CPU的状态)。
  2. 与此同时,CPU2也后去到了该数据,然后CPU获取到该数据也有其他CPU进行缓存,那么就会给该数据打上 一个S(共享)的状态,且CPU1也 会将该状态改成S。
  3. CPU1继续进行,处理完该数据,将状态改成M(修改)将改缓存行进行锁定,与此同时其他CPU 不断的监控状态,获取到之后 将自己的状态改成I(无效)然后进行废弃。
  4. 如果同时多个CPU 都将数据修改成M状态,那么底层就会触发一个选举机制,只选出一个人来进行修改M

缓存行(Cache line):缓存存储数据的单元。CPU 最小的储存单元。

状态 描述 监听任务
M 修改 (Modified) 该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。 缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S(共享)状态之前被延迟执行。
E 独享、互斥 (Exclusive) 该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。 缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态。
S 共享 (Shared) 该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。 缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。
I 无效 (Invalid) 该Cache line无效。

什么时候缓存一致性协议失效呢?

  当缓存的数据长度大于一个缓存行的时候,就会失效。换句话说就是一个缓存行可以储存多个数据,但是一个数据不可以跨多个缓存行。

未完待续!!

接下来我们要了解一下什么是用户态和内核态:URL:

原文地址:https://www.cnblogs.com/xiaosisong/p/12426415.html

时间: 2024-07-30 20:07:00

多线程之缓存一致性协议的相关文章

Java的多线程机制:缓存一致性和CAS

Java的多线程机制:缓存一致性和CAS 一.总线锁定和缓存一致性 这是两个操作系统层面的概念.随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性. 我们知道,CPU和物理内存之间的通信速度远慢于CPU的处理速度,所以CPU有自己的内部缓存,根据一些规则将内存中的数据读取到内部缓存中来,以加快频繁读取的速度.我们假设在一台PC上只有一

多线程之:MESI-CPU缓存一致性协议

MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议,该协议被应用在Intel奔腾系列的CPU中,详见“support the more efficient write-back cache in addition to the write-through cache previously used by the Intel 486 processor” MESI

聊聊高并发(五)理解缓存一致性协议以及对并发编程的影响

Java作为一个跨平台的语言,它的实现要面对不同的底层硬件系统,设计一个中间层模型来屏蔽底层的硬件差异,给上层的开发者一个一致的使用接口.Java内存模型就是这样一个中间层的模型,它为程序员屏蔽了底层的硬件实现细节,支持大部分的主流硬件平台.要理解Java内存模型以及一些处理高并发的技术手段,理解一些基本的硬件知识是必须的.这篇会说一下跟并发编程相关的一些硬件知识. 一个基本的CPU执行计算的过程如下: 1. 程序以及数据被加载到主内存 2. 指令和数据被加载到CPU的高速缓存 3. CPU执行

多核程序设计——缓存一致性协议MESI

MESI协议 在MP系统中,每个CPU都有自己独立的cache,缓存之间的一致性很很容易受到破坏的,所以缓存一致性协议就应运而生了.MESI是一种使用非常广泛的缓存一致性协议. MESI存在"modified","exclusive","shared"和"invalid"四种状态,协议可以在一个指定的缓存中应用这四种状态.因此,协议在每一个缓存行中维护一个两位的状态"tag",这个"tag&quo

一篇文章让你明白CPU缓存一致性协议MESI

CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU.这就造成了高性能能的内存和硬盘价格及其昂贵.然而CPU的高度运算需要高速的数据.广州SEO为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题. 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理. **时间局部性(Tempora

缓存一致性协议MESI

1. 缓存一致性协议的由来: 计算机的存储设备速度与cpu的运算速度之间是数量级的差距,现代计算机不得不加入一层读写速度尽可能接近cpu运算速度的高速缓存来作为内存和cpu之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样cpu就无须等待缓慢的内存读写了. 基于高速缓存的存储交互很好地解决了cpu与内存的速度矛盾,但是也引入了新的问题:缓存一致性.在多cpu系统中,每个cpu都有自己的高速缓存,而它们又共享同一主内存,当多个cpu的运算任务

缓存一致性协议

刚看到一篇很好的介绍缓存一致性的文章,晚一点把其中的英文部分翻译过来 https://zhuanlan.zhihu.com/p/25876351 https://en.wikipedia.org/wiki/MESI_protocol

内存管理_缓存一致性

计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在SRAM(物理内存)当中的,由于CPU执行速度很快,而从内存读取数 据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度,因此在CPU里面就有了一级.二级Cache(DRAM).也就是,当程序在运行过程中,会将运算需要的数据从RAM复制一份到Cache中,那么CPU进行计算时就可以

内存模型是怎么解决缓存一致性的?

前言 在再有人问你Java内存模型是什么,就把这篇文章发给他.这篇文章中,我们介绍过关于Java内容模型的来龙去脉. 我们在文章中提到过,由于CPU和主存的处理速度上存在一定差别,为了匹配这种差距,提升计算机能力,人们在CPU和主存之间增加了多层高速缓存.每个CPU会有L1.L2甚至L3缓存,在多核计算机中会有多个CPU,那么就会存在多套缓存,那么这多套缓存之间的数据就可能出现不一致的现象.为了解决这个问题,有了内存模型.内存模型定义了共享内存系统中多线程程序读写操作行为的规范.通过这些规则来规