内存
对于内存已经不像曾经那般陌生了,在汇编中,我们大量接触了内存,但是我们还没有对它有个确切、深入的了解。
内存其实叫做随机访问存储器(RAM,Random Access Memory),最基本的存储单位称为单元,一个单元存储1bit。
内存可以分为两种:
- SRAM(Static RAM)
- DRAM(Dynamic RAM)
这两者根据存储单元实现方式来区分:
每个bit需要多少个晶体管 | 运行时间 | 是否需要刷新 | 是否需要通电 | 价格 | 应用 | |
---|---|---|---|---|---|---|
SRAM | 4或6 | 1X | 暴怒需要 | 可能要 | 100X | 高速缓存(Cache Mymories) |
DRAM | 1 | 10X | 需要 | 要 | 1X | 主存(Main Memories)、显卡的帧缓存(Frame Buffers) |
SRAM和DRAM都是易失的,即:断电后,会丢失所有保存的信息。
因此,除此之外,还有非易失性存储器(或者叫只读存储器,ROM),现如今的ROM还提供了擦除功能(以前的ROM没有提供),但是擦除会导致ROM的磨损。BIOS和开机后执行的最初的命令都来自于ROM,同时,I/O设备的控制器也是由存储在ROM中的指令和数据组成的。
磁盘
磁盘其实是由很多堆叠的盘片组成,这些盘片上涂油磁性材料,磁头组(也叫磁臂,也就是那个Arm)的末端有多个读/写头。
[!资料]
- 磁头组的末端有时并不是一个单独的读/写头(但是一般只有一个读读/写头),而是包含多个磁头的组合,每个磁头负责读取或写入一个磁道上的数据。这些磁头可以单独移动,以便定位到指定的磁道进行读写操作。
- 磁头组并非仅能感应磁场的变化,而是可以通过电流在磁性涂层上创建或改变磁场,从而实现数据的写入或擦除操作。读取数据时,磁头组则通过感应磁性涂层上磁场的变化来读取数据。
磁盘的容量由两个独立的因素决定:
- 记录密度:决定单独一个扇区可以存储多少bits
- 磁道密度:可以将相邻的磁道放置地多临近
这两个因素的乘积,称为面密度,它决定了整个磁盘的存储容量。磁盘的容量以GB为单位,但是需要注意,它的GB是2^10,这点有点奇怪。
在曾经,每一条磁道所包含的扇区数是固定的,这就意味着远离圆心的磁道的扇区之间的空隙会变的很大,因此会导致资源的浪费。
而现在使用了一些新的技术,更好的解决了这个问题,只是有点复杂。
那么,磁盘是如何工作的呢?
所有的盘片都以一个固定的频率在旋转(逆时针旋转),如进一个很典型的速率是7200转/分钟。
盘片
![[图片资源/盘片的结构.png]]
- 一个盘片有两个表面,上面和下面
- 每个表面都包含一系列的同心圆,称之为磁道
- 每个磁道包含很多个扇区,扇区存储着数据,典型的:一个扇区存储512字节
- 扇区之间有一些空隙,这些空隙不存储数据
磁盘阅读一个指定扇区需要多长时间?
- 移动磁头所需的寻道时间
- 等待磁盘移动到指定扇区所需的旋转延迟,平均情况下就是磁盘旋转一圈所花费时间的一半
- 传输时间:该轨道在读/写头下通过的时间
磁盘的使用
现代磁盘控制器将磁盘作为一系列逻辑块提供给CPU,每个块是扇区大小的整数倍,磁盘控制器会保持物理扇区和逻辑块之间的映射。
在最简单的情况下,一个逻辑块就是一个扇区。块从0开始进行编号,它是一系列增长的数字。
磁盘控制器会将一些柱面保留为备用柱面(柱面就是多个盘片上的同一个磁道所形成的圆柱体),这些备用柱面没有被映射为逻辑块。如果有一个柱面的扇区坏了,磁盘控制器可以将数据复制到备用柱面,然后磁盘就能够正常工作。
这就是磁盘的格式容量会比是实际容量小的原因。
I/O总线
通过这张图我们可以大概地了解到他们之间的工作方式。
读取磁盘上的数据
CPU通过编写三元组来读取磁盘上的数据:指令、逻辑块号、内存地址。
磁盘控制器读取和该逻辑块对应的任何扇区,它将数据复制,然后通过I/O总线传递给主存储器,然后使用中断机制通知CPU数据已被复制,然后CPU就能够执行程序处理这块内存。
固态磁盘(固态硬盘,SSDs)
固态硬盘中没有硬盘的机械结构,而是由许多的闪存和充当控制器的固件组成。但是在CPU看来,它和旋转磁盘完全相同,它具有相同的接口、相同的物理接口、相同的包装。
在固态磁盘中由一组固件,称为闪存翻译层,它的作用和旋转磁盘中的磁盘控制器功能相同,内存可以以页为单位来读取数据。一系列的页组成一个块(这个块和CPU眼中的逻辑块不同),当想要写入数据进固态硬盘的时候,需要找到一个被擦除的块才能够写入其中的页;如果我们想修改某一页的内容,需要将这页所处的块的内容全部复制。但是:擦除会使得闪存磨损。
程序的局部性
[!资料]
程序的局部性是指程序在执行过程中表现出的一种特性,即程序倾向于在一段时间内重复访问相同的内存位置,或者倾向于使用相同的指令序列。
局部性有两种:
- 时间局部性(Temporal Locality):这是指如果一个信息项被访问,那么它在不久的将来很可能再次被访问。例如,当程序执行时,它往往会重复执行相同的代码块,或者多次访问相同的变量。这种局部性使得缓存机制(如CPU缓存)能够有效地工作,因为常用的数据和指令可以被存储在速度较快的存储器中,以便快速访问。
- 空间局部性(Spatial Locality):这是指如果一个信息项被访问,那么与它相邻的信息项也很可能被访问。例如,当程序访问了一个数组元素时,它很可能在不久的将来访问同一个数组的其他元素。空间局部性也使得缓存有效,因为缓存行(cache line)中的多个数据项可以一次性加载到缓存中,而不是每次只加载一个。
这种特性是计算机科学中的一项重要原理,它有助于提高程序的效率和性能。
存储器层次结构
存储器层次结构中的每一层都包含从下一个较低级别层次所检索的数据。