csapp读书笔记---第六章之存储技术

随机访问存储器(Random-Access Memory,RAM)分为两类:静态和动态的。
静态RAM
SRAM将每个位存储在一个双稳态的存储器单元里。每个单元是是用一个六晶体管电路来实现的。它可以无限期地保持在两个不同的电压状态之一。其他任何状态都是不稳定的--位于不稳定状态是,电路会迅速地转移到两个稳定状态之一。由于SRAM存储器单元的双稳态特性,只要有电,就保持值不变。若有干扰,例如电子噪音,扰乱电压,但干扰消除时,电路会恢复到稳定值。
动态RAM
DRAM将每个位存储为对一个电容的充电。这个电容非常小,通常只有大约30x10负15次方法拉。DRAM存储器可以制造的非常密集--每个单元有一个电容和一个访问晶体管组成。DRAM存储单元对干扰非常敏感。当电容的电压被扰乱后,就永远不会恢复了。暴露在光线下会导致电容电压改变。DRAM单元在10-100毫秒时间失去电荷。计算机运行的时钟周期以纳秒衡量。存储器系统必须周期性的通过读出,然后重写来刷新存储器的每一位。

DRAM选中矩阵中的一个supercell时的过程:(通常每个超单元为一个字节)

电路设计者将DRAM组织成二维阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。其中的缺点是必须分两步发送地址,增加了访问时间。
72线的内存条又称为单列存储器模块SIMM
168个引脚的双列直插存储器模块DIMM,以64位为块传送数据到存储控制器和从存储控制器传出数据。
要取出存储器地址A处的一个64位双字,存储控制器将A转换成一个超单元地址(i,j),并发送到存储器模块(内存条),然后存储器模块再将i和j广播到每个DRAM。作为响应,每个DRAM输出它的(i,j)超单元的8位内容。模块中的电路收集这些输出,并把它们合并成一个64位双字,再返回给存储控制器。

DDR SDRAM 双倍数据速率同步DRAM。通过使用两个时钟沿作为控制信号,从而使DRAM的速度翻倍。不同类型的DDR SDRAM是提高有效带宽的很小的预取缓冲区的大小来划分的:DDR是2位,DDR2是4位,DDR3是8位,DDR4是16位。
8bit预取技术只能通过I/O控制器将等效频率提高为实际频率的4倍,而DDR技术再次翻倍才使最终等效频率达到核心频率的8倍。
8bit预取技术即是在I/O控制器发出请求信号之前,存储单元已经事先准备好了8bit的数据。为了实现这一原理,采用了并行转串行数据线的设计,即将多个存储单元构成矩阵,将数据经由统一双极型晶体管DQ总线发射。下图有助于说明。

可以形象理解为一个蓄水池里接了8根进水管,却只接了一根出水管,那么出水速度肯定是极快的。也就是说,对DDR3,存储单元的内部总线位宽:芯片位宽(即I/0控制器位宽)=8:1。这就像是硬盘的Raid阵列技术。
追问
就是说DDR之前是预取1比特,DDR预取2比特,DDR2预取4比特,DDR3预取8比特,这就好比一个人从仓库里拿东西,第一个人一次拿了一个出来,第二个一次拿了2个出来,第三个人一次拿了四个出来……但是都是1个小时拿出来100次(核心频率)第三个人可以把工作频率看作是100*4=400可以这样理解吗?
追答
老式SDRAM是没有预取技术的,从DDR1/2/3开始增加了2/4/8bit预取技术,对于DDR3,工作原理就是8数据线并联,8个电容构成矩阵,同时传输8bit数据到I/O控制器上,然后由I/O控制器统一发射。相当于把8个二进制数打包成一个数据包
追问
谢谢,非常好,如果是这样的话,那是不是也可以预取16比特,这样内存的速度不是就更高了吗?
追答
这需要对I/O控制器频率再次翻倍,并且扩大数据线,在I/O芯片频率已经很高的情况下,技术难度跟成本都会大幅增加;而就目前的内存带宽而言提升是微乎其微的,因此性价比极低。显存颗粒的GDDR4就采取了这一方案,然而遭到NVIDIA的反对因此没有普及,最终是GDDR5的双DQ总线方案得到推广。

非易失性存储器
如果断电,DRAM和SRAM会丢失它们的信息,它们是易失的(volatile)。另一方面,非易失性存储器即使断电也能保存它们的信息。ROM是以
1,它们能够被重编程(写)的次数
2,对它们进行重编程所用的机制
来区分。
a,PROM(Programmable Read-Only Memory)只能被变成一次。PROM的每个存储器单元有一种熔丝(fuse),它只能用高电流熔断一次。
b,可擦写可编程ROM(Erasable Programmable ROM,EPROM),有一个透明的石英窗口,允许光到达存储单元。紫外光线照射进窗口,存储单元被清除为0,。对EPROM编程通过使用一种把1写入EPROM的特殊设备来完成。EPROM能够被擦除和重编程的次数的数量级可以达到1000次。
c,电子可擦除PROM(Electrically Erasable Programmable ROM)EEPROM类似于EPROM,但是它不需要一个物理上独立的编程设备,因此可以直接在印刷电路卡上编程。EEPROM能够被编程的次数达100000次。
d,闪存(flash memory)是一类非易失性存储器,基于EEPROM,有一种新型的基于闪存的磁盘驱动器,称为固态硬盘(Solid State Disk,SSD)。
存储在ROM设备中的程序通常称为固件(Firmware)。当一个计算机系统通电后,他会运行存储在ROM中的固件。一些系统在固件中提供了少量基本的输入和输出函数--PC的BIOS例程。复杂的设备,像显卡和磁盘驱动控制器,也依赖固件翻译来自CPU的I/O请求。
一块电脑主板,以CPU插座为北的话,靠近CPU插座的一个起连接作用的芯片称为“北桥芯片”,英文名:North Bridge Chipset。北桥芯片就是主板上离CPU最近的芯片,这主要是考虑到北桥芯片与处理器之间的通信最密切,为了提高通信性能而缩短传输距离。
北桥被用来处理高速信号,通常处理CPU(处理器),RAM(内存),AGP端口或PCI Express,和南桥芯片之间的通信。
南桥芯片负责I/O总线之间的通信,如PCI总线、USB、LAN、ATA--IDE接口,也称之为ATA接口。ATA的英文拼写为“Advanced Technology Attachment”,含义是“高级技术附加装置”。2003年推出SATA(Serial ATA)后,原有的ATA改名为PATA(并行高技术配置,Parallel ATA)。

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

主要部件是CPU芯片,称为I/O桥的芯片组(其中包括存储控制器),以及组成主存的DRAM存储器模块(内存条)。这些部件由总线连接起来,其中一条总线是系统总线,它连接CPU和I/O桥,另一条总线是存储器总线,连接I/O桥和主存。
I/O桥将系统总线连接到I/O总线,例如磁盘和显卡这样的I/O设备共享I/O总线。
总线设计师计算机系统中一个复杂而且变化迅速地方面。Intel系统使用称为北桥和南桥的芯片组将CPU连接到存储器和I/O设备。而更新一些的Intel Core i7系统使用的是快速通道(QuickPath)互联。
例子:CPU执行 
movl A, %eax:
地址A的内容被加载到寄存器%eax中。CPU芯片上称为总线接口(bus interface)的电路发起总线上的读事务。读事务是由三个步骤组成的。
1,CPU将地址A放到系统总线上。I/O桥将信号传递到存储器总线。
2,主存感觉到存储器总线上的地址信号,从存储器总线读地址,从DRAM取出数据双字,并将数据写到存储器总线。I/O桥将存储器总线信号翻译成系统总线信号,然后沿着系统总线传递。
3,CPU感觉到系统总线上的数据,从总线上读数据,并将数据拷贝到寄存器%eax

磁盘存储
磁盘是用于保存大量数据的存储设备,数量级可达TB,二基于RAM的存储器只能几千MB左右。不过,从磁盘上读信息的时间为毫秒级,从DRAM读快10万倍,从SRAM读快100万倍。
磁盘是由一个或多个叠放一起的盘片组成,封装与一个装置,名为磁盘驱动器(disk driver),也称磁盘(disk)。
柱面:是所有盘片表面上到主轴中心的距离相等的磁道的集合。如图:

柱面k
柱面k就是六个磁道k的集合。
磁盘容量:磁盘上可以记录的最大位数,影响因素有:
1,记录密度(位/英寸):磁道一英寸的断中可以放入的位数。
2,磁道密度(recording density)(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数。
3,面密度(areal density)(位/平方英寸):记录密度与磁道密度的乘积。
抛开老式的设计方法,现在大容量磁盘使用一种称为多区记录(multiple zone recording)的技术,在这种技术中,柱面的集合被分割成不相交的子集合,称为记录区(recording zone)。每个区包含一组连续的柱面。:::一个记录区中的每个柱面中的每条磁道都有相同数量的扇区,这个扇区的数量是由3该区中最靠近中心的磁道所能包含的扇区数量确定的。软盘用的还是老式的方法。
磁盘容量=字节数/扇区 平均扇区数/磁道 磁道数/表面 表面数/盘片 盘片数/磁盘

磁盘操作:磁盘用读写头来读写存储在磁性表面的位。读写头连接一个传动臂一端(actuator arm)。沿着半径的方向移动(寻道seek),一旦读写头定位到了期望的磁道上,那么当磁道上的每个位通过它的下面是,读写头可以感知到这个位的值(读或写)。任何时候,所有的读写头都位于同一个柱面上:

磁盘以扇区大小的块来读写数据。对扇区的访问时间(access time)有三个主要部分: 寻道时间seek time,旋转时间rotational latency,和传送时间transfer time:
1,寻道时间:为了读取某个目标扇区的内容,传动臂先将读写头定位到包含目标扇区的磁道上。移动传动臂所需的时间称为寻道时间。。平均时间3~9ms,最坏20ms。
2,旋转时间:一旦读写头定位到了期望的磁道,驱动器等待目标的第一个问旋转到读写头下。最坏为8ms,平均4ms。
3,传送时间:当目标扇区的出传送时间的第一个位位于读写头下时,驱动器就可以开始读或者写改扇区的内容了。一个扇区的传送时间依赖于旋转速度和每条磁道的扇区数目。这个所需时间比上面的少两个数量级。
RPM =round per minute 每分钟多少转:

(这个公式的大概意思:访问一个扇区所需要的传送时间。)
举个栗子:

这个例子说明了:
1,访问一个磁盘扇区中512个字节的时间主要是寻道时间和旋转延迟。访问扇区中的第一个字节用了很长时间,但是访问剩下的字节几乎不用时间(零点零几毫秒)。
2,因为寻道时间和旋转延迟大致是相等的,所以将寻道时间乘2是估计磁盘访问时间的方法。
3,对存储在SRAN的双字访问时间大约是4ns,对DRAM的访问时间是60ns。因此,从存储器中都一个512字节扇区大小的块时间对SRAM约256ns,对DRAM约4000ns。磁盘访问时间约10ms,40000倍于SRAM,2500倍于DRAM。如果比较单字的间,几十甚至几百万倍了。
逻辑磁盘块:为了对操作系统隐藏磁盘的复杂性,旋转磁盘将它们的构造呈现成一个简单视图,一个B个扇区大小的逻辑块的序列,编号0,1,2,...,B-1。磁盘中有一个小的固件设备,称为磁盘控制器,维护着逻辑块号和实际磁盘扇区之间的映射关系。当操作系统读一个磁盘扇区的数据到主存,操作系统会发送一个命令到磁盘控制器,让他读摸个逻辑块号。控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面,磁道,扇区)的三元组,这个三元组唯一地标识了对应的物理扇区。控制器上的硬件解释这三元组,将读写头移动到适当的柱面,等待扇区移动到读写头下,将读写头感知的位放到控制器上的一个小缓冲区中,让后将他们拷贝到主存里。
连接到I/O设备
像显卡,监视器,鼠标,键盘和磁盘这样的输入/输出设备,都是通过I/O总线,例如Intel的外围设备互连(Peripheral Component Interconnect,PCI)总线连接到CPU和主存的。

虽然I/O总线比系统总线和存储器总线慢,但是它可以容纳种类繁多的第三方I/O设备。上图有三种不同类型的设备连接到总线:
1,通用串行总线(Universal Serial Bus, USB)控制器是一个连接到USB总线的设备的中转机构,USB总线是一个广泛使用的标准,连接各种外围I/O设备,包括键盘,鼠标,调制解调器,数码相机,外部磁盘驱动器和固态硬盘。USB 2.0总线的最大带宽是60MB/s,USB 3.0总线最大带宽600MB/s
2,图形适配器(显卡)包含硬件和软件逻辑,它们负责替CPU在显示器上话像素。
3,主机总线适配器将一个或多个磁盘连接到I/O总线,使用的是一个特别的主机总线接口定义的通信协议。两个最常用的磁盘接口是SCSI和SATA。SCSI磁盘比SATA驱动器快和贵。SCSI主机总线适配器可以支持多个磁盘驱动器,SATA适配器支持一个磁盘驱动器。主机总线适配器(Host Bus Adapter,HBA)是一个在服务器与存储装置之间提供输入/输出(I/O)处理和物理连接的集成电路适配器。因为HBA减轻了主处理器在数据存储和检索任务的负担,它能够提高服务器的性能。一个HBA和与之相连的磁盘子系统有时一起被称作一个磁盘通道。
4,其他的设备,例如网络适配器,可以通过将适配器插入到主板上空的扩展槽中,从未连接到I/O总线,这些插槽提供了到总线的直接电路连接。
访问磁盘
CPU从磁盘读数据时发生的步骤:CPU通过将命令,逻辑块号和目的存储器地址写到与磁盘相关联的存储器映射地址,发起一个磁盘读。如下图:

CPU使用一种称为存储器映射I/O(memory-mapped I/O)的技术向I/O设备发出命令。在使用存储器映射I/O系统中,地址空间中有一块地址是为与I/O设备通信保留的。每个这样的地址称为一个I/O端口(I/O Port)。当一个设备连接到总线时,他被映射到一个或多个端口。
举一个so easy的栗子:
已知条件如下:
1,设磁盘控制器被映射到端口0xa0
2,CPU通过执行三个对地址0xa0的存储指令,发起磁盘读。
a,第一条指令:发送一个命令字,告诉磁盘发起一个读,同时还发送了其他参数,如当读完成时,是否中断CPU。
b,第二条指令指明应该读的逻辑块号。
c,第三条指令指明应该存储磁盘扇区内容的主存地址。
当CPU发起了请求之后,在磁盘执行读的同时,它转去做其他工作。一个1GHz的处理器时钟周期为1ns,在用来读磁盘的16ms时间里,潜在地可能执行1600万条指令。磁盘控制器收到来自CPU的读命令后,它将逻辑块号翻译成一个扇区地址,读该扇区的内容,然后将这些内容直接传送到主存,不需要CPU的干涉。该设备可以自己执行读或者写总线事物,而不需要CPU干涉的过程,这个过程称为I直接存储器访问记(Direct Memory Access,DMA)。这种数据传送称为DMA传送(DMA transfer):

在DMA传送完成,磁盘扇区的内容被安全地存储在主存中以后,磁盘控制器通过给CPU发送一个中断信号来通知CPU,如图:

基本思想是中断会发送信号到CPU芯片的一个外部引脚上。迫使CPU暂停当前工作,跳转到操作系统例程。该程序会记录下I/O已经完成,然后将控制返回到CPU被中断的地方。

固态硬盘:Solid State Disk,SSD。是一种基于闪存的存储技术。一个SSD包由一个或多个闪存芯片和闪存翻译层(flash translation layer)组成。
固态与机械:
1,闪存芯片==传统旋转磁盘中的机械驱动器(寻道,感知位)
2,闪存翻译层是一个固件设备==磁盘控制器,对逻辑块的请求翻译成对底层物理设备的访问。

SSD顺序读和写性能差别不大。随机读比随机写快一个数量级。这是有底层闪存基本属性决定的。数据是以页为单位读写的。只有在一页所属的快整个被查出之后,才能写这一页(通常是指该块中的所有位都被设置为1)。不过,一旦一个块被查出了,块中每一个页都可以不需要再进行查出就写一次。大约10万次重复写之后,块就会磨损坏。
随机写慢的原因(300us=0.3ms):
1,擦除块需要相对较长的事件,1ms级的,比访问页所需时间要高一个多数量级。
2,如果写操作试图修改一个包含已经有数据(也就是不全为1)的页p,那么这个块中所有带有有用数据的页都必须被拷贝到一个新(擦除过的块)。然后才能进行对页P的写。
存储技术趋势
有几个重要思想:
1,不同的存储技术有不同的价格和性能折中。
2,不同存储技术的价格和性能属性以截然不同的速率变化着。增加密度(从而降低成本比降低访问时间更容易)
3,DRAM和磁盘的性能滞后于CPU的性能。有效周期时间(CPU处理器的周期时间除以CPU处理器的核数)。

你可能感兴趣的:(操作系统)