计算机系统由 硬件 和 软件 组成,这篇文章主要简单介绍计算机的硬件系统。硬件系统由5大基础设备组成:运算器、控制器、存储器、输入设备、输出设备。
存储器作为系统五大基础部件,本文主要简单介绍一下存储的结构、类型。然后着重介绍现代CPU中都配备的高速缓存。
一个计算机系统中可能存在各种各样的存储器,有CPU内部的寄存器、CPU内的Cache,CPU外的Cache,主板上的主存(内存),主板外的磁盘存储器等等。它们之间通过适当的形式连接起来一起形成计算机的存储体系。其中Cache与主存之间的交互全由硬件实现,而主存与更低层级的交互通过软硬结合实现。如下图所示:
图片来自《计算机组成原理与体系结构》王庆荣, 北京交通大学出版社
存储器有很多种分类方式,都先简单的看一下。
这是一种按内容访问的存储器,其原理是把数据或其中的一部分作为关键字,按顺序写入信息,在读取时并行将该关键字与存储器中每个单元比较。非常适于信息的检索和更新。它比较特殊,因此单独介绍一下,有点类似于程序中的键值表。
其结构如下图所示:
其中,输入检索寄存器存放关键字;屏蔽寄存器屏蔽不参与检索的字段;比较器则是用关键字与存储体每一单元进行比较,为了提高速度,比较器数量应设置巨大,如果是位比较器则每位应设置一个,应有 2 m × N 2^m \times N 2m×N个,如果是字比较器则应有 2 m 2^m 2m个;匹配寄存器用于存放结果,应有 2 m 2^m 2m位大小,存放比较器比较的结果。
相联存储器主要用于高速缓冲存储器中,或用于虚拟存储器中。
位于CPU和主存之间的就是Cache,它主要用于存放最活跃的程序和数据,容量一般在几千字节到几兆字节之间,速度比内存快10倍左右。对程序员来说是不可见的。
Cache的部分用于存放内存中的内容的副本,控制部分会判断要访问的信息是否在Cache中,有则称作命中,直接对Cache寻址;若未命中则需要按照替换原则来替换Cache中的副本。
一般来说,现代CPU中的Cache对分为多级,常说的L1\L2\L3缓存就是多级的Cache缓存。通常,越靠近CPU的Cache速度越快,空间越小。在多级结构中,需要自低往高逐级访问,全都不命中时才会访问主存。
CPU工作室,给出的是主存单元的地址,如果需要对Cache中的数据进行读写,则需要一个方法来将主存地址映射为Cache地址,一般的有三种方法,一一简单介绍。
即主存的块与Cache块对应关系固定不可变,在这种映射方式下,只要主存地址中的区号和Cache中记录的区号相同,则表明Cache命中。
其优势在于地址映射十分简单,但缺点也同样明显,即不同区的同块号无法同时调入Cache中,即使此时Cache未满,同时,主存的块数只能是Cache块数的整数倍。其映射详看下图:
图片来自《计算机组成原理与体系结构》王庆荣, 北京交通大学出版社
在这种方式下,CPU访问主存地址需要主存块号M,块內字号W,但实际上,主存块号M会被拆分成标识号T及Cache块号C。
当主存被调入Cache中时,同时会将主存的标识号T存入Cache中。在需要访问主存时,会直接查看拆分后的Cache块号对应的Cache块中保存的标识号T是否与拆分后的标识号一致,若一致则代表命中。
图片来自《计算机组成原理与体系结构》王庆荣, 北京交通大学出版社
这里的T可能容易产生模糊,上面提到,主存被分解成N个区块,每个的大小都与Cache大小相当。因此这个T实际上就是用于标识当前该块映射的是主存中的哪一区块(注意区块与块的区别)。
主存与Cache均分成大小相同的块,这样映射就可以允许任意主存的块被放入Cache的任一块中,如下图:
图片来自《计算机组成原理与体系结构》王庆荣, 北京交通大学出版社
在这种方式下,CPU访问主存地址需要主存块号M,块内字号W。而访问Cache的地址需要Cache的块号C,块内的字号W。
实际上即主存块号和Cache块号需产生联系,在Cache中存在映射时需能访问。这就需要建立一个表,一般使用的方式即前面提到过的相联存储器。结构如下图:
图片来自《计算机组成原理与体系结构》王庆荣, 北京交通大学出版社
如:设主存为64MB,Cache为32KB,块的大小为4KB(块内地址需12位),因此主存分为64MB/4Kb = 16384块,其块号从0~16383,为了表示块号需14位,Cache分为8块,块号0~7,表示Cache块号需3位。
存放主存块号和Cache块号的相联存储器需要有和Cache块个数相同的单元,相联存储器中每个单元记录均主存块块号,表示该Cache块现为哪个主存块的映射。
在需要访问主存时查询相联存储器,若比较发现相联存储器单元中存放的主存块号与该操作访问的主存块号一致则代表Cache命中,直接访问Cache块。
以上两种方式的优缺点正好相反,而组相联是前两种方法的综合。因此绝大部分都使用这一方案。
它将Cache中的块再次分组,假定Cache共有16块,每两块为一组,则共分得8组。同样的将主存按每个区分为16块,其中也是每两块分为一组,也是共分得8组。
组相联的规定就在于,对于组采用的是直接映射,对于块采用全相联映射。也就是说,主存中任何分区的第N组同样只能放入Cache中第N组,但组内的任意一块都可以放入Cache中同一组的任意一块。
其映射结构如下图:
图片来自《计算机组成原理与体系结构》王庆荣, 北京交通大学出版社
替换算法的目标只有一点,使Cache有尽可能高的命中率,一般采用如下几种方式:
Cache的性能即计算机性能的重要组成部分,命中率是Cache非常重要的指标。其设计目标是在成本允许的前提下达到较高的命中率,使存储系统整体有最短的平均访问时间。
设 H C H_C HC为Cache命中率、 T C T_C TC为Cache存取时间、 T M T_M TM为主存的访问时间,则Cache存储器等效加权平均访问时间 T A T_A TA为: T A = H C T C + ( 1 − H C ) T M = T C + ( 1 − H C ) ( T M − T C ) T_A = H_C T_C + (1-H_C) T_M = T_C + (1-H_C) (T_M - T_C) TA=HCTC+(1−HC)TM=TC+(1−HC)(TM−TC)
上面假设的Cache访问和主存访问是同时启动的,其中 T C T_C TC为Cache命中时的访问时间, ( T M − T C ) (T_M - T_C) (TM−TC)为失效访问时间。如果Cache不命中时才启动主存则: T A = T C + ( 1 − H C ) T M T_A = T_C + (1-H_C) T_M TA=TC+(1−HC)TM
在指令流水线中,Cache是流水线中的一个操作阶段,因此降低Cache失效率是提高Cache性能的一个重要方法。
实际上,容量因素在Cache是失效中占较大比例,Cache容量越大命中率则越高,最终能使失效率收敛至接近0%,但是增加容量意味着成本和命中时间的上升。
除了增加容量外,还可以通过选择适当的块大小和提高相联度的方式。
以文件的形式存储暂时不用的程序和数据,CPU无法直接访问其中的数据,只有被调入主存后才可访问。一般外存储器主要为磁存储器和光存储器,但现在半导体存储器(固态硬盘)也开始流行。
现在磁存储器中普遍主要使用磁盘,它具有较大的存储容量,较好的速度。它由盘片、驱动器、控制器很接口组成。盘片用于存储信息;驱动器驱动磁头沿盘面径向运动寻找目标磁道及驱动盘片以额定速率稳定旋转,还控制数的写入和读出;控制器接受主机发来的命令,转换成磁盘驱动器的命令,实现主机与驱动器间的数据交换。一个控制器可以控制多个驱动器;接口则是主机与磁盘间的连接逻辑。
硬盘就是最常用的外存储器,一个硬盘内可装有多个盘片,组成盘片组,每个盘片配备独立的磁头。所有记录面上相同序号的磁道组成一个圆柱面,它的编号与磁道编号相同。通常文件存储在硬盘上会尽可能放在同一或相邻柱面上,可以缩短寻道的时间。Windows内置的碎片整理工具就是利用这个特性来优化文件的读取效率。
硬盘盘片会划分为多个同心圆,将其称为磁道(Track),由外往里编号,最外圈为0。沿径向单位距离的磁道数称为道密度,道密度单位为每英寸磁道数(TPI);将一个磁道沿圆周等分为若干段,每一段称为一个扇区(Sector) ,每个扇区内可存放一个固定长度的数据块;磁道上单位距离可以存放的数据位数称为位密度,单位为每英寸位数(BPI);因为每条磁道上的扇区数量是相同的,而每个扇区存放的数据块大小也是相同的,又因为外圈磁道比里圈磁道要长,因此里圈磁道的位密度要比外圈的高,最内圈的磁道位密度称为最大位密度。其结构如下图所示:
上图来自互联网
硬盘寻址信息由硬盘驱动号、圆柱面号、磁头号(记录面号)、数据块号(扇区号)及交换量组成。
硬盘的指标有两种:
采用聚焦激光在盘式介质上非接触的记录信息的存储器,根据性能和用途,光盘又分为只读光盘(CD-ROM)、只写一次光盘(WORM)及可擦写光盘。
只读型光盘和ROM一样,是厂家在生产时就用激光蚀刻上去的信息;而只写一次是由用户自己使用刻录机一次性写入的光盘。写入方法也是利用高能激光蚀刻盘面实现的。
光盘存储器的最大特点在于记录密度大、非接触式读写及寿命较长(10年以上),且其制造成本低廉。
固态硬盘是利用Flash或DRAM作为介质的存储设备,绝大部分固态硬盘是基于闪存实现的。固态硬盘由主控芯片、缓存芯片及闪存芯片组成。
主控芯片是固态硬盘的核心,其作用主要是合理分配各闪存的负荷,二则是负责数据中转,连接闪存芯片与外部的SATA接口。不同的主控芯片能力相差十分巨大,会直接导致产品在性能上的差距。
现今固态硬盘的接口规范、定义、功能和使用方法上与硬盘类似,具有机械硬盘不具备的读写速度、整体质量轻、能耗低等特点。但固态硬盘硬件一旦损坏,数据就难以恢复。
因为速度和安全性的需要,推出了磁盘阵列,它是由多个存储器共同组成的一个快速、大容量的子系统。现在最常用的磁盘阵列为独立冗余磁盘阵列(RAID, Redundant Array of Independent Disk),它曾经叫做廉价冗余磁盘阵列(RAID, Redundant Array of Inexpensive Disk)。
RAID有多种不同的阵列方式,见下表:
RAID级 | 说明 |
---|---|
RAID 0 | 该级别的阵列不具备容错能力,由N个磁盘组成,它的读写速度可达到单个磁盘的N倍,但其故障间隔时间仅有单个磁盘的1/N。 |
RAID 1 | 采用镜像容错,改善可靠性,两组磁盘间完全存放相同的内容,因此空间并不会因为磁盘数量增加而增加。 |
RAID 2 | 采用海明码进行磁盘错误检测的阵列。 |
RAID 3 | 减少用于校验的磁盘个数,提高阵列的有效容量,一般仅有一个磁盘用于校验。 |
RAID 4 | 可以单独对组内磁盘进行读写,一般也仅有一个磁盘用于校验。 |
RAID 5 | 是RAID 4的改进,它不用单独的磁盘校验,而是存放数据的同时也存放校验信息,解决多个磁盘同时争用单个校验盘的问题。 |
除了上面的说明,RAID还可以组合不同级别使用,如现在最常用的RAID10,即1和0的组合,即提升了速度又提升了可靠性。