栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

高并发学习笔记1-操作系统缓存结构

Java 更新时间:发布时间: 百科书网 趣学号

说明:本博客仅为个人学习笔记,无任何商业用途。

1、介绍


1、高速缓存是一种存储速率远比主存内存小的存储部件,每个处理器都有其高速缓存。
2、引入高速缓存之后,处理器在执行内存读,写操作的时候并不直接与主内存打交道,而是通过高速缓存进行的。变量名相当于内存地址,而变量值相当于相应内存空间所存储的数据。
3、从这个角度看,高速缓存相当于为程序所访问的每个变量保留了一份相应内存空间所存储数据(变量值)的副本。由于高速缓存的存储容量远小于主内存,因此高速缓存并不是每时每刻保留着所有变量值的副本。高速缓存相当于一个由硬件实现的容量极小的散列表(Hash Table),其键(Key)是一个内存地址,其值(Value)是内存数据的副本或者准备写入内存的数据。
4、从内部结构来看,高速缓存相当于一个拉链散列表,它包含若干桶(Bucket,硬件上称之为Set),每个桶又可以包含若干缓存条目(Cache Entry)

缓存条目又可以进一步划分为Tag,Data Block以及Flag这三个部分, 其中Data Block又称之为缓存行,它是高速缓存与主内存之间的数据交换的最小单元,用于存储从内存中读取的或者准备写往内存的数据。Tag则包含了与缓存行中数据相应的内存地址的部分信息(内存地址的高位部分比特)Flag用于表示相应相应缓存行的状态信息。一般来说,缓存行的容量(也被称为缓存行宽度)通常是2的倍数,其中大小在16~256Byte之间不等。从代码的角度来看,一个缓存行可以存储若干变量的值,而多个变量的值则可能被存储在同一个缓存行之中。

读取变量时,会读取对应的地址,该地址即为内存地址。处理器在执行内存访问操作时会将相应的内存地址解码(具体解码动作由高速缓存控制器(Cache Controller)负责执行)。内存地址的解码结果包括tag,index以及offset这三部分数据。其中index相当于桶编号,它可以用来定位内存地址对应的桶;一个桶可能包含多个缓存条目,tag相当于缓存条目的相对编号,其作用在于用来与同一个桶中的各个缓存条目进行比较,从而具体定位某个缓存条目;由于一个缓存条目可以存储多个变量,因此offset是某个变量缓存行内的位置偏移结果,即确定某个变量在缓存行中的起始位置。根据这个解码结果,如果说高速缓存子系统:找到了相应的缓存条目并且所在条目的flag表示相应的缓存条目有效。则我们称相应的内存操作产生了缓存命中;否则,我们就称相应的内存操作产生了缓存未命中。缓存未命中具体看可以分为读未命中(Read Miss),和写未命中(Write Miss),分别对应内存读和写操作。当读未命中产生时,处理器所需读取的数据会从内存中加载并被存入相应的缓存行之中。这个过程会导致处理器停顿(Stall)而不能执行其他指令。

2、架构

现在处理器一般有多个高速缓存,通常称为一级缓存(L1 Cache),二级缓存(L2 Cache),三级缓存(L3 Cache),…(L… Cache),window 10 下为3级缓存。

拓展:缓存共享问题?

下一篇

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/295035.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号