赞
踩
在一台计算机中,存储数据的元件可以从高到底分为CPU,Cache,主存,辅存和外存。其中,辅存和外存可以永久保存数据,但是缺点是要把数据从辅存导入的CPU速度比较慢,主存和Cache速度快,但是不能永久保存数据,而且它们的价格也是递减的,同样是1G的存储,主存要比辅存贵,辅存要比外存贵。所以可以买一个把平时不用,只是拿来收藏的数据保存在外存中。现在磁带和光盘已经被淘汰,常见的U盘30块钱可以买64G(当然1T的也要500多),250可以买一个8T的移动硬盘,以后还会更加便宜。而辅存要贵一些,一个宏基的1T固态硬盘某宝要339,但是m.2固态硬盘的读写速度已经可以到7GB每秒,可以达到主存五分之一了。主存的价格就更贵了,在淘宝搜索宏基的内存条,16GB需要700元和其他存储设备的差距不是一点半点。而Cache是和CPU绑定的,目前一个i5的CPU也需要1000多元,i9则需要3000元,同时Cache即便是i9也只有36MB直接比其他的低一个数量级。附上王道的PPT:
这里需要注意的是辅存和主存是通过操作系统和硬件完成数据交互的,而主存和Cache则只能通过硬件来完成操作,所以程序员不需要担心。
可以分为半导体存储器,磁表面存储器和光介质存储器三类。
如下图所示,可以分为四类。其中,除了相联存储器以外,其他的存储器都是按照地址寻找内容,只是寻找地址的方法不一样而以:RAM可以瞬间定位到要找的位置,但是SAM必须一点点挪过去,DAM可以瞬间定位到所需要的盘,但是盘上的具体位置也是需要一点点转过去的。CAM则可以直接根据内容寻址。
为什么ROM也可以读写呢,是因为现代计算机通常具有一种称为"闪存"的特殊类型的ROM,这种ROM可以被更新。闪存ROM是一种可以通过电子擦除和重新编程的技术来修改其存储内容的存储器。这就使得更新BIOS成为可能。当需要更新BIOS时,计算机系统会使用特定的软件工具将新版本的BIOS写入闪存ROM芯片中,以替换旧版本的BIOS。
看看就行:
(1)存储容量:存储字长x字长(比如64位机,128G的固态,就是
128
×
1024
128\times 1024
128×1024MBx64位bit)。
(2)单位成本:就是用总的容量/总的成本,算1MB或者1bit多少钱,也可以用总成本/总容量算一块钱能买多少MB。
(3)传输的速度:用机器字长(也叫数据宽度)/ 存储周期。
存储周期的定义如下:也就是单纯的读写完成以后,计算机还需要时间从I/O恢复到内存去。
传输的速度也叫主存带宽。
在上一节里面,相信大家已经学会了如何挑选一个需要的存储器,那么在这一小节之中,我们将学习一个存储器是怎么组成和工作的。
(1)存储体:用于存储01代码由多个存储单元构成,每一个存储单元又由多个存储元构成。一个存储元由一个电容加一个MOS管组成,构造如下:
mos管是一种特殊的半导体,如果电压大于一定值(通常是5V),它就是一个导体,小于5V它是绝缘体。因此,电压大于5V,电容会充电,小于5V电容不会充电,同样的,如果原本电容有电,通过施加-5V的电压就可以放电,这样就可以在保存完成后,更据内部的电容是否有电判断是0还是1,通常,后面可以接一个电流传感器来判断是否存电。把多个存储元串起来就形成了一个的存储单元,如下是两个8位的存储单元:
电流传感器就在每一个绿色的线的头部。这样多行存储单元就构成了一个存储体。因为你通电一次,必须读一整行,所以存储字长是最基本的单元。
(2)地址寄存器MAR:
MAR通过CPU发过来的地址信号,选择要读取哪个字(比如图上是0号位置),然后由译码器对对应位置通电。
(3)数据寄存器MDR:如图MAR通电以后电流传感器可以布置在MDR里面,让MDR来记录这个字的内容,通过数据总线发送到CPU。
(4)存储的总容量: 存储单元的字长(图上是8bit)x 存储单元的个数(图上MAR有3位所以有8个存储单元)。
(5)无论是MAR还是MDR,里面的信息一开始传进去总是会有些不稳定,所以需要等信号稳定之后才能确定信息无误,执行下一步操作。是否执行下一步操作是由片选线决定的,这个其实也是一个电压传感器,稳定了就施加高电平接通对应的线。
(6)片选线下面还有读写控制线,控制的是MDR里面数据当前是要被写入存储元还是要被读出,这可以是两根线也可以是一根线,读写控制线的不同会影响芯片引脚数目的不同。
下图就是一个完整的存储芯片了:
其中,译码驱动起到了把地址信号放大的作用,进一步保证信号稳定可靠。
这里可以看到,一个内存条上面其实有许多的存储芯片,片选线其实就是决定了当前哪个芯片工作,所以要把上面的芯片结构带入到内存条上的黑方块里面,现在的芯片越来越小,可能已经小到看不见,所以可以拆一下家里的老式电脑。
芯片上的金属引脚和上面结构图上的线是一一对应的,而且还会多上接地和供电的引脚,所以上面说的读写控制线是一根还是两根关系到了引脚多一个还是少一个。
(7)芯片容量的描述:MAR的容量xMDR容量。要注意的是,地址线的数目和存储单元的数目(MAR)之间的关系是这样的:一根线可以代表01,所以10K的存储单元,按照排列组合,是 2 10 2^{10} 210也就是10根地址线就可以表示。
如图所示,一个芯片可能只有1B也就是8位,但是作为32位机,我们一个字是32位,也就是需要4个芯片组成。这样的情况就需要把4个芯片列为一组地址,但是原本的芯片地址都是按照字节编码的,就是依次编码的,所以需要在寻址的时候把原本的字节地址进行转换,比如要找第一个位置,但是我们却是
2
2
2^2
22为一组,所以这个1需要被算术左移2位,变成100,正好对应第四个芯片,按半字寻址则是移动1位,按双字寻址则是移动3位,这里需要反复体会。
在上面我们介绍了存储器的工作原理,以及简单存储芯片示例图,但是其实存储芯片的种类是多种多样的,Cache,主存,辅存和外存里面的存储芯片都是不同的,我们接下来逐个介绍。
RAM其实就是上面说的支持随机存储的芯片,也就是你在读数据的时候,想定位到那里都可以瞬间定位,不需要一点点挪过去。但是RAM也分为两种,分别是静态的SRAM和动态的DRAM。
说起DRAM,其实它的原理在上面一节已经说过了,上面演示的就是DRAM芯片,它常用于主存中。
DRAM芯片的特点就是我们上面说过的,用电容的充电和放电来存储信息,这种存储信息的方法也被称为栅极电容存储信息法。因为电容放电之后就会没有电,所以这是一种破坏性读出,需要在读出之后进行一次重写操作(也被称为“再生”)。
同时,因为这个电容的电其实也不是永存的,只能维持2ms的时间,所以即便不断电,电容里面的信息也会在2ms后流失,所以每过两秒,必须刷新一次,也就是重新充电。每次刷新都要刷新一行存储单元,并且刷新是用特殊的硬件实现的(具体就是读出来然后再写进去),会占用一个读取周期,所以DRAM的读取更耗时间。刷新的方法分为以下几种,其中异步刷新原理就是在不用CPU的时间赶紧刷新,不影响正常使用,所以是最优方案:
刷新是由硬件自己控制的,不需要占用CPU指令,并且可以保证和系统的时钟周期同步(尽可能不占用CPU指令的时间,在不读指令的碎片时间刷新),所以DRAM全称其实是SDRAM,这里的S是Synchronous,也就是同步的意思,和SRAM的Static静态是不同的。
SRAM芯片主要用于Cache中,它使用双稳态触发器来存储信息。它的一个存储元如下:
双稳态的意思是,它用两种状态来表示0和1:
\hspace{5cm}
1:A高B低
\hspace{5cm}
0:A低B高
双稳态触发器可以保证读出数据之后不破坏其结构,是一种非破坏性的读取方式,无需重写,同时,因为不用到电容,所以只要在通电状态下,信息就不会流失,不需要刷新。
就是因为不需要重写,所以SRAM要比DRAM读写速度要快。这也是静态和非静态的区别所在:是否要动态地更改存储元中的数据。
从存储元的图上也可以看出,同样是使用MOS管,SRAM使用了6个,但是DRAM只用了1个,所以无论是从体积还是制作的成本还是复杂程度,DRAM都要优于SRAM,这也是为什么Cache那么贵容量还那么少的原因。
附上王道的两种芯片对比图:
最后必须说一下的就是SRAM不需要刷新,所以它和系统指令是异步的。
按照上面的简单布线方式,如果一个主存上有
2
20
2^{20}
220根线,那么就需要1M根线,所以现实中其实采用的是二维甚至是三维的排列方式,二维排列的例子如下:
通过二维排列,可以直接把线的数目开个根号,如果是三维就开三次根号。
使用二维排列的时候,MAR就被分成两部分,前半部分用于行译码,后半部分用于列译码,当一个存储单元的行和列都通电的时候才被选择,这样就可以精确地定位到任何需要的地址。
MAR的前半部分是行地址译码器,后半部分是列地址译码器。
图上也说明了二维排列之后,选通线数目的计算方法:开根号之后乘二。
即便这样,线还是很多,所以又推出了地址线复用技术:只需要
2
n
2
2^{\frac{n}{2}}
22n根地址线,每一次先传输行地址到行地址译码器,然后再传输列地址到列地址译码器。这样芯片的引脚也就不需要那么多了。但是SRAM本身的存储空间不大,也就是说地址线不多,同时需要快速的存取,所以SRAM不采用这种技术,只有DRAM采用。
ROM和RAM的不同之处在于,它断电以后的信息不会丢失,也就是不具有易失性。RO是read-only的意思,就是只读存储器,只读并不是说它只能读不能写,而是说在使用的时候,只有从中把数据读取到主存才能解析其数据的意思。分为以下几种:
掩码只读存储器MROM,它的特点是只能读不能写,里面的内容都是电脑厂家在生产的时候就写好的,不能够更改,同时生产的周期长,适合大批量的生产(因为做一个模板很难)。可以说是真正意思上的"只读"芯片。
可编程的存储器PROM是为了弥补MROM的缺点而产生的存储器,它一开始是空的,需要用户根据自身需要写入内容,但是它只能写一次,就是写错了也不能更改,写完了就变成只能读不能写的了(就和MROM一样了),所以算半个意思的“只读”存储器。
可擦除的只读存储器EPROM是PROM的更新产品,它可以用电子擦除技术把ROM上的内容清除,然后就允许用户重新写入,这个时候开始,ROM就不是只读的了。常见的EPROM可以分为下面几种:
UV(ultraviolet ravs)是紫外线的意思,所以紫外线EPROM的特点就是这种材料在被紫外线照射8分钟之后可以被擦除所有的信息。缺点就是不能控制擦掉哪些,是全部都擦。
第一个E是电子的意思(electrically),故名思意,它擦除数据用的是电流,并且可以精确到固定的字。
上面提到的几种ROM已经逐渐被淘汰了,下面介绍的才是当今使用中的。
闪存Flash,全称是闪速存储器,它在EEPROM的基础上发展而来(也是电擦数据),具有更快的速度,支持多次快速地擦除重写(虽然如此,但是因为写要先擦再写,所以写还是要比读更慢点)。当前的U盘,手机的SD内存卡都是Flash。计算中主板里面有一块特殊的BIOS芯片,BIOS其实就是一块Flash芯片,它里面有自举装入程序,可以引导操作系统装入计算机。需要注意的是,BIOS程序是可以更新的,但是最好不要自己乱更新,比如我的电脑的Acer的,我就可以去Acer下载特定 的更新程序,同时,建议是如果电脑正常就不要更新BIOS,最新的BIOS未必好,只有你的电脑要安装新生产的部件(比如最新的固态硬盘),并且明确的知道了当前BIOS不支持新硬盘的驱动的时候才升级。(因为BIOS芯片的存在,所以主存可以说是RAM+ROM的集合芯片,CPU也会对两者进行统一编址,通常0-1023是ROM的,RAM是从1024开始的,所以写了8G的主存,往往可用的没有8G,写了256G的辅存,因为要存操作系统也往往没有256G)
SSD(Solid State Drive)固态硬盘(以前我还一直以为固态硬盘是中文别称,没有想到SSD翻译过来还是真是状态稳固的驱动。。)。它其实就是Flash,存储元几乎是一样的,唯一的区别在于它多了控制单元,所以也可以说SSD是控制单元+Flash构成。因为有额外的控制单元控制其读写,所以更加稳定。手机里面的芯片也是SSD但是手机的Flash集成度更高,造价也就更贵。PS:集成度越高,说明每次通电以后能经过的单元更多(比如都是1
m
m
2
mm^2
mm2的芯片,一个能存1MB,一个只能存1KB,但是每一个芯片所需的电压是恒定的,所以我需要准备1024个第二种芯片才能和之前1MB的芯片达到同样的存储,那么功耗也就高了1024倍),功耗就越低,但是价格也就会越高。所以一个小小的1T的U盘,价格可以比一个大大的8TSSD硬盘还高,同时同样是SSD硬盘,集成度越高,价格也就越高。
现在计算机的辅存基本上都是SSD了,谁和你说机械硬盘好就和谁急。
最后说一点,ROM芯片其实也支持随机存储,之所以叫只读,只是因为一开始的MROM只读,所以这个只读的名字就流传下来了。
因为DRAM需要恢复操作,而且恢复时间很长(甚至是读取时间的几倍),但是现在多数使用多核CPU,那么如何两个CPU要先后访问一个内存,那么第二个CPU来的时候,内存正在恢复,那就还需要等待,很不合理。所以,怎么尽可能的不让CPU因为主存需要恢复时间而空闲是一个大问题。需要注意的是,这里的"刷新"指的是,存储体的数据被读出以后,恢复的这个过程,不是它自然失去电荷的过程。双端口RAM可用解决多个CPU连续访问主存的情况。
其实就是这样,一个内存条如果有两个端口,允许同时两个CPU并行的访问,那么问题就可以得到解决:
需要注意的是,这里的两个端口上的数据线和地址线还有控制线都是完全独立的,所以对主板设计的要求就要更高。
双端口RAM的特点:
(1)支持两个CPU同时对同一个RAM的不同地址或者相同地址读取数据。
(2)并不支持两个CPU同时对同一地址单元进行数据写入(因为会互相覆盖)。
(3)同时也不支持对同一位置的CPU一个读一个写。(这就涉及到操作系统的临界区问题了,读者写者问题)
多体并行技术可以解决单一CPU总是在等待内存恢复的问题。其主体思想是,一个CPU可能访问的连续数据,比如一幅画,不要只保存在一个存储体中,而是存在多个存储体中,这样等你CPU读完第一个存储体,第一个存储体就可以开始刷新,第二个存储体已经刷新完成等待被用,依次类推。需要注意的是,这里的"刷新"指的是,存储体的数据被读出以后,恢复的这个过程。
如果要把一个连续的数据存在多个存储体中,那么就需要使用低位交叉编址的技术,把地址编成图中那样:
图中的低位和高位都是指在一块内存条上存储体的编号,编号位之后的编码就是用来标记具体存储元的。因为每次恢复都需要恢复整个存储体(因为每一个存储体只一有个数据寄存器),那使用低位编址,就可以有效的让数据被连续的访问(因为读完一个以后就让它自己恢复),这样算下来如果按照图上的,读取时间为r,读取时间加上恢复时间(也就是存取周期)为T,那么要读n个存储元,只需要花nr+一个恢复时间即可,也就是(n-1)r+T。高位交叉编址没有什么好说的,就是按照正常的编码方式从上到下编码。
对于这种多并行存储器,我们必须保证存储体的数目M
≥
\geq
≥T/r,这是因为只有保证M的数量足够,CPU 才可以在连续访问内存时不需要等待(也就是要保证CPU在访问到最后一个的时候,第一个已经恢复了)。但是如果M太大了,则会导致一部分存储体处于空闲状态。所以M=T/r才是最好的状态(多了太贵,少了则太慢)。
有些书上也把存取时间r叫做总线传输周期,两者表达的含义相同。
计算存储体位置的方法:直接看最后几位的二进制码是多少,或者用整个地址去和存储体总数M取余。
\quad
需要注意的一点是,多体并行存储器的造价还是略高的,因为要保证每一个存储体都有一个地址寄存器和数据寄存器,还要安排上独立的读写控制电路,要保证每一个存储体都有相同的容量和速度。
没钱也有没有钱的做法,只需要把存储单元排列起来,共用寄存器和线,这样就把原来的几个存储单元合成了一个大的存储单元(原本一个单元一个字,现在一个单元m个字)。需要注意的是,这里的m和上面说的M是相同的,也就是CPU一次读个m字,然后只需要保证CPU计算这m个字的时间和内存的恢复时间相同,那么就不存在等待了。理想是很好的,但是有时候CPU只需要几个字的数据,但还是会读完m字,所以灵活性不如多体并行存储器,但是好处就是便宜,慢点就慢点呗(如果能保证一直都是连续读取,速度也不必多体并行慢,因为你从宏观上看CPU也是在相同的时间内从多体并行里面读了m个字)。示例图如下:
你如果在淘宝搜索电脑内存条,你会发现你买主存的时候,32GB的不是一根,而是16GB+16GB的两根一起卖的,这是因为两根插在一起就可用组成低位交叉编址的多体并行存储器。如果你的是笔记本,那估计也就只能插入两根,但是如果你的是电脑,那么插入的时候要注意,插入到颜色相同的两个卡槽里面,这样它们才会连续编址(颜色相同共用总线)。如图可插入8条(插入个两条8G的其实就够用了):
同时,最好保证两根内存条是某宝一起卖的,因为厂家发的都是同时生产的,稳定性接近,一起组成内存更加稳定。没有一起发货的,也要保证两个内存条容量和主频这些参数相同(如果两个主存频率不一样,那么高频的那个就无法完全发挥性能,因为要等待低频的先跑,形成降频,所以如果没钱买两个高的,那么还不如一次买两个低的,一高一低和两个低的是一样的)(如果内存容量不同,那么高地址部分还是单通道的性能,这样会导致你的电脑运行忽快忽慢,影响体验)。
名字后面就是容量,容量后面就是主频,这是一个32G,主频6000HZ的内存条。
如图所示,这是一个8x8的芯片,那么如果我们要让它和CPU进行连接,需要把数据总线,片选线,读写控制线和地址总线连接到CPU上。
现代的计算机已经把MAR和MDR集成到了CPU的主板上面,不需要存储器单独保留,存储器只需要保留一个普通的寄存器,暂时存放一下输入和输出数据就可以(用来刷新和恢复的)。也就是这样的:
关键的问题存在两点:一是如何把一堆单块芯片连接起来扩展主存的字数(单片只有8位),连接到CPU去,这叫字扩展。二是现在的一个电脑都是64位的,但是芯片数据总线的长度可能不到64位,要如何进行位扩展。这也是考试的重点。
(1)地址线:用A表示,从
A
0
A_0
A0(低地址)到
A
n
A_n
An(高地址):
(2)数据线:用D表示,和地址线的表示一样,从
D
0
D_0
D0到
D
n
D_n
Dn:
(3)片选线:用CS(chip select)或CE表示,CS用的更多一些。上面有横线代表这个线在低电平的时候是接通的,没有横线就是高电平才接通。
(4)读写控制线:WE或WR(其实就是write和write_read)。读写控制线的低电平代表写操作,高电平代表读操作,如果没有一横就正好相反,只需要记住写占主导低位即可:
当然,两根线也可能是分开的,WE是读,OE是写,只要头上有一根线那就是低电平有效。
为了方便,其实总线在集成板子上都是一边有插口:
位扩展的目的是增加存储字的字长。假设我们现在手里只有一张8Kx1位的存储芯片,我们要把它连接到CPU上:
我们不难发现,因为芯片的数据线只有一位,但是CPU的数据线有8条,形成了浪费,同时地址线也浪费了,要想不浪费数据线,就需要进行位扩展,要想不浪费地址线就要进行字扩展。
我们先说位扩展,位扩展的思路其实很简单,因为一块芯片不是只有一根数据线吗,那我们多找几个芯片,全部连接到CPU上,一根数据线连一个芯片不就OK了嘛。
注意,CS始终被设为1,也就是有效状态(没有加线就是高电平有效)。
经过图上的改造,虽然实际上是有两块1位的芯片,但是计算机却可认为这是一块两位的芯片。
这样就从1bit改成了8bit。
说实话,现在1位的芯片基本上都已经没有了,因为上面的8个芯片完全可以被集成到一起,形成一个8位的芯片,这样就不需要位扩展:
但是可以看见地址线还是有很多的浪费,所以需要字扩展。
正常人想到的方法肯定是再找块芯片,然后把多余的地址线给接满,比如下一块芯片的
A
12
A_{12}
A12接到
A
13
A_{13}
A13去,
A
0
A_0
A0接
A
1
A_1
A1,说实话,这样是可行的,但是问题的关键在于CS是都是1,这样就会导致每一次选址,都有两个数据传出来相互覆盖(即便全是低电平都是0000000两个芯片也会冲突),所以自然不可取。于是我们就会想到,把一直是1的CS线给接到地址线上去。这样传过来的地址就一部分是代表芯片里面的具体位置,另一部分就是代表是哪个芯片工作(这里其实就是上面的高地址编码的简易版)。
(1)上面说的,把每一个芯片的CS都接到空地址线上的方法叫做线选法。
如图所示,线选法的缺点就是00开头则两个芯片都处于无效状态,那么CPU就有
2
12
2^{12}
212的能力被浪费了。如果都是11则会出现上面说的覆盖冲突,所以最后还需要加一个异或门电路来监控是否有效。这样做又浪费又麻烦。
(2)所以就有了片选法,我们只需把两个芯片的CS线都接到一个CPU的空地址线上,但是在其中一根CS线上加上一个非门电路,就可以保证每时每刻都有一个芯片可用且永远不会冲突了。
当然,这样最多只能接两个芯片,因为如果加上第三个芯片,它们还是会冲突(自己画一下就知道为什么了)。
我们可以把上面的这个非门电路封装起来,就形成了一个简单的译码器,称为1-2译码器。1是指一根线,2是指可选择2个电路。(可以看是2的几次方
2
1
=
2
2^1=2
21=2)
那么要怎么扩展多个芯片呢,很简单,设计更复杂的电路来译码,最常见的就是3-8译码器,输入三个信号,可以对应选择8个芯片:
这是一个真实的3-8译码器的电路:
这门课不是数字电路,所以看看就好,不理解也不用理解。
这里选用的是4个芯片,所以需要一个2-4译码器,之后CS端是低电平有效(CS上有横线,并且芯片上方有个小圆圈,双重提醒),因为是低电平有效,译码器的输出也要加一个圆圈表示取反。虽然每一个芯片的地址线实际都是直接和CPU连接的,但是这里为了美观进行了优化。
从图中可以看到,使用字扩展之后,地址从全0到全1全部都用上了,形成连续的地址单元。
考试中还会出现这样接线的,就是不接14直接接到15去,这样的话其实也可以,你只需要忽略中间的那个输出就行,但是缺点是000开头的,和010开头的,选到的可能是同一个地址,所以现实中也是不可取的,考试是可取的,会让你把各个芯片的地址范围写出来。
我们进行位扩展之后的芯片,其实可以看作是一块集合芯片,然后我们就可以对多个芯片先进行位扩展,获得数量足够的集合芯片之后,再进行一次字扩展:
我们在CPU和存储器的连接之中已经知道了译码器的作用,现在进行进一步的探讨。
首先,译码器分为高电平有效和低电平有效,这需要根据芯片来配套使用,画法是不一样的:
实际上的译码器还有使能端:
控制译码器是否生效。
往上面看那个3-8译码器的图,其实是74ls138译码器,它有多个使能端(不会考的,只要求你在试卷上看见知道它是干什么的,然后正常的写地址即可):
图上的MREQ端,代表了CPU是否处于工作状态,如图所示,如果CPU开始工作,就会发出MREQ来激活译码器(因为是低电平有效,所以100反而不工作,但是101就开始工作,具体看图标的圈)。这么做的主要原因是,一开始CPU发出地址信号的时候,电流可能会波动,所以CPU要等电流平稳之后,在发出MREQ信号,表示准备工作。
如图所示,最上面的地址信号是CPU发出的(有0有1,所以有高有低),需要等一段时间以后才会稳定,然后才会激活CS,CS被激活以后(无效是高的,有效是低的),经过一段时间稳定后,才从对应地址里面取数据,到Data寄存器(Dout是数据传输到数据寄存器在传入CPU的过程)。
现在常用的外存分为磁盘存储和SSD存储两种,虽然磁盘现在已经被淘汰了个七七八八,但是一直都是考试 的高频考点。
磁性表面存储介值就不需要MOS管来实现存储了,它的原理很简单,就是在金属铝或者塑料这些有磁吸附性的材料上面均匀地涂抹上一层磁性材料。其读写的原理如图所示:
如图所示,读线圈和写线圈围绕着一根铁,铁的作用是增强电磁感应。写的时候:给写线圈通上正负电流,可以形成两种相反的磁性,因为磁性不同,磁层上的磁性材料会呈现出不同的状态,用来代表0和1。读的时候,直接把磁层从线圈下方经过,因为磁性的变化,读线圈里面会出现不同的电流(也是正和负)。所以基本原理就是大学物理学习的麦克斯韦和法拉第的电磁感应相关知识,这其实不难理解。因为受到原理的限制,磁表面存储器一次只能读取1bit的数据。
总结一下磁表面存储器的优缺点:
优点:
(1)读取的时候不会破坏存储的信息,是非破坏性存储。
(2)存储的时间长,通不通电都在。
(3)便宜。
缺点:
(1)一次只能读写1bit,所以很慢。
(2)机械结构复杂,还很占用空间。
(3)容易坏,磁头容易摔坏,保存的信息容易受到外界的磁场干扰而丢失。
磁盘,磁带等都是磁性表面存储设备。
磁盘是读取只能串行进行,因为一次只能感知一种电流,无法像上面说的随机存储那样多个同时读取,所以电脑发过来的并行信号,需要被磁盘上的串并行转换器转换成可以读取的串行信号。
如图所示的就是一个磁盘的结构,磁表面介值被均匀的一圈圈涂在磁盘的表面上。刚刚介绍的磁头由一个机械臂连接,可以移动,磁盘可以旋转。反面则是必须的电路板,用于和电脑连接,控制磁盘读取数据。一个磁盘更详细的可以分解为:
(1)从水平结构看:把磁盘上每一圈磁性介质称为一个磁道,同时因为磁盘是一个圆形,所以我们可以根据固定的角度取一定的扇型。扇形面积和磁道共同把一个磁盘分成一块一块的,每一块就是磁盘的最小存储单元,称为扇区,你也可以直接叫它块。
(2)从垂直结构看:磁盘的盘片并不只有一个,而是有许多个,所以从上到下,每一个磁道其实都可以结合起来形成一个柱面,柱面的数目和一个盘面上磁道的数目是一致的。
这里截取一张王道的PPT来进一步说明:
至于磁盘驱动器和磁盘控制器,以及接口的区别,有兴趣可以百度一下,反正磁盘也濒临淘汰了。
一个磁盘的放大结构是这样的:
首先,我们可以看到的是每一个磁盘都配对了一个双面磁头(最上面还有一个单面磁头,这里没有画出来),所以可以说有多少个盘就有多少磁头。此外,为了避免浪费,磁盘两面都被涂上了磁性物质(最底面可能没有用到,但是也涂了)。
磁盘很特殊的一点就是容易损坏,所以产家会预留一些容量来备用,当一部分无法读取的时候,就启用备用的那一部分,所以你买到一个磁盘,它在电脑上显示的容量往往比买的时候标注的要小。我们把扣除了备用容量的磁盘容量称为其格式化容量,磁盘真正能存的容量叫做非格式化容量(卖磁盘的肯定标非格式化容量啦)。当然,现在你买一个1T的固态,到手往往是931或者932GB,这是因为被玩了文字游戏,店家说的是十进制的1T然后经过各种换算,最后到手就少了90GB(1000x1000x1000x1000/1024x1024x1024=931.322574615,所以几乎少了90GB的容量)。当然,说实话,如果你到手的1T硬盘,在计算机上显示了931GB,那么完全说明了,产家就是按照1024的规格生产的,然后拿了90GB去做备用容量(也用于计算如何更好的均衡各个片区的负载),这个容量就是格式化容量,但是为了防止有头铁的人非要要求不需要格式化容量,要真实的容量,所以宣传是10进制搞的。
记录密度是磁盘单位面积上二进制信息的存储量,分为道密度、位密度和面密度三种,考试的时候通常会告诉你其中的一种,让你计算对应的存储容量。
(1)道密度:沿磁盘方向,单位长度上的磁道数。
(2)位密度:磁道单位长度上能记录的二进制代码位数。
(3)面密度:面密度就是道密度和位密度的乘积。
如图所示蓝色的就是道密度,红色的就是位密度。一般会给你道位面三种之中的两种让你去算其他的一种。
需要注意的一点是,这里给你的位密度通常是平均位密度,因为要保证磁盘的每一个扇区的容量相等,所以里面的位密度会大一些,外面的会小一些,就像图中这样:
存取数据有三个过程,首先是把磁头臂移动过去,这段时间我们称之为寻道时间。之后扇区要旋转磁头的前方,这段时间我们称之为旋转延迟时间,之后扇区从磁头的前方快速地转过去,在磁头上形成电磁感应,这段时间其实是传输数据,所以称为传输时间。
所以:
平均存取时间
=
寻道时间
+
旋转延迟时间
+
传输时间
平均存取时间=寻道时间+旋转延迟时间+传输时间
平均存取时间=寻道时间+旋转延迟时间+传输时间
要注意的一点是,寻道时间如果题目不是平均时间,你需要把它转换成平均时间。旋转延迟时间要计算的是磁头臂在磁盘上转半圈需要的时间,因为综合一下所有位置的可能性,转半圈是平均的数学期望,题目时常就只会告诉你磁盘的转速是多少,所以你还需要根据转速去计算转半圈所需要的时间(路程/速度)。传输时间也不会明确和你说,也是要根据数据量和具体的磁盘位密度去算长度,然后根据速度计算时间(题目默认都是一个速度)。
有的题目还要求增加磁盘控制器的时间,这个题目会明确写明。
数据传输率是指磁盘单位时间内能向主机传输多少位的数据。数据传输率的计算是不用管磁盘的旋转延迟时间,寻道时间等的,只需要考虑传输时间为1s的情况下能传多少数据即可(可以说计算的是一个理论最大值)。比如磁盘的转速是r(转/秒),然后一个磁道(一转对应的是一整个磁道哦)的容量是N个字节,则它的数据传输率就是r*N。
磁盘的地址由磁盘驱动号(代表它是电脑上的第几个磁盘),磁道号(也叫柱面号)(代表它是一个磁盘上的哪一个磁道),盘面号(它是第几个盘),扇区号(它在这个盘的这个磁道的哪个扇区)。
考试会给出磁盘,磁道,盘面和扇区的数目,问你地址位需要几位。这很简单因为只需要把每一个参数用
log
2
n
\log_2n
log2n计算即可,这里借用王道PPT的题目举例:
磁盘阵列的全称是廉价冗余磁盘阵列,简称RAID,其基本原理和之前说主存时候说的,多体并行 存储是一样的,就是把多个磁盘并行的放在一起,形成一个磁盘的阵列,这样可以互相配合,提高读取速度和稳定性。磁盘阵列可以分为以下几种类型:
(1)RAID0:无冗余无校验的磁盘阵列。其原理和前面说的低位交叉编址是一模一样的,如图所示:
数据在两个磁盘上并行的连续存储。当然,实际上不止两个,这样相当于可用并行读取信息。它的缺点是如果磁盘里面的某一部分损坏了,这个磁盘的信息就完全丢失了。
(2)RAID1:镜像磁盘阵列。就是把几个磁盘都存入相同的信息:
RAID1的好处是,也可以同时读取许多的连续数据(比如一边读A1一边读A2),同时读出来以后还可进行两边校验,看看数据是否错误,同时如果有一个磁盘的数据损坏了,可立即从另一个磁盘读数据。缺点是浪费了许多存储空间。
(3)RAID2:采用纠错海明码的存储磁盘阵列。如图所示:
海明校验码只需3位就可以纠正4位数据中的1位错误,检验出2位的错误。这样我们存数据用四个磁盘,校验和纠正只需要3个磁盘即可(4:3),比起镜像的磁盘阵列(1:1),节省了一个磁盘的空间。海明校验码的相关信息可在计算机网络通信中详细学习,这里不多介绍。
(4)之后还有RAID3,RAID4和RAID5等,但是不是考试重点,所以这里不多赘述。最后说一句,越往后当然就越好,目前最常用的磁盘阵列是RAID 5和RAID 6。RAID 5采用分布式奇偶校验的方式,通过将数据和校验信息分布存储在多个磁盘中,提供了数据冗余和读取性能的提升。具体而言,RAID 5将数据块分散存储在多个磁盘上,并计算奇偶校验信息并存储在另一个磁盘上。这样,在任何一个磁盘发生故障的情况下,可以通过奇偶校验信息来恢复丢失的数据。RAID 6则是在RAID 5的基础上进一步增加了双重奇偶校验。它提供了更高级别的容错性,可以同时容忍两个磁盘的故障。通过额外的奇偶校验信息,RAID 6提供更高的数据冗余和可靠性。选择合适的RAID级别需要考虑到性能、容错能力、成本和存储需求等因素,比如商业环境,百度云等的服务器的磁盘就是最高级别的防止数据丢失。
考试也是与时俱进的,SSD是新加的考点。虽然上面已经介绍过SSD的简单原理,但是因为是现在最主流的存储器,可用做辅存,可用作外存,所以基本上是必考的,因此需要在这里详细地描述一下。先把王道的知识点总结拿上来:
从图中我们已经知道了闪存技术,同时前面也已经说过了SSD的优点,但是没有介绍过其地址,以及读写特性,包括页技术,还有磨损均衡技术。
如图所示就是一个现在常可以买了作为辅存的SSD固态硬盘,120GB的贴纸下面就是存储颗粒,用来存储数据,后面的芯片大的一块是缓存,小的是控制芯片。有缓存则读写速度会更快,缺点是发热会增加。
还有这种一大块的,用作外存的SSD固态:
上面的这些大的芯片都是存储颗粒,其余的是控制电路,这个外存固态就没有缓存了,所以存储量应该更大且便宜。
画成示意图是这样的:
其中的闪存翻译层其实就是上面说的控制电路,负责把计算机发过来的逻辑地址变成物理地址,然后找对应的数据。
每一个存储芯片中,可以把一行存储颗粒叫做块,把每一个存储颗粒叫做页,如下图所示。
要注意的是,一个页是很大的,从512B到4KB都有。页可以说是里面的最小存储单元,每次读写都是一个页(相当于一个扇区,注意磁盘的扇区的别称也是块,但是SSD的块相当于磁道,不要混淆了)。CPU发出的是逻辑块号,其实对应的是SSD中的一个页号。
要注意下,删除数据的时候,擦除不能精确到页,读取可用精确到页,但是擦除则是整块一起擦除。那么要写的某页的时候,固态会先把这块上其他页的数据放到一个专门留出来装零时数据的块上,然后整块擦掉,把要写的数据和原本的其他页数据一起写进去,然后再把零时块给擦除了(更省事的方法就是把原本的块变成零时块,把零时块的地址换成原本那个,反正随机读取不会因为距离而影响读取速度,这个时候,映射的方案会变化,这是由闪存翻译层来记录的)。因为写操作会引起数据迁移和整块擦除,所以对于一块固态硬盘而言,读是远远比写更快的(你下载安装确实比你使用要慢)。
随着擦除次数的增加,SSD的可靠性和性能可能会下降。这是由于闪存存储器中的电荷损失和物理磨损等因素。当SSD的擦除次数达到或接近其限制时,可能会出现数据损坏或性能下降的情况。SSD的一个块,一般只能写个几千次,好一点的几万次,但是完全不用担心,因为产家会通过芯片控制的方法,让芯片尽可能地耐用,一般用个好几年完全OK。但是喜欢多次擦除读写的,还是建议搞个磁盘,虽然磁盘不耐摔,不耐磁性环境,但是只要多加爱护,寿命更长,理论上磁盘可无限读写。
磨损均衡技术的核心理念就是尽可能地让每一次擦除都均匀地分布到每一个块上,而不是盯着一个块擦,那么如果一个块擦1万次会坏,那么一亿的块就需要擦一万亿才会使得SSD损坏,这就大大延长了SSD的寿命。磨损均衡技术的算法分为两种:
(1)动态磨损均衡技术:记录每一个块的擦除次数,每一次擦除的时候都选择被擦最少的那个块。
(2)静态磨损均衡技术:固态硬盘的控制芯片会分析传输进来的是什么类型的数据,比如传入的是视频或者图片数据,那后续就不会涉及太多的写操作,于是就把这些数据存到被写了多次的块中;如果是一个游戏的记录数据,那么这个数据会因为你游戏而动态地被改,所以就写到被擦的不多的块中。
需要注意的是,这些算法其实都是被产家存在SSD中,和磁盘的格式化容量一样,所以1T的固态到手是931GB,大概率也是产家把90多G变成了备用块,并且在里面存了记录每一个块写了多少次的算法和磨损均衡的算法,然后又拿十进制来说事(只有900G则大概率真是十进制生产的,然后搞了31GB的磨损均衡算法)。
其实操作系统也会细谈这个。来个题目:
我们用
2
40
2^{40}
240除以
2
37
2^{37}
237,可以得知在不重复的情况下,他要把块全部都擦除一遍,一般需要
2
3
2^{3}
23也就是8天。那么8000天,也就是23年以后,硬盘就会损坏。23年都够一个人从青年变成中年了,所以根本不用担心。如果是现在的固态,比如宏基的GM7是可以做到万次擦除的,那么230年完全是够一个人用一辈子了。关键是,一天写不了128G。
因为本文字数太多,并且Cache实在是太重要了,所以放到下一篇文章细讲。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。