内存管理 之 存储器层次结构

简介:

本节承上节内容,主讲存储器的层次结构。


一、存储系统的分层管理

1、为什么需要分层存储管理

现代的高性能计算机系统要求存储器速度快、容量大,并且价格合理;然而,按照当前的技术水平,仅用单一的存储介质是很难满足要求的。因此,现代计算机系统通常把各种不同存储容量、存取速度和价格的存储器按照一定的体系组成多层结构,并通过管理软件和辅助硬件有机组合成统一的整体,使所存放的程序和数据按层次分布在各种存储器中,以解决存储器容量、存取速度和价格之间的矛盾。

2、分层存储管理需要考虑的问题

A、首先是数据一致性的问题。

B、第二个问题就是命中率的问题。

C、第三个问题就是在分层介质的选择上。

D、第四个问题就是数据分层的级别。

E、第五个问题就是数据的迁移策略的设计。

3、什么是分层存储管理

分层存储(Tiered Storage),也称为分层存储管理(Hierarchical Storage Management),广义上讲,就是将数据存储在不同层级的介质中,并在不同的介质之间进行自动或者手动的数据迁移,复制等操作。同时,分层存储也是信息生命周期管理的一个具体应用和实现。

4、分层存储系统结构及技术

理论基础:存储器访问的局部性原理:对局部范围内存储器地址频繁访问,而对此范围以外的存储器地址较少访问。

——局部性有两种含义:一种称为引用局部性,指的是程序会访问最近访问过的数据和指令;另一种称为时间局部性,指的是访问一个数据之后,很可能在不久的将来再次访问该数据。

多层存储体系结构:

上图给出的典型多层存储体系结构基于存储器访问的局部性原理。该设计要达到的目标是:整个存储系统速度接近M1存储器,而价格和容量接近Mn存储器。由于大多数程序访问的指令和数据都是相对簇聚的,因此可以把近期需要使用的指令和数据放在尽可能靠近CPU的上层存储器中(任何上层存储器中的数据都是其下一层存储器中数据的子集)。CPU访问存储器时,首先访问M1,若在M1中找到所需数据(命中)则直接存取,若找不到(不命中),则将M2中包含所需数据的块或页调入M1,若在M2中也找不到,则就访问M3,以此类推。                                                  

在多层存储系统中,每一层都需要确定映像、查找、替换和更新等操作策略。

(1)映像规则:

映像规则用于确定一个新的块(或页)被调入本级存储器时应该放在什么位置上。

A、最简单的映像规则是直接映像(Direct Mapping)方式,其规定每一个块(或页)只能被放到唯一的一个指定位置。直接映像时的地址变换速度快,实现简单,确定是不够灵活,降低了命中率。

B、全相联映像(Fully Associated Mapping)方式,其允许任一块(或页)放在存储器的任意位置。全相联映像方式的优点是可以灵活地进行块的分配,块的冲突率低,但实际上由于它的成本太高而并不会被采用。

C、组相联映像方式,是直接映像和全相联映像方式的这种方案。组相联映像把块(或页)分组,不同组的块(或页)对应不同的映像位置,而同组的块(或页)可以放在相应映射组内的任一位置,及组间为直接映像,而组内的字块为全相联映像方式。组的容量只有一个块时就成了直接映像,组的容量是整个上层存储器容量时就成了全相联映像,组的容量时n个块时就成了n路组相联映像。组相联映像的主要优点是块的冲突概率较低,利用率大幅度提高;主要缺点是实现难度和造价高。

(2)查找规则:

查找规则用于确定需要的块(或页)是否存在在本级存储器中,以及如何查找。查找规则与映像规则相关,通常可采用目录表的方式进行索引查找。

(3)替换规则:

替换规则用于确定本级存储器不命中且已满是应替换那一块(或页)。在全相联映像和组相联映像方式时,下层存储器的数据块可以写入上层存储器中的若干位置,因此存在选择替换那一块的问题。先入先出(First In First Out,FIFO)选择将最早调入的块作为被替换得块,而最近最少使用(Least Recently Used,LRU)选择将最久未被访问块作为被替换块,另一种随机替换算法(RAND)是在组内随机选择一块来替换。由于FIFO和RAND算法都没有利用存储器访问局部性原理,因此不能提高系统命中率,而LRU算法的命中率比FIFO算法和RAND算法更高。另外,块(或页)替换时应避免出现颠簸现象(命中率有时很高,有时又很低)。

(4)更新规则:

更新规则用于确定“写数据”时应进行的操作。写操作可能会导致数据不一致问题,即同一个数据在上下两层中可能出现两个不同的副本。通常采用的更新规则有如下3种。

A、标识交换法(Flag Swap),又称按写分配法(Write Allocate)。在这种情况下,CPU暂时只向上层存储器写入,并用标志加以注明,直到经过修改的字块从上层存储器中被替换出来时才真正写回下层存储器。

 

B、写直达法(Write Through),又称写贯穿法。在这种方式下,从CPU发出的写信号同时送到相邻的两层,以保证上下两层中的相同数据能同步更新。写直达法的优点是操作简单,但由于下层存储器存取速度较慢,将对整个系统的写速度造成影响。

 

C、回写法(Write Back)。为了克服写直达法的弊端,尽量减少对下层存储器的访问次数,可以采用回写法进行更新。在这种方式下,数据一般只写到上层存储器中并设置一个修改标志,当该数据需要被更改时才将原更新的数据写入下层存储器中,然后再接手再次更新的数据。

 

命中率(或失效率)通常可以用来衡量多层存储体系把握访问局部性的性能,它是指利用CPU产生的有效地址可直接(或不能)在存储体系的高层访问到所需信息的概率。考虑到存储体系实现方面的一些具体情况,一般可以用存储器的平均访问时间来评价一个存储器体系的性能:

存储器平均访问时间=命中时间+失效率*失效开销

上式中的命中时间是指访问高层存储器所需的时间,其中包括判定访问是否命中的时间;失效开销是指用下一级存储中相应块替代上一级的块的时间,加上将该块发送到相应设备(CPU)的时间。失效开销进一步可分为访问时间和传输时间两个部分,前者是指在出现失效时访问到块中第一个字的时间(取决于底层存储器的延迟);后者是指传输块中其他字的附加时间(取决于两层存储器之间的带宽和块的大小)。

下面一些技术可以用于降低失效率、减小失效开销或减少命中时间,从而进一步改进分层系统的性能。

*采用增加块大小、增加上层存储容量、提高相联度。预取。编译器优化等方法可以有效降低失效率;

*采用让读失效优先于写、写缓冲合并、请求字处理技术、非阻塞技术、多级技术等可以减少失效开销;

*采用减小上层存储容量、保持简单结构、访问流水化等技术可以减小命中时间。

二、存储虚拟化与地址映射

虚拟内存技术的最终目的是利用次级存储器(下层存储器,如硬盘)来扩展物理存储器(上层存储器,如内存)的容量。该机制掩盖了下层存储器的物理细节,向上提供了一个克服物理存储器和物理寻址方案局限性的地址空间和存储器存取方案。

分层存储系统使用虚拟存储器技术来实现相邻层之间的数据调度。其主要思想是将虚拟地址空间和物理地址空间分离,并通过虚拟管理单元(MMU使用地址映射表来完成两者之间的映射关系。

地址映射技术:分段+分页。

*分页技术:虚拟地址---物理地址

#页是信息的物理单位,与源程序的逻辑结构无关;

#页长由系统确定,大小固定,用户不可见;

#页面只能以页大小的整倍数地址开始,页一般不能共享。

*分段技术:逻辑地址---物理地址

#段是信息的逻辑单位,由源程序的逻辑结构所决定;

#段长由用户确定(用户可见),大小不固定;

#段可从任意地址开始,段内连续编址,段间不一定连续。

使用虚拟存储器的优点:

*可以简化寻址方式;

*可以高效利用物理存储器;

*便于访问控制。

三、现代操作系统的多层次存储体系

大多数现代计算机采用三级存储系统:cache + 主(内)存 辅(外)存。这种结构由以下两个主要部分组成。

 

(1)、Cache存储器系统(Cache-主存层次)

从整体上看,Cache存储器系统的存取速度接近于Cache的存取速度,而容量和每位存储的平均价格却接近于主存。Cache存储器系统主要负责解决高速度和低成本之间的矛盾。

(2)、虚拟存储器系统(主存-辅存层次)

从整体上看,主存-辅存层次的存取速度接近于主存的存取速度,而容量和每位存储的平均价格却接近于辅存。虚拟存储器系统主要负责解决大容量和低成本之间的矛盾。

======>>>>四级存储结构:


寄存器(CPU内部高速电子线路(如触发器)) 

+ 

Cache(一级:在CPU内部;二级:在CPU外部。一般为SRAM。) 

+ 

主存(一般为半导体存储器,也称为短期存储器;解决读写速度问题)

+  

辅存(包括磁盘(中期存储器)、磁带、光盘(长期存储)等;解决存储容量问题)

1、寄存器组

*特点:读写速度快但数量较少;其数量、长度以及使用方法会影响指令集的设计;

*组成:一组彼此独立的Reg,或小规模半导体存储器;

*对于RISC:设置较多Reg,并依靠编译器来使其使用最大化。

2Cache

*高速小容量(几十千到几兆字节)

*借助硬件管理对程序员透明;

*命中率与失效率。

3、主(内)存

*编址方式:字节编址;

*信息存放方式:大/小端系统、对齐方式。

4、辅(外)存

*信息以文件(file)的形式存放,按块为单位进行存取;

*虚拟存储技术。

目录
相关文章
|
4月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
276 14
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
339 0
|
15天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
30 1
|
19天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
24天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
29天前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
37 4
|
27天前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
49 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
30天前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
1月前
|
存储
整型在内存中的存储
本文详细解释了计算机中整型数据的三种二进制表示方法:原码、反码和补码,并展示了如何将正数和负数的原码转换为反码和补码。
35 0