《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——第2章 高速缓存存储系统概述 2.1存储器层次结构

简介: 高速缓存是一种高速存储系统,它保存有主存储器很小的一个子集的内容。它的物理位置介于主存储器和CPU之间。因为它比主存储器速度快,所以如果频繁使用的指令和数据能够保存在高速缓存中供CPU存取,那么就有可能提高系统的性能。

本节书摘来自异步社区《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》一书中的第2章,第2.1节,作者:【美】Curt Schimmel著,更多章节内容可以访问云栖社区“异步社区”公众号查看

第2章 高速缓存存储系统概述

高速缓存存储系统(cache memory system)是高速存储器,它能够利用引用的局部性来提高系统性能。本章解释了高速缓存的基本术语、规划和操作,阐述了高速缓存是如何配合主存储器运行的,以及高速缓存中的数据是如何定位的。本章还介绍了散列算法(hashing algorithm)、缺失处理(miss processing)、写策略(write policy)、替换策略(replacement policy)以及组相联(set associativity)。本章主要着眼于单处理器系统的高速缓存,多处理器高速缓存将在第三部分中进行介绍。到本章结束的时候,读者会对高速缓存的操作非常熟悉,可以在后面的章节中开始研究操作系统的问题了。

2.1 存储器层次结构

现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)
高速缓存是一种高速存储系统,它保存有主存储器很小的一个子集的内容。它的物理位置介于主存储器和CPU之间。因为它比主存储器速度快,所以如果频繁使用的指令和数据能够保存在高速缓存中供CPU存取,那么就有可能提高系统的性能。图2-1给出了包含高速缓存的一个计算机系统的逻辑框图。
screenshot

高速缓存利用引用的局部性(locality of reference)来改善系统性能。引用局部性是大多数程序所表现出来的一种属性,在这些程序中,在一个特定的时间段内,程序指令和数据的一个相当小的子集被频繁地重复引用。如果能够把程序当前的局部引用保存在高速缓存中,那么程序就能执行得更快,因为高速缓存可以比主存储器更快地提供指令和数据。

高速缓存只是存储器层次结构(memory hierarchy)中的一个组成部分。这个存储结构的一端是磁盘存储器,它具有非常高的密度,很低的每位成本,而存取速度则(相对)较慢。另一端是CPU内的寄存器,在数量上只有几个,具有很高的每位成本,但是存取速度极快。随着我们从磁盘存储器过渡到寄存器,单位成本逐渐增加,存取速度逐渐加快,而密度却逐渐降低。

虚拟存储器调页系统(paging system)已经显示出只占系统中所有进程所使用的全部虚拟存储空间大小若干分之一的主存储器系统是怎样提供良好的整体性能的。引用的局部性通过只要求一个进程当前的工作集(working set)驻留内存使之成为可能,工作集是那些包含有进程当前局部引用位置的存储页面。进程地址空间的其他部分则可以保存在磁盘上,直到需要的时候再加载。

引用局部性延伸到了比工作集更细的粒度上。在一个进程工作集的页面内,肯定会有一组指令和变量在一段极短的时间内被一个程序频繁地重复引用。例如,考虑图2-2中计算矩阵a和b乘积的C代码小片段。假定a是一个m×r矩阵,而b是一个r×n矩阵,c的全部元素都初始化为0。

screenshot

在这段代码执行的同时,它重复引用了3个循环内的指令、矩阵的元素以及循环计数器。这就是当这段代码在执行时程序的局部引用。由于矩阵包含的数据比寄存器能保存的数据多,因此如果没有高速缓存,CPU就不得不重复引用主存储器,从而将这部分程序的执行速度限制在了主存储器的存取时间上。

图2-2中有两种类型的局部性:时间的(temporal)和空间的(spatial)。时间局部性是程序有可能重复使用近期引用过的项的属性。例如,在执行最里面的一层循环期间,数组c的同一个元素会被引用两次,循环变量i、j和k也是如此。类似地,在所有三层循环中的指令也会被重复引用。所有这些引用都体现出了时间局部性。空间局部性是程序有可能重复使用前面附近引用过的项的属性。由于C语言中的数组都是按照行的顺序保存的,所以数组a和c都体现出了空间局部性,因为会在后面的迭代中访问到行中的下一个邻接元素。类似地,串行程序的执行表现出了高度的空间局部性。

主存储器系统速度的提高和成本的降低并不能跟上如今高速CPU的发展速度。如果CPU的速度和主存储器的存取时间远远不能平衡,这意味着存储器要比CPU执行指令以及加载和保存数据的能力慢得多,那么CPU就会受到存储器速度的限制。在这样的情况下,提高CPU的速度对于改善系统的整体性能来说几乎没有什么帮助,因为存储系统仍然是限制因素。虽然人们可以制造大规模的高速主存储器系统,它们的存取时间能够同CPU加载和保存数据的能力相媲美,但是这种存储系统对于高端大型机和超级计算机以外的系统来说往往太贵了。当今很多系统设计人员所采取的另一种选择是使用高速缓存。

通过利用细粒度的引用局部性,高速缓存能够弥补速度较慢的主存储系统和快速的CPU之间的鸿沟。在存储器层次结构中,每一级引用局部性的应用情况如图2-1所示。正如主存储器只保存了程序的一个子集(工作集)那样,寄存器保存了当前运算的操作数,高速缓存保存了正在工作的指令和变量集,在那之上形成了细粒度的局部引用。由于引用的局部性,高速缓存只需要拥有主存储器的很小一部分就能够发挥效用。由于它的规模相对较小,所以实际上可以使用比主存储器所采用的速度更快的存储设备,因为并不需要太多的高速缓存。于是,高速缓存的高速度与对引用局部性的利用相结合就能大幅提高系统性能,同时在经济上也很划算。

相关文章
|
17天前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存对性能的影响
【4月更文挑战第25天】 在提升PHP应用性能的众多策略中,Opcode缓存技术因其显著的效果和较低的复杂度而备受开发者青睐。本文将深入探讨Opcode缓存机制,解析其对PHP执行效率的提升原理,并通过实验数据展示启用Opcode缓存前后的性能差异。我们还将讨论几种流行的Opcode缓存工具,如APC、OpCache与APCu,并评估它们的优劣及适用场景,帮助开发者根据不同的项目需求做出合适的选择。通过本文,读者不仅能够了解Opcode缓存的工作原理,还能学会如何在实际项目中应用这一技术以优化PHP应用程序的性能。
|
21天前
|
缓存 NoSQL Redis
Python缓存技术(Memcached、Redis)面试题解析
【4月更文挑战第18天】本文探讨了Python面试中关于Memcached和Redis的常见问题,包括两者的基础概念、特性对比、客户端使用、缓存策略及应用场景。同时,文章指出了易错点,如数据不一致和缓存淘汰策略,并提供了实战代码示例,帮助读者掌握这两款内存键值存储系统的使用和优化技巧。通过理解其核心特性和避免常见错误,可以提升在面试中的表现。
27 2
|
6天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
2月前
|
存储 缓存 NoSQL
优质推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
优质推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
51 0
|
11天前
|
存储 缓存 自然语言处理
深入PHP内核:探索Opcode缓存机制
【5月更文挑战第1天】 在动态语言如PHP的执行过程中,每次脚本被请求时都需要经过一系列复杂的解析和编译步骤。为了优化这一过程并提高性能,PHP引入了Opcode缓存机制。本文将详细探讨Opcode的概念、作用以及它如何显著提升PHP应用的执行效率。我们将从缓存原理出发,分析几种常见的Opcode缓存工具,并通过实例说明如何在实际项目中实现和优化缓存策略。
|
12天前
|
存储 缓存 自然语言处理
深入PHP内核:探索Opcode缓存对性能的影响
【4月更文挑战第30天】 在动态内容生成的Web开发领域,PHP一直是广受欢迎的脚本语言之一。然而,由于其每次请求都需要经过解释执行的特性,性能上往往受到质疑。随着现代PHP引擎如Zend和Facebook的HipHop Virtual Bytecode (HPHPc)的出现,引入了Opcode(操作码)缓存机制来提升PHP的性能。本文将深入探讨Opcode缓存技术是如何工作的,以及它对PHP应用程序性能的具体影响。我们将通过实验数据与分析,揭示Opcode缓存在不同场景下的优势和局限性,并提出优化策略。
|
18天前
|
存储 数据采集 缓存
软件体系结构 - 缓存技术(10)布隆过滤器
【4月更文挑战第20天】软件体系结构 - 缓存技术(10)布隆过滤器
22 0
|
19天前
|
缓存 数据库 UED
软件体系结构 - 缓存技术(9)缓存穿透
【4月更文挑战第20天】软件体系结构 - 缓存技术(9)缓存穿透
75 13
|
19天前
|
缓存 监控 前端开发
软件体系结构 - 缓存技术(8)缓存雪崩
【4月更文挑战第20天】软件体系结构 - 缓存技术(8)缓存雪崩
79 17
|
19天前
|
缓存 NoSQL Redis
软件体系结构 - 缓存技术(7)Redis持久化方法
【4月更文挑战第20天】软件体系结构 - 缓存技术(7)Redis持久化方法
87 14