大话存储1——存储系统的发展,计算机I/O

1 存储发展

  存储在这里的含义为信息记录,是伴随人类活动出现的技术。

  1. 竹简和纸张

  竹简是中国古代使用的记录文字的工具,后来被纸张所取代,如图1.1所示。

  2. 选数管

  选数管是20世纪中期出现的电子存储装置,是一种由直观存储转为机器存储的装置。其实在19世纪出现的穿孔纸带存储就是一种由直观存储转向机器存储的产物,它对19世纪西方某国的人口普查起到了关键的加速作用。

  选数管的容量从256~4096比特不等,其中4096比特的选数管有10英寸长,3英寸宽,最初是1946年开发的,因为成本太高,并没有获得广泛使用。图1.2是容量为1024比特的选数管。

 

  3. 穿孔卡

  穿孔卡片用于输入数据和程序,直到20世纪70年代中期仍有广泛应用。图1.3和     图1.4是一条Fortran程序表达式Z(1) = Y + W(1)所对应的穿孔卡和穿孔卡片阅读器。
 

 


  4. 穿孔纸带

  穿孔纸带用来输入数据,输出同样也是在穿孔纸带上。它的每一行代表一个字符,如图1.5所示。

  5. 磁带

  磁带是从1951年起被作为数据存储设备使用的。磁带在当时被称为UNISERVO。图1.6所示的最早的磁带机可以每秒钟传输7200个字符。如图1.6所示这套磁带长达365米。
 

 

  从20世纪70年代后期到20世纪80年代出现了小型的盒式磁带,长度为90分钟的磁带每一面可以记录大约660KB的数据,如图1.7所示。
 

 

  6. 磁鼓存储器

  磁鼓存储器最初于1932年在奥地利被创造出来,在20世纪五六十年代被广泛使用,通常作为内存,容量大约10KB,如图1.8所示。

  7. 硬盘驱动器

  第一款硬盘驱动器是IBM Model 350 Disk File,如图1.9所示,于1956年制造,其中包含了50张24英寸盘片,而总容量不到5MB。
 

 

  首个容量突破1GB的硬盘是IBM在1980年制造的IBM 3380,如图1.10所示,总容量为2.52GB,重约250千克。

  8. 软盘

  软盘由IBM在1971年引入,从20世纪70年代中期到20世纪90年代末期被广泛使用,最初为8英寸盘,之后有了5.25英寸和3.5英寸盘。1971年最早的软盘容量为79.7KB,并且是只读的,一年后有了可读写的版本。图1.11所示就是一张软盘和软盘驱动器。软盘的最大容量为200MB左右,叫做ZIP盘,目前已经被淘汰。

 

  9. 光盘

  早先的光盘主要用于电影行业,第一款光盘于1987年进入市场,直径为30厘米,每一面可以记录60分钟的音频或视频。如今,光盘技术已经突飞猛进。存储密度不断提高,已经出现了CD-ROM、DVD、D9、D18、蓝光技术。图1.12所示为一张光盘。
 

 

  10. Flash芯片和卡式存储

  随着集成电路技术的飞速发展,20世纪后半叶固态硅芯片出现了,其代表有专用数字电路芯片、通用CPU芯片、RAM芯片、Flash芯片等。其中Flash芯片,就是用于永久存储数据的芯片,如图1.13所示。可以将Flash芯片用USB接口接入主机总线网络,这种集成USB接口的小型便携存储设备就是U盘,或者说是闪存,如图1.14所示。目前一块小小的Flash芯片最高可以存储32GB甚至更高的数据。

  存储卡其实是另一种形式的Flash芯片集成产品,如图1.15所示。
 

 

  11. 硬盘阵列

  随着人类进入21世纪,网络日益发达,世界日益变小,人类通过计算机来实现自己原本做不到的想法,信息爆炸导致数据更是成倍地爆炸。于是,硬盘的容量也不断“爆炸”,SATA硬盘目前已经可以在一个盘体内实现1TB的容量。同时硬盘的单碟容量也在不断增加,320GB单碟容量已经实现。然而,单块磁盘目前所能提供的存储容量和速度已经远远无法满足需求,所以磁盘阵列就应运而生,如图1.16所示。具体细节将在本书后面章节中讲述。
 

 

  12. 大型网络化硬盘阵列

  随着磁盘阵列技术的发展和IT系统需求的不断升级,大型网络化磁盘阵列出现了,如  图1.17所示。这也是本书将要描述的重点内容。

 

 

 

 

 

2. 计算机I/O

  大家都知道,组成计算机的三大件是CPU、内存和IO。CPU和内存就不用说了,那么IO具体是什么呢?IO就是IN和OUT的简称。顾名思义,CPU需要从内存中提取数据来运算,运算完毕后再放回内存,或者直接将电信号发向一些针脚以操作外部设备。对于CPU来说,从内存提取数据,就叫做IN。运算完后将数据直接发送到某些其他针脚或者放回内存,这个过程就是OUT。对于磁盘来说,IN是指数据写入磁盘的过程,OUT则是指数据从磁盘读出来的过程。IO只是一个过程,那我们为何要在本书开头就研究它呢?因为我们必须弄清楚计算机系统的

  现代计算机中,IO是通过共享一条总线的方式来实现的,如图2.1所示。总线也就是一条或者多条物理上的导线,每个部件都接到这些导线上,导线上的电位每个时刻都是相等的,这样总线上的所有部件都会收到相同的信号。也就是说,这条总线是共享的,同一时刻只能有一个部件在接收或者发送,是全单工的工作模式。

 

                                    图 2.1  计算机总线示意图

  所有部件按照另一条总线,也就是仲裁总线或者中断总线上给出的信号来判断这个时刻总线可以由哪个部件来使用。产生仲裁总线或者中断电位的可以是CPU,也可以是总线上的其他设备。如果CPU要向某个设备做输出操作,那么就由CPU主动做中断。如果某个设备请求向CPU发送信号,则由这个设备来主动产生中断信号来通知CPU。CPU运行操作系统内核的设备管理程序,从而产生了这些信号。

  如图2.1所示,主板上的每个部件都是通过总线连接起来的。图中只画了8条导线,而实际中,导线的数目远远不止8条,可能是16条、32条、64条甚至128条。这些导线密密麻麻地印刷在电路板上,由于导线之间非常密集,在高频振荡时会产生很大干扰,所以人们将这些导线分组印刷到不同电路板上,然后再将这些电路板压合起来,形成一块板,这就是多层印刷电路板(多层PCB)。这样,每张板上的导线数量降低了,同时板与板之间的信号屏蔽性很好,不会相互干扰。这些导线之中,有一些是部件之间交互数据用的数据总线,有些则是它们互相传递控制信号用的控制总线,有些则是中断与仲裁用的中断总线,还有一些则是地址总线,用来确认通信时的目标设备。一般按照数据总线的条数来确认一个总线或设备的位宽(CPU是按照其内部寄存器到运算单元之间的总线数目来确定位数的)。比如32位PCI总线,则表明这条总线共有32根导线用于传递数据信号。PCI总线可以终结在一个插槽,用于将PCI接口的板卡接入PCI总线,也可以直接与设备连接。后者一般用于集成在主板上的设备,因为它们之间无需使用插槽来连接。

1. PCI总线

  PCI总线是目前台式机与服务器所普遍使用的一种南桥与外设连接的总线技术。

  PCI总线的地址总线与数据总线是分时复用的。这样的好处是,一方面可以节省接插件的管脚数,另一方面便于实现突发数据传输。在数据传输时,一个PCI设备作为发起者(主控,Initiator或Master),而另一个PCI设备作为目标(从设备、Target或Slave)。总线上的所有时序的产生与控制,都由Master来发起。PCI总线在同一时刻只能供一对设备完成传输,这就要求有一个仲裁机构(Arbiter),来决定谁有权力拿到总线的主控权。

  当PCI总线进行操作时,发起者(Master)先置REQ#信号(REQ#,Master用来请求总线使用权的信号),当得到仲裁器(Arbiter)的许可时(GNT#信号),会将FRAME#信号(传输开始或者结束信号)置低,并在地址总线(也就是数据总线,地址线和数据线是共享的)上放置Slave地址,同时C/BE#(命令信号)放置命令信号,说明接下来的传输类型。

  所有PCI总线上的设备都需对此地址译码,被选中的设备要置DEVSEL#(被选中信号)以声明自己被选中。当IRDY#(Master可以发送数据)与TRDY#(Slave可以发送数据)都置低时,可以传输数据。当Master数据传输结束前,将FRAME#置高以标明只剩最后一组数据要传输,并在传完数据后放开IRDY#以释放总线控制权。2. PCI总线的中断共享

  PCI总线可以实现中断共享,即不同的设备使用同一个中断而不发生冲突。

  硬件上,采用电平触发的办法:中断信号在系统一侧用电阻接高,而要产生中断的板卡上利用三极管的集电极将信号拉低。这样不管有几块板产生中断,中断信号都是低;而只有当所有板卡的中断都得到处理后,中断信号才会回复高电平。

  软件上,采用中断链的方法:假设系统启动时,发现板卡A用了中断7,就会将中断7对应的内存区指向A卡对应的中断服务程序入口ISR_A;然后系统发现板卡B也用中断7,这时就会将中断7对应的内存区指向ISR_B,同时将ISR_B的结束指向ISR_A。以此类推,就会形成一个中断链。而当有中断发生时,系统跳转到中断7对应的内存,也就是ISR_B。ISR_B就要检查是不是B卡的中断,如果是则处理,并将板卡上的拉低电路放开;如果不是则呼叫ISR_A。这样就完成了中断的共享。

2.2  计算机内部通信

  网络是什么,用一句话来说就是要通信的所有节点连接起来,然后找到目标,找到后就发送数据。笔者把这种简单模型叫做“连找发”网络三元素模型,听起来非常简单。

  1. 连

  网络系统当然首先要都连接起来,不管用什么样的连接方式,比如HUB总线、以太网交换、电话交换、无线、直连、中转等。在这些层面上每个网络点到其他网络点,总有通路,总是可达。

  2. 找

  连接起来之后,由于节点太多,怎么来区分谁是谁呢?所以就需要有个区分机制。当然首先就想到了命名,就像给人起名一样。在目前广泛使用的网络互联协议TCP/IP中,IP这种命名方式占了主导地位,统一了天下。其他的命名方式在IP看来都是“非正统”的,全部被“映射”到了IP。比如MAC地址和IP的映射,Frame Relay中DLCI地址和IP的映射,ATM中ATM地址和IP的映射,反正最终都映射成IP地址。任何节点,不管所在的环境使用什么命名方式,到了TCP/IP协议的国度里,就都需要有个IP名(IP地址),然后全部用TCP/IP协议来实现节点到节点无障碍的通信。在“连起来”这个层面,就是OSI(本书第7章介绍)模型中链路层实现的功能。

  3. 发

  “找目标”这个层面是网络层实现的功能。“发数据”这个层面,就是传输层需要保障的。至于发什么数据,数据是什么格式,这两个层面就不是网络通信所关心的了,它们已经属于OSI模型中上三层的内容了。

 

2.2.1  IO总线可以看作网络么

  IO总线可以接入多个外设,比如键盘、鼠标、网卡、显卡、USB设备、串口设备和并口设备等,最重要的当然要属磁盘设备了。讲到这里,大家的脑海中应该能出现这么一种架构:CPU、内存和各种外设都连接到一个总线上,这不正是以太网HUB的模型么?HUB本身就是一个总线结构而已,所有接口都接在一条总线上,HUB所做的就是避免总线信号衰减,因此需要电源来加强总线上的电信号。

  没错!仔细分析思考提炼之后,确实就是这么一个模型!不过IO总线和以太网HUB模型还是有些区别。CPU和内存因为足够快,它们之间单独用一条总线连接。这个总线和慢速IO总线之间通过一个桥接芯片连接,也就是主板上的北桥芯片。这个芯片连接了CPU、内存和IO总线。

  CPU与北桥连接的总线叫做系统总线,也称为前端总线。这个总线的传输频率与CPU自身频率是两个不同概念,总线频率相当于CPU向外部存取数据时的数据传输速率,而CPU自身的频率则表示CPU运算时电路产生的频率。

  前端总线的条数,比如64条或者128条,就叫做总线的位数。这个位数与CPU内部的位数也是不同的概念,CPU位数指的是寄存器和运算单元之间总线的条数。内存与北桥连接的总线叫做内存总线。由于北桥速度太快,而IO总线速度相对北桥显得太慢,所以北桥和IO总线之间,往往要增加一个网桥,叫做南桥,在南桥上一般集成了众多外设的控制器,比如磁盘控制器、USB控制器等。

  下面就来看看,在这个网络上,我们能够干点什么惊天动地的事呢?

2.2.2  CPU、内存和磁盘之间通过网络来通信

  CPU是一个芯片,磁盘是一个有接口的盒子,它们不是一体的而是分开的,而且都连接在这个网桥上。那么CPU向磁盘要数据,也就是两个节点之间的通信,必定要通过一种通路来获取,这个通路当然是电路!

  凡是分割的节点之间,需要接触和通信,就可以成为网络。那么就不由地使我们往OSI模型上去靠,这个模型定义得很好。既然通信是通过电路,也就是物理层的东西,那么链路层都有什么内容呢?

  大家知道,链路层相当于一个司机,它把货物运输到对端。司机的作用就是驾驶车辆,而且要判断交通规则做出配合。那么在这个计算机总线组成的网络中,是否也需要这样一个角色呢?答案是不需要。因为各个节点之间的路实在是太短、太稳定了!主板上那些电容、电阻和蛇行线,这一切都是为了保障这些电路的稳定和高速。在这样的一条高速、高成本的道路上,是不需要司机的,更不需要押运员!所以,计算机总线网络是一个只有物理层、网络层和上三层的网络

  下面我们就按照“连找发”三元素理论,去分析一个CPU向磁盘要数据的例子。

  CPU与硬盘数据交互的过程

  首先看“连”这个元素,这个当然已经具备了,因为总线已经提供了“连”所需的条件。

  再看“找”这个元素,前面说了,首先要有区分,才能有所谓“找”,这个区分体现在主机总线中就是设备地址映射。每个IO设备在启动时都要向内存中映射一个或者多个地址,这个地址有8位长,又被称作IO端口。针对这个地址的数据,统统被北桥芯片重定向到总线上实际的设备上。假如,IDE磁盘控制器地址被映射到了地址0xA0,也就是十六进制A0,CPU根据程序机器代码,向这个地址发出多条指令来完成一个读操作,这就是“找”。“找”的条件也具备了。

  接下来我们看看“发”这个元素!首先CPU将这个IO地址放到系统总线上,北桥接收到之后,会等待CPU发送第一个针对这个外设的指令。然后CPU发送如下3条指令。

  第一条指令:指令中包含了表示当前指令是读还是写的位,而且还包含了其他选项,比如操作完成时是否用中断来通知CPU处理,是否启用磁盘缓存等。

  第二条指令:指明应该读取的硬盘逻辑块号(LBA)。这个逻辑块在我们讲磁盘结构时会讲到,总之逻辑块就是对磁盘上存储区域的一种抽象。

  第三条指令:给出了读取出来的内容应该存放到内存中哪个地址中。

  这3条指令被北桥依次发送给IO总线上的磁盘控制器来执行。磁盘控制器收到第一条指令之后,知道这是读指令,而且知道这个操作的一些选项,比如完成是否发中断,是否启用磁盘缓存等,然后磁盘控制器会继续等待下一条指令,即逻辑块地址(号)。磁盘控制器收到指令之后,会进行磁盘实际扇区和逻辑块的对应查找,可能一个逻辑块会对应多个扇区,查找完成之后,控制器驱动磁头寻道,等盘体旋转到那个扇区后,磁头开始读出数据。在读取数据的同时,磁盘控制器会接收到第三条指令,也就是CPU给出的数据应该存放在内存中的地址。有了这个地址,数据读出之后直接通过DMA技术,也就是磁盘控制器可以直接对内存寻址并执行写操作,而不必先转到CPU,然后再从CPU存到内存中。数据存到内存中之后,CPU就从内存中取数据,进行其他运算。

  上面说的过程是“读”,“写”的过程也可以以此类推,而且CPU向磁盘读写数据,和向内存读写数据大同小异,只不过CPU和内存之间有更高速的缓存。缓存对于计算机很重要,对于磁盘阵列同样重要,后面内容将会介绍到。
 
  那么控制器对磁盘发出的一系列指令是怎么定义的呢?它们形成了两大体系,一个是ATA指令集,一个是SCSI指令集。SCSI指令集比ATA指令集高效,所以广泛用于服务器和磁盘阵列环境中。这些指令集,也可以称为协议,协议就是语言,就是让通信双方知道对方传过来的bit流里面到底包含了什么,怎么由笔划组成字,由字组成词,词组成句子,等等。


 

 

posted @ 2015-08-24 13:52  zxqstrong  阅读(1756)  评论(0编辑  收藏  举报