到目前为止,在对系统的研究中,我们依赖于一个简单的计算机系统模型,CPU执行指令,而存储器系统为CPU存放指令和数据在简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置虽然迄今为止这都是一个有效的模型,但是它没有反映现代系统实际工作的方式,现在小编就来说说关于常规存储器和虚拟存储器?下面内容希望能帮助到你,我们来一起看看吧!

常规存储器和虚拟存储器(存储器层次结构)

常规存储器和虚拟存储器

到目前为止,在对系统的研究中,我们依赖于一个简单的计算机系统模型,CPU执行指令,而存储器系统为CPU存放指令和数据。在简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置。虽然迄今为止这都是一个有效的模型,但是它没有反映现代系统实际工作的方式。

实际上,存储器系统(memory system)是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU寄存器保存着最常用的数据。靠近CPU的小的、快速的高速缓存存储器(cache memory)作为一部分存储在相对慢速的主存储器(main memory,简称主存)中的数据和指令的缓冲区域。主存暂时存放存储在容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。

存储器层次结构是可行的,这是因为与下一个更低层次的存储设备相比来说,一个编写良好的程序倾向于更频繁地访问某一个层次上的存储设备。所以,下一层的存储设备可以更慢速一点,也因此可以更大,每个位更便宜。整体效果是一个大的存储器池,其成本与层次结构底层最便宜的存储设备相当,但是却以接近于层次结构顶部存储设备的高速率向程序提供数据。

作为一个程序员,你需要理解存储器层次结构,因为它对应用程序的性能有着巨大的影响。如果你的程序需要的数据是存储在CPU寄存器中的,那么在指令的执行期间,在零个周期内就能访问到它们。如果存储在高速缓存中,需要1~30个周期。如果存储在主存中,需要50~200个周期。而如果存储在磁盘上,需要大约几千万个周期!

这里就是计算机系统中一个基本而持久的思想:如果你理解了系统是如何将数据在存储器层次结构中上上下下移动的,那么你就可以编写你的应用程序,使得它们的数据项存储在层次结构中较高的地方,在那里CPU能更快地访问到它们。

这个思想围绕着计算机程序的一个称为局部性(locality)的基本属性。具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合,或是倾向于访问邻近的数据项集合。具有良好局部性的程序比局部性差的程序更多地倾向于从存储器层次结构中较高层次处访问数据项,因此运行得更快。例如,不同的矩阵乘法核心程序执行相同数量的算术操作,但是有不同程度的局部性,它们的运行时间可以相差20倍!

在本章中,我们会看看基本的存储技术(SRAM存储器、DRAM存储器、ROM存储器和旋转的和固态的硬盘)并描述它们是如何被组织成层次结构的。特别地,我们将注意力集中在高速缓存存储器上,它是作为CPU和主存之间的缓存区域,因为它们对应用程序性能的影响最大。我们向你展示如何分析C程序的局部性,而且我们还介绍改进你的程序中局部性的技术你还会学到一种描绘某台机器上存储器层次结构的性能的有趣方法,称为“存储器山”(memory mountain),它给出的读访问时间是局部性的一个函数。

6.1 存储技术

计算机技术的成功很大程度上源自于存储技术的巨大进步。早期的计算机只有几千字节的随机访问存储器。最早的IBM PC甚至没有硬盘。1982年引入的IBM PC-XT有10M字节的磁盘,到2010年,主流机器已有150000倍于PC-XT的磁盘存储,而且磁盘的容量以每两年加倍的度增长。

6.1.1随机访问存储器

随机访问存储器(Random-Acces Memory,RAM)分为两类:静态的和动态的。静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多。SRAM用来作为高速缓存存储器,既可以在CPU芯片上,也可以在片下。DRAM用来作为主存以及图形系统的帧缓冲区,典型地,一个桌面系统的SRAM不会超过几兆字节,是DRAM却有几百或几千兆字节。

1.静态RAM

SRAM将每个位存储在一个双稳态的(bistable)存储器单元里。每个单元是用一个六晶体管电路来实现的。这个电路有这样一个属性,它可以无限期地保持在两个不同的电压配置(confguration)或状态(state)之一。其他任何状态都是不稳定的———从不稳定状态开始,电路会迅速地转移到两个稳定状态中的一个。这样一个存储器单元类似于图6-1中画出的倒转的钟摆。

当钟摆倾斜到最左边或最右边时,它是稳定的。在其他任何位置,钟摆都会倒向一边或另一边。原则上,钟摆也能在垂直的位置无限期地保持平衡,但是这个状态是亚稳态的(metastable)——最细微的扰动也能使它倒下,而且—日倒下就水元不会再恢复到垂直的位置。

由于SRAM存储器单元的双稳态特性,只要有电,它就会永远地保持它的值。即使有干扰,例如电子噪音,来扰乱电压,当干扰消除时,电路就会恢复到稳定值。

倒转的钟摆

2.动态RAM

DRAM将每个位存储为对一个电容的充电。这个电容非常小,通常只有大约30毫微微法拉

tamtofarad)——30×10-15法拉。不过,回想一下法拉是一个非常大的计量单位。DRAM存储可以制造得非常密集——每个单元由一个电容和一个访问晶体管组成。但是,与SRAM不同,DRAM存储器单元对干扰非常敏感。当电容的电压被扰乱之后,它就永远不会恢复了。暴露在光线下会导致电容电压改变。实际上,数码照相机和摄像机中的传感器本质上就是DRAM单元的库列。

很多原因会导致漏电,使得DRAM单元在10~100毫秒时间内失去电荷。幸运的是,计算机运行的时钟周期是以纳秒来衡量的,这个保持时间相当地长。存储器系统必须周期性地通过读出,然后重写来刷新存储器的每一位。有些系统也使用纠错码,其中计算机的字会被多编码几个位(例如,32位的字可能用38位来编码),这样一来,电路可以发现并纠正一个字中任何单个的错误位。

图6-2 总结了SRAM和DRAM存储器的特性。只要有供电,SRAM就会保持不变。与DRAM不同,它不需要刷新。SRAM的存取比DRAM快。SRAM对诸如光和电噪声这样的干扰不敏感,代价是SRAM单元比DRAM单元使用更多的晶体管,因而密集度低,而且更贵,功耗更大。

DRAM和SRAM存储器的特性

3.传统的DRAM

DRAM芯片中的单元(位)被分成d个超单元(supercell),每个超单元都由w个DRAM单元组成。一个dxw的DRAM总共存储了dw位信息。超单元被组织成一个r行c列的长方形阵列,这里rc=d。每个超单元有形如(i,j)的地址,这里i表示行,而j表示列。

例如,图6-3展示的是一个16×8的DRAM芯片的组织,有d=16个超单元,每个超单元有w=8位,r=4行,c=4列。带阴影的方框表示地址(2,1)处的超单元。信息通过称为引脚(pin)的外部连接器流人和流出芯片。每个引脚携带一个1位的信号。图6-3给出了两组引脚:8个data引脚,它们能传送一个字节到芯片或从芯片传出一个字节,以及2个addr引脚,它们携带2位的行和列超单元地址。其他携带控制信息的引脚没有显示出来。

一个128位16*8的DRAM芯片高级视图

旁注:关于术语的注释

存储领域从来没有为DRAM的阵列元素确定一个标准的名字。计算机构架师倾向于称之为“单元”(cell),使这个术语具有DRAM存储单元之意。电路设计者倾向于称之为“字”(word),使之具有主存一个字之意。为了避免混淆,我们采用了无歧义的术语“超单元”(supercell)。

每个DRAM芯片被连接到某个称为存储控制器的电路,这个电路可以一次传送w位到每个DRAM芯片或一次从每个DRAM芯片传出w位。为了读出超单元(i,j)的内容,存储控制器将行地址i发送到DRAM,然后是列地址j。DRAM把超单元(i,)的内容发回给控制器作为响应。行地址i称为RAS(Row Access Strobe,行访问选通脉冲)请求。列地址称为CAS(ColumnAccess Strobe,列访问选通脉冲)请求。注意RAS和CAS请求共享相同的DRAM地址引脚。

例如,要从图6-3中16×8的DRAM中读出超单元(2,1),存储控制器发送行地址2,如图6-4a所示。DRAM的响应是将行2的整个内容都拷贝到一个内部行缓冲区。接下来,存储控制器发送列地址1,如图6-4b所示。DRAM的响应是从行缓冲区拷贝出超单元(2,1)中的8位,并把它们发送到存储控制器。

电路设计者将DRAM组织成二维阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。例如,如果示例的128位DRAM被组织成一个16个超单元的线性数组,地址为0~15,那么芯片会需要4个地址引脚而不是2个。二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。

读一个DRAM超单元的内容

4.存储器模块

DRAM芯片包装在存储器模块(memory module)中,它是插到主板的扩展槽上的。常见的包装包括168个引脚的双列直插存储器模块(Dual Inline Memory Module,DIMM),它以64位为块传送数据到存储控制器和从存储控制器传出数据,还包括72个引脚的单列直插存储器模块(Single Inline Memory Module,SIMM),它以32位为块传送数据。

图6-5展示了一个存储器模块的基本思想。示例模块用8个64Mbit的8M×8的DRAM芯片,总共存储64MB(兆字节),这8个芯片编号为0~7。每个超单元存储主存的一个字节,而用相应超单元地址为(i,j)的8个超单元来表示主存中字节地址A处的64位双字。在图6-5中示例中,DRAM0存储第一个(低位)字节,DRAM1存储下一个字节,依此类推。

要取出存储器地址A处的一个64位双字,存储控制器将A转换成一个超单元地址(i,),并将它发送到存储器模块,然后存储器模块再将i和j广播到每个DRAM。作为响应,每个DRAM输出它的(i,)超单元的8位内容。模块中的电路收集这些输出,并把它们合并成一个64位双字,再返回给存储控制器。

通过将多个存储器模块连接到存储控制器,能够聚合主存。在这种情况下,当控制器收到一个地址A时,控制器选择包含A的模块k,将A转换成它的(i,j)的形式,并将(i.j)发送到模块k。

6.非易失性存储器

如果断电,DRAM和SRAM会丢失它们的信息,从这个意义上说,它们是易失的(volatile)。另一方面,非易失性存储器(nonvolatile memoy)即使是在关电后,也仍然保存着它们的信息。在有很多种非易失性存储器。由于历史原因,虽然ROM中有的类型既可以读也可以写,但是它们整体上都称为只读存储器(Read-Only Memory,ROM)。ROM是以它们能够被重编程(写)的次数和对它们进行重编程所用的机制来区分的。

PROM(Programmable ROM,可编程ROM)只能被编程一次。PROM的每个存储器单元有一种熔丝(fuse),它只能用高电流熔断一次。

可擦写可编程ROM(Erasable Programmable ROM,EPROM)有一个透明的石英窗口,允许光到达存储单元。紫外线光照射过窗口,EPROM单元就被清除为0。对EPROM编程是通过使用一种把1写入EPROM的特殊设备来完成的。EPROM能够被擦除和重编程的次数的数量级可达1000次,但是它不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程。EEPROM能够被编程的次数的数量级可以达到10的5次方次。

闪存(flsh memory)是一类非易失性存储器,基于EEPROM,它已经成为了一种重要的存储技术。闪存到处都是,为大量的电子设备提供快速而持久的非易失性存储,包括数码相机、手机、音乐播放器、PDA和笔记本、台式机以及服务器计算机系统。在6.1.3节中,我们会仔细研究一种新型的基于闪存的磁盘驱动器,称为固态硬盘(Solid State Disk,SSD),它能提供相对于传统旋转磁盘更快速、更强健和更低能耗的选择。

存储在ROM设备中的程序通常称为固件(firmware)。当一个计算机系统通电以后,它会运行存储在ROM中的固件。一些系统在固件中提供了少量基本的输入和输出函数——例如,PC的BIOS(基本输入/输出系统)例程。复杂的设备,像图形卡和磁盘驱动控制器,也依赖固件翻译来自CPU的I/O(输入/输出)请求。

7.访问主存

数据流通过称为总线(bus)的共享电子电路在处理器和DRAM主存之间来来回回。每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事务(bustransaction)。读事务(read transaction)从主存传送数据到CPU。写事务(write transaction)从总线是一组并行的导线,能携带址址、数据和控制信号。取决于总线的设计,数据和地址信CPU传送数据到主存。

总线是一组并行的导线,能够带地址、数据和控制信号。取决于总线的设计,数据和地址信号可以共享同一组导线,也可以使用不同的。同时,两个以上的设备也能共享同一根总线。控制线携带的信号会同步事务,并标识出当前正在被执行的事务的类型。例如,当前关注的这个事务是到主存的吗?还是到诸如磁盘控制器这样的其他I/O设备?这个事务是读还是写?总线上的信息是地址还是数据项?

图6-6展示了一个示例计算机系统的配置。主要部件是CPU芯片、我们将称为I/O桥(I/O bridge)的芯片组(其中包括存储控制器),以及组成主存的DRAM存储器模块。这些部件由一对总线连接起来,其中一条总线是系统总线(system bus),它连接CPU和I/O桥,另一条总线是存储器总线(memory bus),它连接I/O桥和主存。

I/O桥将系统总线的电子信号翻译成存储器总线的电子信号。正如我们看到的那样,I/O桥也将系统总线和存储器总线连接到I/O总线,像磁盘和图形卡这样的I/O设备共享I/O总线。不过现在,我们将注意力集中在存储器总线上。

典型的连接CPU和主存的总线结构

6.1.2磁盘存储

磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可以达到几百到几千千兆字节,而基于RAM的存储器只能有几百或几千兆字节。不过,从磁盘上读信息的时间为毫秒级,

从DRAM读比从磁盘读快10万倍,从SRAM读比从磁盘读快100万倍。

1.磁盘构造

磁盘是由盘片(platter)构成的。每个盘片有两面或者称为表面(surface),表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴(spindle),它使得盘片以固定的旋转速率(rotational rate)旅转,通常是5400~15 000转每分钟(Revolution Per Minute,RPM)。/磁盘通常包含一个或多个这样的盘片,并封装在一个密封的容器内。

图6-9a展示了一个典型的磁盘表面的结构。每个表面是由一组称为磁道(track)的同心圆组成的。每个磁道被划分为一组扇区(sector)。每个扇区包含相等数量的数据位(通常是512字节),这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙(gap)分隔开,这些间隙中不存储数据位。间隙存储用来标识扇区的格式化位。

磁盘是由一个或多个叠放在一起的盘片组成的,它们被封装在一个密封的包装里,如图6-9b所示。整个装置通常称为磁盘驱动器(disk drive),我们通常简称为磁盘(disk)。有时,我们会称磁盘为旋转磁盘(rotating disk),以使之区别于基于闪存的国态硬盘(SSD),SSD是没有移动的部分的。

磁盘构造

4.连接到I/O设备

像图形卡、监视器、鼠标、键盘和磁盘这样的输入/输出(I/O)设备,都是通过VO总线,例如Intel的外围设备互连(Peripheral Component Interconnect,PCI)总线连接到CPU和主存的系统总线和存储器总线是与CPU相关的,与它们不同,诸如PCI这样的I/O总线设计成与底层CPU无关。例如,PC和Mac都可以使用PCI总线。图6-11展示了一个典型的I/O总线结构(以PCI为模型),它连接了CPU、主存和I/O设备。

虽然I/O总线比系统总线和存储器总线慢,但是它可以容纳种类繁多的第三方I/O设备。例如,在图6-11中,有三个不同类型的设备连接到总线。

·通用串行总线(Universal Serial Bus,USB)控制器是一个连接到USB总线的设备的中转机构,USB总线是一个广泛使用的标准,连接各种外围I/O设备,包括键盘、鼠标、调制解调器、数码相机、游戏操纵杆、打印机、外部磁盘驱动器和固态硬盘。USB2.0总线的最大带宽为60MB/s。USB3.0总线的最大带宽为600MB/s。

·图形卡(或适配器)包含硬件和软件逻辑,它们负责代表CPU在显示器上画像素。

·主机总线适配器将一个或多个磁盘连接到I/O总线,使用的是一个特别的主机总线接口定义的通信协议。两个最常用的这样的磁盘接口是SCSI(读作“scuzzy”)和SATA(读作“satuh”)。SCSI磁盘通常比SATA驱动器更快但是也更贵。SCSI主机总线适配器(通常称为SCSI控制器)可以支持多个磁盘驱动器,与SATA适配器不同,它只能支持一个驱动器。其他的设备,例如网络适配器,可以通过将适配器插入到主板上空的扩展槽中,从而连接到/O总线,这些插槽提供了到总线的直接电路连接。

总线结构示例,它连接CPU、主存和I/O设备

5.访问磁盘

虽然详细描述IO设备是如何工作的以及如何对它们进行编程超出了我们讨论的范围,但是我们可以给你一个概要的描述。例如,图6-12总结了当CPU从磁盘读数据时发生的步骤。

CPU使用一种称为存储器映射I/O(memory-mapped I/O)的技术来向VO设备发出命令(见图6-12a)。在使用存储器映射I/O的系统中,地址空间中有一块地址是为与VO设备通信保留的,每个这样的地址称为一个IV/O端口(IV/Oport)。当一个设备连接到总线时,它与一个或多个端口相关联(或它被映射到一个或多个端口)。

读一个磁盘扇区

6.1.3固态硬盘

固态硬盘(Solid State Disk,SSD)是一种基于闪存的存储技术(参见6.1.1节),在某些情况下是传统旋转磁盘的极有吸引力的替代产品。图6-15展示了它的基本思想。SSD包插到IO总线上标准硬盘插槽(通常是USB或SATA)中,行为就和其他硬盘一样,处理来自CPU的读写逻辑磁盘块的请求。一个SSD包由一个或多个闪存芯片和闪存翻译层(flash translation layer)组成,闪存芯片替代传统旋转磁盘中的机械驱动器,而闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问。

一个典型的固态硬盘的性能特性

SSD有着与旋转磁盘不同的性能特性。如图6-16所示,顺序读和写(CPU按顺序访问逻辑磁盘块)性能相当,顺序读比顺序写稍微快一点。不过,当按照随机顺序访问逻辑块时,写比读慢一个数量级。

随机读和写的性能差别是由底层闪存基本属性决定的。如图6-15所示,一个闪存由B个块的序列组成,每个块由P页组成。通常,页的大小是512~4KB,块是由32~128页组成的,快的大小为16~512KB。数据是以页为单位读写的。只有在一页所属的块整个枚接除之后,才能写这一页(通常是指该块中的所有位都被设置为1)。不过,一且一个块被接除了,块中每个页都可以不需要再进行擦除就写一次。在大约进行100000次重复写之后,块就会磨拐坏。一旦一个块磨损坏之后,就不能再使用了。

随机写很慢,有两个原因。首先,擦除块需要相对较长的时间,Ims级的,比访问页所需时间要高一个多数量级。其次,如果写操作试图修改一个包含已经有数据(也就是不全为1)的页p.那么这个块中所有带有用数据的页都必须被拷贝到一个新(擦除过的)块,然后才能进行对页p的写。制造商在已经闪存翻译层中实现了复杂的逻辑,试图抵消擦写块的高昂代价,最小化内部写的次数,但是随机写的性能不太可能能够和读一样好。

比起旋转磁盘,SSD有很多优点。它们由半导体存储器构成,没有移动的部件,因而随机访时间比旋转磁盘要快,能耗更低,同时也更结实。不过,也有一些缺点。首先,因为反复写之后闪存块会磨损,所以SSD也容易磨损。闪存翻译层中的平均磨损(wear leveling)逻辑试图通过将擦除平均分布在所有的块上来最大化每个块的寿命,但是最基本的限制还是没变。其次,SSD每字节比旋转磁盘贵大约100倍,因此常用的存储容量是旋转磁盘的1%。不过,随着SSD变得越来越受欢迎,它的价格下降得非常快,而两者的价格差也在减少。

在移动音乐设备中,SSD已经完全取代了旋转磁盘,在笔记本电脑中也越来越多地作为硬盘的替代品,甚至在台式机和服务器中也开始出现了。虽然旋转磁盘还是会继续存在,但是显然,SSD是一项重要的新的存储技术。

练习题6.6

正如我们已经看到的,SSD的一个潜在的缺陷是底层闪存会磨损。例如,一个主要的制造商保证他们的SSD能够经得起1PB(1015字节)的随机写。给定这样的假设,根据下面的工作负载,估计图6-16中的SSD的寿命(以年为单位):

A.顺序写的最糟情况:以170MB/s(该设备的平均顺序写吞吐量)的速度持续地写SSD。

B.随机写的最糟情况:以14MB/s(该设备的平均随机写吞吐量)的速度持续地写SSD。

C.平均情况:以20GB/天(某些计算机制造商在他们的移动计算机工作负载模拟测试中假设的平均每天写速率)的速度写SSD。

6.1.4存储技术趋势

从我们对存储技术的讨论中,可以总结出几个很重要的思想。

不同的存储技术有不同的价格和性能折中,SRAM比DRAM快一点,而DRAM比磁盘要快很多。另一方面,快速存储总是比慢速存储要贵的。SRAM每字节的造价比DRAM高,DRAM的造价又比磁盘高得多。SSD位于DRAM和旋转磁盘之间。

不同存储技术的价格和性能属性以截然不同的速率变化着。图6-17总结了从1980年以来的存储技术的价格和性能属性,最早的PC是在那一年提出的。这些数字是从以前的贸易杂志中和Web上挑选出来的。虽然它们是从非正式的调查中得到的,但是这些数字还是能揭示出一些有趣的趋势的。

自从1980年以来,SRAM技术的成本和性能基本上是以相同的速度改善的。访问时间下降了大约200倍,而每兆字节的成本下降了300倍(见图6-17a)。不过,DRAM和磁盘的变化趋势更大,而且更不一致。DRAM每兆字节的成本下降了130000倍(超过了五个数量级),而DRAM的访问时间只下降了大约10倍(见图6-17b)。磁盘技术有和DRAM相同的趋势,甚至变化更大。从1980年以来,磁盘存储的每兆字节成本暴跌了1000000倍(超过了六个数量级),但是访问时间提高得很慢,只有30倍左右(见图6-15c)。这些惊人的长期趋势突出了存储器和磁盘技术的一个基本事实:增加密度(从而降低成本)比降低访问时间更容易。

DRAM和磁盘的性能滞后于CPU的性能。正如我们在图6-17d中看到的那样,从1980年到2010年,CPU周期时间提高了2500倍。如果我们看有效周期时间(effective cycle time)定义为一个单独的CPU(处理器)的周期时间除以它的处理器核数,那么从1980年到2010年的提高还要大一些,为10000倍。CPU性能曲线在2003年附近的突然变化反映的是多核处理器的出现(参见后面的解释),在这个分割点之后,单个核的周期时间实际上增加了一点点,然后又开始下降,不过比以前的速度要慢一些。

注意,虽然SRAM的性能滞后于CPU的性能,但是SRAM的性能还是在保持增长。然而,DRAM和磁盘性能与CPU性能之间的差距实际上是在加大的。直到2003年左右多核处理器的出现,这个性能差距都是延迟的一个函数,DRAM和磁盘的访问时间比单个处理器的周期时间提高得更慢。不过,随着多核的出现,这个性能越来越成为了一个吞吐量的函数,多个处理器核并发地向DRAM和磁盘发请求。

图6-18清楚地表面了各种趋势,以半对数为比例(semi-log scale),画出了图6-17中的访问时间和周期时间。

存储与处理器技术发展趋势