存储系统的抽象概念
局部性引用
Locality of reference
计算机的一个原则:在程序执行期间,对存储器的访问往往会表现出一定的局部性特征。
时间局部性
Temporal Locality
如果一个数据项被访问,那么不久它很可能会再次被访问。通过利用该性质,可以将频繁使用的数据保留在更快的存储层次结构中,加快访问速度。
空间局部性
Spatial Locality
如果一个数据项被访问,那么与它相邻的数据项也很可能会被访问。程序中数据的顺序性、数组的连续存储和循环访问等特性导致了空间局部性。通过利用空间局部性,可以预取相邻的数据项,以提高缓存命中率和数据访问效率。
内存地址
CPU 访问内存时,必须向内存提供有效地址 (Effective Address, EA)
为了将内存分配给不同的程序,CPU 把内存地址分为若干段,每段有一些内存单元构成。
一个内存单元即一个字节单元,两个地址连续的内存单元可以存放一个字。这两个单元可以看作一个起始地址为 0 的字单元。
- 将起始地址为 的字单元简称为 地址字单元
- 0 地址单元中存放的字节型数据:20H
- 0 地址字单元中存放的字型数据:4E20H
地址由两部分组成
- 段地址(Segment address)指出是哪一段
- 偏移地址(Offset address)指出是段中的哪一个单元
* 16
相当于(二进制)左移 4 位
字节序
Endianness is the order of bytes of a word of digital data in computer memory.
字节顺序与存储地址顺序相对应的两种模式
但是不管是大端还是小端,数据一定是从内存的低地址依次向高地址读取和写入
假设要存一个数据
0x1234
(十六进制),其二进制表示为 0001 0010
0011 0100
大端序
big-endian
低地址存放高字节数
地址: 0x1000 | 0x1001
数据: 00010010 00110100
小端序
little-endian
低地址存储低字节数
地址: 0x1000 | 0x1001
数据: 00110100 00010010
内存构成
映射模式
🧐 如何将数据从主存复制到缓存中,并确定缓存中的数据与主存中的哪些数据对应?
直接映射
Direct Mapped Cache
在这种模式下,缓存被组织为存储单个主存页面的副本 (Organised to contain a copy of a single page of memory),即
- 缓存被划分为一系列的缓存行 (Cache Line,缓存中的最小存储单元),每个缓存行可以存储一个数据块片段
- 主存被划分为一系列的主存块,每个主存块的大小与缓存行相同,主存中的特定行始终映射到缓存中的同一行
例
80386 处理器有 32 位地址总线 和 32 位数据总线,即可访问 bytes 数据
- 缓存控制器将 4GB 的内存视为131072 个页面
- 缓存目录存储了每个缓存行的页面位置(主存)信息,称为标记(tag)
- 如果处理器在不同页面之间频繁切换,会导致缓存失效频繁,称为缓存抖动(Cache Thrashing),从而降低系统性能。
地址线的划分
- A15-A32:用于设置主存中的页面 (page)
- A5-A14:用于设置缓存中的块号 (block number)
- A2-A4:用于设置块中的行号 (line number)
- 每 4 字节称为一行
- A0-A1:用于设置行中的具体字节 (bytes)
双路组相联
Two-Way Set Associative Cache
缓存被分成多个组,每组可以容纳两个缓存行,每组中的两个数据块称为相联行 (Way)
- 如果其中一个缓存行的标记与标记位匹配,则发生了缓存命中,可从相应的缓存行读取数据。如果两个缓存行的标记都不匹配,则需要从主存中获取所需数据,并更新缓存行
- 这种方式可以快速在不同页面之间进行切换,减少 "thrashing" 的可能性
全相联缓存
Fully Associative Cache
缓存中的每个缓存行可以存储任意的主存块
- 与其他缓存映射方式不同,全相联缓存不需要特定的组索引或组的概念
- 每个缓存行都有一个标记位,用于标识所存储的主存块的地址
写入策略
直接内存访问
Direct Memory Access, DMA
在一般情况下,内存的访问需要 CPU 操作内存控制器。如果需要传输大量数据时,可以让 I/O 设备与计算机内存进行直接数据交换,无须 CPU 的介入。这种技术在帧捕获卡 (frame grabbers) 和声卡 (sound cards) 等设备上使用。
文本模式
Direct Access To Screen Memory
具体代码详见Lab5 Part2
在计算机系统中,文本屏幕是通过内存映射 (memory mapped) 的方式进行显示的,每个字符都对应着内存中的一个特定地址。对这些内存地址进行读写操作,可以直接实现对文本屏幕内容的显示和修改。
在能显示 80*25 个字符的文本屏幕中,内存地址按从左到右、从上到下的顺序连续排列。
屏幕上的每个字符位置由两个字节定义 (左上角字符位于内存地址 B8000,右边的下一个字符位于 B8002,依此类推,字符之间的地址增量为 2 个字节)
To locate the memory addresses for a specific character position (x,y) on screen you would need to do the following
- 第一个字节定义文本的位置 Character Address = 0x8000 + (2 * 80 * y)+ x
- 第二个字节定义文本外观 Attribute Address = 0x8000 + (2 * 80 * y)+ x +1
虚拟内存
Virtual Memory
主存储器是实际可用的物理内存大小,虚拟内存系统将外部存储器中的页面交换到主存储器中。
- 缺点是访问速度慢,可能会有高达100,000 个时钟周期的延迟。
- 在较早的系统中,虚拟内存的实现可能存在安全问题,导致敏感数据被泄露。