存储器的组织形式:
数据总是在相邻两层之间复制传送,最小传送单位是定长块,互为副本(不删除)
️指令和数据有时间局部性和空间局部性。
 
高速缓冲存储器Cache
介于CPU和主存储器间的高速小容量存储器,由静态存储芯片SRAM组成,容量较小但比主存DRAM技术更加昂贵而快速, 接近于CPU的速度。CPU往往需要重复读取同样的数据块, Cache的引入与缓存容量的增大,可以大幅提升CPU内部读取数据的命中率,从而提高系统性能。通常由高速存储器、联想存储器、地址转换部件、替换部件等组成。
  • 联想存储器:根据内容进行寻址的存储器(冯氏模型中是按照地址进行寻址,但在高速存储器中往往只存有部分信息,此时需要根据内容进行检索)
  • 地址转换部件:通过联想存储器建立目录表以实现快速地址转换。命中时直接访问Cache;未命中时从内存读取放入Cache
  • 替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件
早期采用外部(Off-chip)Cache,不做在CPU内而是独立设置一个Cache;
现在采用片内(On-chip)Cache,将Cache和CPU作在一个芯片上,且采用多级Cache,同时使用L1 Cache和L2 Cache,甚至有L3 Cache。
(1)一般L1 Cache都是分立Cache,分为数据缓存和指令缓存,可以减少访存冲突引起的结构冒险,这样多条指令可以并行执行;内置;其成本最高,对CPU的性能影响最大
多级Cache的情况下,L1 Cache的命中时间比命中率更重要
(2)一般L2 Cache都是联合Cache,这样空间利用率高
没有L3 Cache的情况下,L2 Cache的命中率比命中时间更重要(缺失时需从主存取数,并要送L1和L2 cache)
(3)L3 Cache多为外置,在游戏和服务器领域有效;但对很多应用来说,总线改善比设置L3更加有利于提升系统性能
 
例:Intel Core i7处理器的Cache架构
i-cache和d-cache都是32KB、8路、4个时钟周期;
L2 cache:256KB 、8路、11个时钟周期。
所有核共享的L3 cache:8MB、16路、30~40个时钟周期。
Core i7中所有cache的块大小都是64B
 
鉴于程序执行与数据访问的一致性原理,存储管理软件使用Cache可以大幅提升程序执行效率。
主存映射:
Cache越大,Miss率越低,但成本越高
把主存空间划分成大小相等的主存块(Block),Cache也被分成相同大小的块,称为Cache行(line)或槽(Slot)。
Block大小与Cache大小有关,且不能太大,也不能太小:采用大的Block能很好地利用空间局部性,但需要花费较多的时间来存取,缺失损失会变大。
将主存块和Cache行按照以下三种方式进行映射
  • 直接(Direct)映射/模映射:每个主存块映射到Cache的固定行
Cache标记(tag)指出对应行取自哪个主存块群号。
有效位V,为1表示有效;开机或复位时,使所有行的有效位V=0;进程切换或DMA传送时,通过使V=0来冲刷Cache。
操作系统内核可以使用“cache冲刷”指令
特点:容易实现,命中时间短,无需考虑淘汰问题;但不够灵活,Cache存储空间得不到充分利用,命中率低
例子:
Block大小为16B,Cache共4K2^12行。
如何判断命中:中间的12位作为index索引找到对应行,拿地址中的tag和该行的tag对比,tag相等且V=1则hit
如果取32位word,块内地址高2位决定取块内哪个word,低2位决定取word四个字节中的哪一个
  • 全相联(Full Associate):每个主存块映射到Cache的任一行
按内容访问,是相联存取方式
特点:同时比较所有Cache项的标志,无需Cache索引;命中时间长;没有冲突缺失,因为只要有空闲Cache块,都不会发生冲突;每一行都需要比较器,比较器位数长,占用容量增加。
  • 组相联(Set Associate):每个主存块映射到Cache固定组中任
将Cache所有行分组,把主存块映射到Cache固定组的任一行中。也即:组间模映射、组内全映射。映射关系为:
Cache标记(tag)指出对应行取自哪个主存块群号。
N-路组相联(N-way set associative):N 个直接映射的行并行操作
例如:2-路组相联
  1. Cache Index 选择其中的一个Cache行集合(共2行)
  2. 对这个集合中的两个Cache行的Tag并行进行比较
  3. 根据比较结果确定信息在哪个行,或不在Cache中
特点:结合直接映射和全相联映射的优点。当Cache组数为1时,变为全相联映射;当每组只有一个槽时,变为直接映射。
           每组2或4行(称为2-路或4-路组相联)较常用。
           通常每组4行以上很少用,只有在较大容量的L2 Cahce和L3 Cahce中使用 4-路以上。
 
  可能的位置 关联度 缺失率 命中时间 tag位数
直接映射 唯一映射 最低,为1 最高 最小 最小
全相联映射 任意映射 最高,为Cache行数 最低(关联度越高命中率越高) 最大 标记=主存块号
N-路组相联映射 N-路映射 居中,为N     路数翻倍,增加1位
 
Cache替代算法:
  • 先进先出FIFO (first-in-first-out)
FIFO的命中率并不随组的增大而提高。
  • 最近最少用LRU ( least-recently used)
LRU的命中率随组的增大而提高。
LRU具体实现时,并不是通过移动块来实现的,而是通过给每个cache行设定一个计数器,根据计数值来记录这些主存块的使用情况。这个计数值称为LRU位。
计数器变化规则:
  1. 每组4行时,计数器有2位。计数值越小则说明越被常用。命中时,被访问行的计数器置0,比其低的计数器加1,其余不变。
  2. 未命中且该组未满时,新行计数器置为0,其余全加1。
  3. 未命中且该组已满时,计数值为3的那一行中的主存块被淘汰,新行计数器置为0,其余加1。
计数值为0的行中的主存块最常被访问,计数值为3的行中的主存块最不经常被访问,先被淘汰。
颠簸/乒乓(Thrashing / PingPong)现象:当分块局部化范围(即:某段时间集中访问的存储区)超过了Cache存储容量时,命中率变得很低。极端情况下,假设地址流是1、2、3、4、1、2、3、4、1……而Cache每组只有3行,那么,不管是FIFO,还是LRU算法,其命中率都为0。
  • 最不经常用LFU ( least-frequently used)
  • 随机替换算法(Random)
 
以下情况会出现Cache一致性问题
  1. 因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时,就存在Cache和主存如何保持一致的问题。
  2. 当多个设备都允许访问主存时。I/O设备可直接读写内存时,如果Cache中的内容被修改,则I/O设备读出的对应主存单元的内容无效;若I/O设备修改了主存单元的内容,则Cache中对应的内容无效。
  3. 当多个CPU都带有各自的Cache而共享主存时。某个CPU修改了自身Cache中的内容,则对应的主存单元和其他CPU中对应的内容都变为无效。
解决cache一致性问题的关键是处理好写操作。通常有两种写操作方式:
  • 全写法Write Through(通写法、写直达法、直写法):
若写命中,则同时写cache和主存
若写不命中,则有以下两种处理方式:
(1)Write Allocate (写分配):先在主存块中更新相应存储单元, 然后分配一个cache行,将更新后的主存块装入分配的cache行中。该方法试图利用空间局部性,但每次写不命中都要从主存读一个块。
(2)Not Write Allocate (非写分配):直接写主存单元,不把主存块装入到Cache。该方法可以减少读入主存块的时间, 但没有很好利用空间局部性。
全写法在替换时不必将被替换的cache内容写回主存, 而且cache和主存的一致性能得到充分保证。但即使很少的存储指令也会极大增加CPI。
可以在 Cache 和 Memory之间加一个Write Buffer(写缓冲) ,它是一个FIFO队列,一般有4项,在存数频率不高时效果好。
CPU同时写数据到Cache和Write Buffer;存控(Memory controller)将缓冲内容写主存
当频繁写时,易使写缓存饱和,发生阻塞。可以加一个二级Cache或者使用Write Back方式的Cache
  • 回写法Write Back(一次性写方式、写回法):只写cache不写主存,缺失时一次写回,每行有个修改位dirty bit脏位,大大降低主存带宽需求,控制可能很复杂
由于回写法没有同步更新cache和主存内容, 所以存在cache和主存内容不一致而带来的潜在隐患。 通常需要其他的同步机制来保证存储信息的一致性。
总结:写不命中时,直写Cache可用非写分配或写分配;回写Cache一定用写分配
 
总结:
最好的情况是hit、hit、hit,此时,不需要访问主存
最坏的情况是miss、miss、miss需访问磁盘、并访存至少2次
hit、hit、miss和miss、hit、hit访存1次
miss、hit、miss不需访问磁盘、但访存至少2次

操作系统-存储管理(3)高速缓存Cache的更多相关文章

  1. 再说Postgres中的高速缓存(cache)

    表的模式信息存放在系统表中,因此要访问表,就需要首先在系统表中取得表的模式信息.对于一个PostgreSQL系统来说,对于系统表和普通表模式的访问是非常频繁的.为了提高这些访问的效率,PostgreS ...

  2. 操作系统-存储管理(6)buffer/cache/swap

    为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘. 缓存 ...

  3. 细说Oracle数据库与操作系统存储管理二三事

    在上大学的时候,学习操作系统感觉特别枯燥,都是些条条框框的知识点,感觉和实际应用的关联不大.发现越是工作以后,在工作中越想深入了解,发现操作系统知识越发重要.在实践中结合理论还是不错的一种学习方法.自 ...

  4. 操作系统-存储管理(5)IA-32/Linux的地址转换

    IA-32/Linux按字节编址:在保护模式下,IA-32采用段页式虚拟存储管理方式,存储地址采用逻辑地址.线性地址和物理地址来进行描述. 逻辑地址由48位组成,包含16位段选择符(高13位为段表项的 ...

  5. linux查看CPU高速缓存(cache)信息

    一.Linux下查看CPU Cache级数,每级大小 dmesg | grep cache 实例结果如下: 二.查看Cache的关联方式 在 /sys/devices/system/cpu/中查看相应 ...

  6. 操作系统之cache、伙伴系统、内存碎片、段式页式存储管理

    存储管理是操作系统非常重要的功能之一,本文主要介绍操作系统存储管理的基础知识,包括缓存相关知识.连续内存分配.伙伴系统.非连续内存分配.内存碎片等,并结合linux系统对这些知识进行简单的验证.文章内 ...

  7. 寄存器,cache、伙伴系统、内存碎片、段式页式存储管理

    cache.伙伴系统.内存碎片.段式页式存储管理 目录 分层的存储管理 cache 局部性原理 置换算法 写回策略 linux环境下的cache 连续内存分配与内存碎片 内部碎片与外部碎片 动态分区分 ...

  8. 深入解析Windows操作系统笔记——CH2系统结构

    2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.3.1 可移植性 2.3.2 对称 ...

  9. (转)CPU Cache与内存对齐

    转自:http://blog.csdn.net/zhang_shuai_2011/article/details/38119657 原文如下: 一. CacheCache一般来说,需要关心以下几个方面 ...

随机推荐

  1. Win10下ImageMagick及php-imageck扩展的安装

    安装ImageMagick https://imagemagick.org/script/download.php 选择符合自己电脑的版本进行安装即可.安装的时候注意勾选下面的选项自动加入环境变量,否 ...

  2. centos7安装部署docker

    Kubernetes/K8s架构师实战集训营[中级班]:https://pan.baidu.com/s/1FWAz2V7BPsObixlZyW93sw 提取码:mvu0 Kubernetes/K8s架 ...

  3. cmd 安装第三方库问题

    pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 一定要指定 信任豆瓣源,不然就算换了源 ...

  4. PHP timezone_name_from_abbr() 函数

    ------------恢复内容开始------------ 实例 根据时区缩略语返回时区名称: <?phpecho timezone_name_from_abbr("EST" ...

  5. luogu P5043 【模板】树同构 hash 最小表示法

    LINK:模板 树同构 题目说的很迷 给了一棵有根树 但是重新标号 言外之意还是一棵无根树 然后要求判断是否重构. 由于时无根的 所以一个比较显然的想法暴力枚举根. 然后做树hash或者树的最小表示法 ...

  6. 部署java项目日志乱码求解!!!

    springboot项项目打成war包放到tomcat9上,项目日志出现乱码,tomcat乱码已解决,这个不知道咋回事!!!!!! 这是项目的打包坐标 <parent> <group ...

  7. Go语言系列(三)之数组和切片

    <Go语言系列文章> Go语言系列(一)之Go的安装和使用 Go语言系列(二)之基础语法总结 1. 数组 数组用于存储若干个相同类型的变量的集合.数组中每个变量称为数组的元素,每个元素都有 ...

  8. Sharding-JDBC主键生成策略

    当使用分库分表等功能之后,就不能再依赖数据库自带的主键生成机制了,一方面主键ID不能重复,另外需要在新增之前就知道主键ID,才能保证ID能够均匀分布到不同的数据库或数据表中,所以要使用一个合理的主键生 ...

  9. Springboot中的CommandLineRunner

    CommandLineRunner接口的作用 在平常开发中可能需要实现在启动后执行的功能,Springboot提供了一种简单的实现方案,即实现CommandLineRunner接口,实现功能的代码在接 ...

  10. 什么是DO,DTO,VO,POJO

    俗话说,没有规矩不成方圆,今天来说一下 Java 中的各种 O(bject). 为什么会出现这些 O? 我们知道,这些 O 不管叫什么名字,其本质都还是对象(Object),既然本质都一样,为什么非要 ...