工作原理_工作原理详解 - CSDN
精华内容
参与话题
  • 内存(DRAM)的工作原理及时序介绍

    万次阅读 多人点赞 2015-09-20 23:05:29
    最近在学习高速电路的存储器设计,找到这篇对于存储器的DRAM介绍的比较通俗易懂的好文。

    内存是PC配件中结构最简单的,但在BIOS中却是最难调的,很多玩家超频都卡在内存上。并且,内存的原理、结构与时序多年不会改变,无论将来内存技术如何进步,相信这篇文章的存在价值都不会打折扣。本文亦希望能通过对DRAM基本原理以及时序的介绍,在内存设置以及XMP的制作上有所帮助。

    >>>目录<<<

    第一部分:工作原理

    DRAM基本组成
    内存地址
    寻址
    内存cell的基本操作
    硅晶体中的“电容”
    MOSFET的控制原理——水库模型
    储存数据
    写入数据
    读取数据


    第二部分:时序介绍

    时序及相关概念
    第一时序
    第二时序
    结语

     

    第一部分:工作原理

     

    DRAM基本组成

    内存是由DRAM(动态随机存储器)芯片组成的。DRAM的内部结构可以说是PC芯片中最简单的,是由许多重复的“单元”——cell组成,每一个cell由一个电容和一个晶体管(一般是N沟道MOSFET)构成,电容可储存1bit数据量,充放电后电荷的多少(电势高低)分别对应二进制数据0和1。由于电容会有漏电现象,因此过一段时间之后电荷会丢失,导致电势不足而丢失数据,因此必须经常进行充电保持电势,这个充电的动作叫做刷新,因此动态存储器具有刷新特性,这个刷新的操作一直要持续到数据改变或者断电。而MOSFET则是控制电容充放电的开关。DRAM由于结构简单,可以做到面积很小,存储容量很大。
    image001.png 

    内存地址

    内存中的cell按矩阵形排列,每一行和每一列都会有一个对应的行地址线路(正规叫法叫做word line)和列地址线路(正规叫法是bit line),每个具体的cell就挂接在这样的行地址线路和列地址线路上,对应一个唯一的行号和列号,把行号和列号组合在一起,就是内存的地址。
    image002.jpg 

    上图是Thaiphoon Burner的一个SPD dump,每个地址是一个字节。不过我们可以把这些数据假设成只有一个bit,当成是一个简单的内存地址表,左边竖着的是行地址,上方横着的是列地址。例如我们要找第七行、倒数第二列(地址为7E)的数据,它就只有一个对应的值:FD。当然了,在内存的cell中,它只能是0或者1。

    寻址

    数据要写入内存的一个cell,或者从内存中的一个cell读取数据,首先要完成对这个cell的寻址。寻址的过程,首先是将需要操作的cell的对应行地址信号和列地址信号输入行/列地址缓冲器,然后先通过行解码器(Row Decoder)选择特定的行地址线路,以激活特定的行地址。每一条行地址线路会与多条列地址线路和cell相连接,为了侦测列地址线路上微弱的激活信号,还需要一个额外的感应放大器(Sense Amplifier)放大这个信号。当行激活之后,列地址缓冲器中的列地址信号通过列解码器(Column Decoder)确定列地址,并被对应的感应放大器通过连接IO线路,这样cell就被激活,并可供读写操作,寻址完成。从行地址激活,到找到列地址这段时间,就是tRCD。
    image003.jpg

    内存cell的基本操作

    内存中的cell可以分为3个基本操作,数据的储存、写入与读取。为了便于理解,我不打算直接从电路控制上对cell操作进行说明,而是希望通过模型类比来达到说明问题的目的,如有不严谨之处,高手勿怪。要对内存cell进行读写操作,首先要完成上述寻址过程,并且电容的充电状态信号要被感应放大器感应到,并且放大,然后MOSFET打开,电容放电,产生电势变化,把电荷输送到IO线路,导致线路的电势也变化。当然,这只是个简单的描述,以下我们先来了解硅晶体中“电容”的结构和MOSFET的控制原理。

    硅晶体中的“电容”

    这里之所以“电容”两个字被打上引号,是因为硅晶体中并没有真正意义上的电容。硅晶体中的电容是由两个对置的触发器组成的等效电容。例如两个非门(Nor Gate)用如下图的方式对接。它可以通过周期性施加特定的输入信号,以把电荷保留在电路中,充当电容的作用。如下图,两个非门的输入端R和S互相交替做0和1输入,就可以把电荷储存在电路中。整个动态过程就是这样:
    2.gif



    而R和S的波形就是如下图所示,刚好互为反相,差半个周期:
    image006.png



    要让电容放电,我们只需要把R和S同时输入1或者0即可。因此这种电容的逻辑关系很简单:在同一时刻R和S输入状态不同(即存在电势差)时,电容为充电状态;在同一时刻R和S输入状态相同(即电势差为0)时,电容为放电状态。
    image008.png



    MOSFET的控制原理——水库模型

    要说明这个MOSFET的控制原理,我们借助一个水库的模型来说明。MOSFET有三个极,分别是源极(Source)、漏极(Drain)和栅极(Gate)。下图左边就是一个MOSFET的电路图,右边是我们画出的一个水库模型。
    image010.jpg



    图中S为源极,D为漏极,G为栅极。S极连接着电容,D级连接列地址线路,并接到数据IO,G则是控制电荷流出的阀门,连接行地址线路。电容在充电后电势会改变,这样S极的电势就会跟着改变,与D极形成电势差,而G极的电势,就决定了S极有多少电荷可以流入D极。由于电子是带负电荷,因此电子越多电势就越低。为了不至于混淆概念,我们把水池顶部电势定为0V,水池底部电势定为5V(仅举例说明,DRAM中的电容实际电压未必是5V)。当电子数量越多时,电势越低,接近0V,电子数量越少时,电势越高,接近5V。
    image012.jpg

     



    用水库模型说明,就是左边的水池水量升高(电容充电后),当阀门关闭时,左边的水是不会往右边流的。然后阀门打开(降低,电势升高),左边的水就可以往右边流,阀门的高度就决定了有多少水能流去右边的水道(但是在数字电路中,MOSFET只有开和关两种状态,因此下文提到的打开MOSFET就是全开);同样道理如果右边水多,阀门打开之后也可以向左边流。因此在水库模型中,电容就充当了左边的水池,而MOSFET的栅极就充当了阀门,列地址线路和IO则充当了右边的水道。

     

    储存数据

    MOSFET栅极电势为0V时,电容的电荷不会流出,因此数据就可以保存我们可以用2.5V为参考分界线,电容电势低于2.5V时,表示数据0,电势高于2.5V时,表示数据1。例如上一楼水库模型的左图,电容中储存的电子数高于一半的高度,电势低于2.5V,因此可以表示数据0。但以上只是理论情况,实际上电容会自然漏电,电子数量会逐渐减少,电势就会逐渐升高,当电势升高到2.5V以上时,数据就会出错,因此每隔一段时间必须打开MOSFET往电容中充电,以保持电势,这就是刷新。因此,数据的储存主要就是对电容中电势的保持操作。

    写入数据

    数据写入的操作分为写入0和写入1两种情况。写入前,电容原有的情况可能是高电势与低电势的状态,我们不用管它。写入0和写入1对cell的操作不尽相同,我们分别来看。

    先来看写入0的操作。写入开始时,IO线路上电势为0(水道处于水位最高点),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中的电势就跟着降低(水位升高),直到接近0V(水池被灌满),写入0完成,栅极电势降回0V,阀门关闭。

    write-0.jpg



    再看写入1的操作。写入开始时,IO线路上的电势为5V(水道水位为最低点),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中的电势跟着升高(水流出并降低水位)到接近5V,写入1完成,栅极电势回到0V,阀门关闭。
    write-1.jpg



    读取数据

    读取的时候,对漏极的电压操作跟写入有些不同。因为水道中的水比水池中的多,或者说水道的容量比水池要大得多。如果水道(漏极)的水为满或者空,在阀门打开的时候很容易出现水道的水倒灌进水池的现象,或是水池的水全部流去水道,这样就有可能导致电容中的电势状态改变,电容对应储存的0或者1也会改变。所以读取数据的时候,IO线路的电压应为1/2的满电势,即2.5V。

    读取也同样分读取0和1两种情况。在读取之前,电容中的电势应该是大于或者小于2.5V的,分别代表存储了1和0。由于刷新机制的存在,应该不会允许出现等于2.5V的情况。

    首先看读取0操作。电容中为低电势(假设为0V,水池为高水位),IO线路上电势升高至2.5V(这时水道水位比水池低),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中电势升高(水位降低),但由于水道容量较大,因此水位不会升高太多,但是总归也会有个电势的变低,最终电容与IO线路上的电势都变成0-2.5V的一个中间值,并且接近2.5V(假设为2.3V)。这时候感应放大器检测到IO线路上电势低于2.5V,因此识别出0读出。
    read-0.jpg



    再看读取1操作。电容中为高电势(假设为5V,水池空),IO线路上电势升高至2.5V(这时候水道水位比水池高),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中电势降低(水位升高),但由于水道容量较大,水位不会降低太多,不过多少也会降低一点(电势会升高),假设升高到2.7V。这时候感应放大器检测到IO线路的电势高于2.5V,识别出1读出。
    read-1.jpg

     



    以上讲述的只是从cell到内存IO线路的读写操作,至于CPU-IMC-内存的读写操作,不在本文讨论范围。

     

     

    第二部分:时序介绍

     

    时序及相关概念

    以下我把时序分为两部分,只是为了下文介绍起来作为归类,非官方分类方法。
    第一时序:CL-tRCD-tRP-tRAS-CR,就是我们常说的5个主要时序。
    第二时序:(包含所有XMP时序)

    在讲时序之前,我想先让大家明白一些概念。内存时钟信号是方波,DDR内存在时钟信号上升和下降时各进行一次数据传输,所以会有等效两倍传输率的关系。例如DDR3-1333的实际工作频率是666.7MHz,每秒传输数据666.7*2=1333百万次,即1333MT/s,也就是我们说的等效频率1333MHz,再由每条内存位宽是64bit,那么它的带宽就是:1333MT/s*64bit/8(8bit是一字节)=10667MB/s。所谓时序,就是内存的时钟周期数值,脉冲信号经过上升再下降,到下一次上升之前叫做一个时钟周期,随着内存频率提升,这个周期会变短。例如CL9的意思就是CL这个操作的时间是9个时钟周期。

    另外还要搞清楚一些基本术语:
    Cell:颗粒中的一个数据存储单元叫做一个Cell,由一个电容和一个N沟道MOSFET组成。
    Bank:8bit的内存颗粒,一个颗粒叫做一个bank,4bit的颗粒,正反两个颗粒合起来叫做一个bank。一根内存是64bit,如果是单面就是8个8bit颗粒,如果是双面,那就是16个4bit的颗粒分别在两面,不算ECC颗粒。
    Rank:内存PCB的一面所有颗粒叫做一个rank,目前在Unbuffered台式机内存上,通常一面是8个颗粒,所以单面内存就是1个rank,8个bank,双面内存就是2个rank,8个bank。Bank与rank的定义是SPD信息的一部分,在AIDA64中SPD一栏可以看到。
    DIMM:指一条可传输64bit数据的内存PCB,也就是内存颗粒的载体,算上ECC芯片,一条DIMM PCB最多可以容纳18个芯片。

    第一时序

    CAS Latency(CL):CAS即Column Address Strobe,列地址信号,它定义了在读取命令发出后到数据读出到IO接口的间隔时间。由于CAS在几乎所有的内存读取操作中都会生效(除非是读取到同一行地址中连续的数据,4bit颗粒直接读取间隔3个地址,8bit颗粒直接读取间隔7个地址,这时候CAS不生效),因此它是对内存读取性能影响最强的。如下图,蓝色的Read表示读取命令,绿色的方块表示数据读出IO,中间间隔的时间就是CL。
    image022.png



    已知CL时钟周期值CAS,我们可以使用以下公式来计算实际延迟时间tCAS:
    tCAS(ns)=(CAS*2000)/内存等效频率
    例如,DDR3-1333 CL9内存实际CAS延迟时间=(9*2000)/1333=13.50 ns
    或者反过来算,假如已知你的内存可以在7.5ns延迟下稳定工作,并且你想要DDR3-2000的频率,那么你可以把CL值设为8T(实际上8ns,大于7.5ns即可),如果你想要DDR3-1600的频率,那么你的CL值可以设到6T(实际7.5ns)。
    这个公式对于所有用时钟周期表示延迟的内存时序都可以用。

    说到这个公式,我想顺便说说大家对频率和时序的纠结问题。首先来回顾一下DDR一代到三代的一些典型的JEDEC规范,并按照上边那个公式算一下它的CL延迟时间:
    DDR-400 3-3-3-8:(3*2000)/400=15 ns
    DDR2-800 6-6-6-18:(6*2000)/800=15 ns
    DDR3-1333 9-9-9-24:刚才算了是13.5 ns

    再来看看每一代的超频内存的最佳表现(平民级,非世界纪录):
    DDR1 Winbond BH-5 DDR-500 CL1.5:(1.5*2000)/500=6 ns
    DDR2 Micron D9GMH DDR2-1400 CL4:(4*2000)/1400=5.71 ns
    DDR3 PSC A3G-A DDR3-2133 CL6:(6*2000)/2133=5.63 ns

    发现什么?不管是哪一代内存,随着频率提升,CL周期也同步提升,但是最后算出来的CL延迟时间却差不多。那么到了DDR4,JEDEC规范频率去到DDR4-4266,如果按照差不多的延迟,那么按照13ns多一些来算,那么CL值将达到28T!如果按照我们的极限超频延迟来算,DDR4-4266下的延迟也将达到12T。所以到了下一代DDR4,两位数的时钟周期将不可避免。

    所以,我想说的是,不要再去想什么DDR3的频率,DDR2的时序,在频宽严重过剩,IMC成为瓶颈的今天,它对性能没太多的提升。

    DRAM RAS to CAS Delay(tRCD):RAS的含义与CAS类似,就是行(Row)地址信号。它定义的是在内存的一个rank(内存的一面)之中,行地址激活(Active)命令发出之后,内存对行地址的操作所需要的时间。每一个内存cell就是一个可存储数据的地址,每个地址都有对应的行号和列号,每一行包含1024个列地址,当某一行地址被激活后,多个CAS请求会被发送以进行读写操作。简单的说,已知行地址位置,在这一行中找到相应的列地址,就可以完成寻址,进行读写操作,从已知行地址到找到列地址过去的时间就是tRCD。当内存中某一行地址被激活时,我们称它为“open page”。在同一时刻,同一个rank可以打开8个行地址(8个bank,也就是8个颗粒各一个)。下图显示一个行地址激活命令发出,到寻找列地址并发出读取指令,中间间隔的时间就是tRCD。tRCD值由于是最关键的寻址时间,它对内存最大频率影响最大,一般想要上高频,在加电压和放宽CL值不奏效的时候,我们都要放宽这个延迟。
    image024.png



    DRAM RAS Precharge Time(tRP):RAS预充电时间。它定义的是前一个行地址操作完成并在行地址关闭(page close)命令发出之后,准备对同一个bank中下一个行地址进行操作,tRP就是下一个行地址激活信号发出前对其进行的预充电时间。由于在行地址关闭命令发出之前,一个rank中的多个行地址可能正在被读写,tRP对内存性能影响不如CL和tRCD。虽然tRP的影响会随着多个行地址激活与关闭信号频繁操作一个bank而加大,但是它的影响会被bank interleaving(bank交叉操作)和command scheduling(命令调配)所削弱。交叉读写会交替使用不同的bank进行读写,减少对一个bank的操作频率;命令调配则是由CPU多线程访问不同的内存地址,同样是减少对一个bank的频繁操作次数。例如SNB CPU的内存控制器可以对读写操作命令进行有效地重新分配,以使得行地址激活命中率最大化(如果重复激活一个已经处于激活状态的行地址,那就是RAS激活命令未命中),所以tRP在SNB平台对性能的影响不大,并且放宽它有可能可以帮助提升稳定性。下图显示的是一个即将被激活的行地址开始预充电,到它被激活间隔的时间,就是tRP。
    image026.png



    DRAM RAS Active Time(tRAS):行地址激活的时间。它其实就是从一个行地址预充电之后,从激活到寻址再到读取完成所经过的整个时间,也就是tRCD+tCL的意思。这个操作并不会频繁发生,只有在空闲的内存新建数据的时候才会使用它。太紧的tRAS值,有可能会导致数据丢失或不完整,太宽的值则会影响内存性能,尤其是在内存使用量增加的时候。所以一般为了稳定性,我们设置tRAS≥tRTP+tRCD+CL即可(tRTP不是tRP,将在第二时序中介绍),尤其是PCB不好或者跑高频的时候,多几个周期比较稳妥。

    DRAM Command Mode(Command Rate,CR):首命令延迟,也就是我们平时说的1T/2T模式。是指从选定bank之后到可以发出行地址激活命令所经过的时间。CR可能对性能的影响有比较大的变数:如果CPU所需要的数据都在内存的一个行地址上,就不需要进行重复多次的bank选择,CR的影响就很小;但是如果一个rank中同时多个bank要激活行地址,或者不同的rank中不同bank需要同时激活的时候,CR对性能的影响就会提升。但是随着内存频率的提升,CR=1T/2T的时间差越短,它的影响就会越来越小,这就是我们看到DDR1的时候1T/2T对性能影响挺大,但是到了DDR3影响就很小的其中一个原因。但是为了性能最大化,我们尽量把CR设为1T,但是如果bank数很多的时候,例如插满四条内存,就有32个bank,bank选择随机性增大,1T的首命令时间可能会不稳定。

    所以,内存的基本读取操作的时序角度流程就是把上面那三张图合起来:预充电-激活行地址并寻找列地址-发送读取命令-读出数据,这四步操作中间的三个延迟就分别是tRP、tRCD和CL。和我们常说的时序顺序刚好是反过来的。
    第二时序——XMP

    DRAM CAS Write Latency(tWCL):列地址写入延迟,也就是DRAM的最小写入操作时间,与CL刚好是读写对应关系,一般跟CL值设为同一个值就是可以稳定的。由于内存读取之前必须先写入,所以这个值可以说与CL一样重要。但是在BIOS里一般没得设置,可能是与CL绑定了。

    DRAM Row Cycle Time(tRC):行周期时间。定义了同一bank两次行激活命令所间隔的最小时间,或者说是一个bank中完成一次行操作周期(Row Cycle)的时间,即tRP+tRAS(预充电加上激活的整个过程),tRC设得太紧可能会直接点开不了机,一般只要能进系统再多加一两个周期都是可以稳定的。下图显示的就是tRC的时间。
    image028.png



    DRAM Row Refresh Cycle Time(tRFC):行地址刷新周期,定义了一个bank中行地址刷新所需要的时间。重提一下刷新的含义,由于cell中电容的电荷在MOSFET关闭之后一段时间就会失去,为了维持数据,每隔很短一段时间就需要重新充电。这里多提一句,Intel平台和AMD平台对tRFC的含义不一样,AMD平台的tRFC是DRAM刷新延迟时间,单位是ns,通常有90/110/160/300几个值可以调整,也就是说它的tRFC时钟周期会随着频率的提升而提升;而Intel平台的单位则直接是时钟周期,相反地延迟时间会随着频率的提升而降低。容量大的bank行地址和cell会更多,刷新时间也更长,因此tRFC也要更高。另外,tRFC如果太快会导致数据出错,太慢则影响性能,但可以增加稳定性。

    DRAM Refresh Interval(tREFI):内存刷新时间间隔,也就是内存的刷新命令生效前要经过的时间。刷新的时间间隔一般取决于内存颗粒的容量(density),容量越大,就越需要频繁刷新,tREFI值就要越低。另外tREFI的时间也会受到内存工作温度与内存电压(Vdimm)影响,因为温度越高电容漏电越快。一般在AMD主板的BIOS里,这个值只有3.9us和7.8us可选,而在SNB平台,则是按时钟周期算,例如DDR3-1333下默认值为5199T,换算过来就是2000/1333x5199=7800ns,也就是7.8us。一般DRAM颗粒的spec中都是规定工作温度大于85度时采用3.9us。

    DRAM RAS to RAS Delay(tRRD):行地址间延迟,定义的是同一rank不同bank间两个连续激活命令的最短延迟,在DDR3时代一般最小是4T。它的作用和CR有点像,不过比CR更多的时候对性能有较大的影响,所以这个时序可尽量缩小。

    DRAM Write Recovery Time(tWR):内存写入恢复时间,它定义了内存从写入命令发出(从开始写入算起)到下一次预充电间隔的时间,也就是tRP的前一个操作。如果这个时间设得太短,可能会导致前一次写入未完成就开始下一次预充电,进行寻址,那么前一次写入的数据就会不完整,造成丢数据的情况。这个周期也是第二时序中比较长的,DDR3-2000一般需要10-14个周期,甚至更高。

    DRAM Read to Precharge Time(tRTP):与tWR类似,定义了同一rank上内存从读取命令发出到tRP之前的间隔时间,但是它在读取完成并且行地址关闭之后才会生效。单颗128MB的内存颗粒可以在DDR3-2000下运行在4到6个时钟周期,如果bank容量增大时,这个时序有可能要放宽。

    DRAM Four Active Window(tFAW):它定义了同一rank中允许同时发送大于四个行激活命令的间隔时间,因此最小值应该不小于tRRD的四倍。在DDR3上,tRRD的最小值是4T,因此tFAW的最小值就是16T。这个tFAW由于是在一个rank中大于四个bank同时激活之后才生效,因此在内存不是很繁忙的时候,它对性能的影响并不是很大。但是对一些频繁读写内存的操作(例如SuperPI 32M),tFAW对性能的影响可能会加大。由于现在内存用满的几率非常非常小,两根双面的内存更是有4个rank,配合上interleaving,一个rank中同时激活大于四个bank的几率应该不大,所以通常我们把它设为tRRD的四倍应该就不会出问题。

    DRAM Write to Read Delay(tWTR):内存写-读延迟,它定义的是内存写入命令发出后到下一个读取命令之间的时间间隔,最小为4T,与tRTP类似,提升内存的频率或者容量提升时,这个值需要提高。


    结语

    看完以上内容,我们已经对时序有了个大致的了解,现在应该可以知道一些时序设置时要注意什么了。比如tFAW要设为tRRD的四倍,tRAS不能设太低等等。还是那句话,内存是辅助CPU超频的,时序设置只是为了放开内存更多的超频空间,时序本身对性能的影响很小,并且随着频率的提升,或者bank数的增加,这种影响可能会进一步减小。具体不同的内存颗粒也会有不同的设置情况,还请大家多关注本站的颗粒汇总以及最新内存颗粒测试报告!

    展开全文
  • Web服务器工作原理详解(基础篇)

    万次阅读 多人点赞 2018-08-14 17:12:00
    概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而... ...

    概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的网络应用程序都可以是Web客户端。

    Web服务器和HTTP服务器可以说是同一个东西,当然非得细分的话,HTTP服务器是建立在HTTP协议之上的提供文档浏览的服务器,更多的是提供静态的文件。而Web服务器涵盖了HTTP服务器(这一点可以自行百度百科), Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。
    Web服务器 约等于 HTTP服务器 + 其他服务

    目前所熟知的Web服务器有很多,其最主流的是 Apache, Nginx, IIS
    各大Web服务器的实现细节都不同,是为了某种情形而设计开发的。但是它们的基础工作原理是相同的,这也是本次基础篇所讲解的内容。

    一、Web服务器工作原理图解

    这里写图片描述
    首先我们暂时不考虑HTTP协议的各种请求方式,我们先跟着**(Web服务器工作原理总体描述01)这张图,将一次Web服务的工作流程过一遍,我们假设以浏览器作为客户端
    (1) 用户做出了一个操作,可以是填写网址敲回车,可以是点击链接,可以是点击按键等,接着浏览器获取了该事件。
    (2) 浏览器与对端服务程序建立TCP连接。
    (3) 浏览器将用户的事件
    按照HTTP协议格式**打包成一个数据包,其实质就是在待发送缓冲区中的一段有着HTTP协议格式的字节流。
    (4) 浏览器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到对端服务程序。
    (5) 服务端程序拿到该数据包后,同样以HTTP协议格式解包,然后解析客户端的意图。
    (6) 得知客户端意图后,进行分类处理,或是提供某种文件、或是处理数据。
    (7) 将结果装入缓冲区,或是HTML文件、或是一张图片等。
    (8) 按照HTTP协议格式将(7)中的数据打包
    (9) 服务器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到客户端。
    (10) 浏览器拿到包后,以HTTP协议格式解包,然后解析数据,假设是HTML文件。
    (11) 浏览器将HTML文件展示在页面
    以上为Web服务器工作基本原理。其实不难发现,这仅仅只是一个简单的网络通信。我们应该深信,作为一个服务器,其根本的工作无非有三个

    1. 接收数据 2. 发送数据 3. 数据处理
      而Web服务器的本质就是 接收数据 ⇒ HTTP解析 ⇒ 逻辑处理 ⇒ HTTP封包 ⇒ 发送数据
      高级的服务器无非就是将这三个部分更加细致的设计了。

    二、Web服务器之提供静态文件工作原理图解

    Web服务器最主要的功能是提供静态的文件。日常的上网浏览大多是网页浏览,少数时候才会有一些数据的提交操作。因此,我们结合上一张图示来重点讲解在GET请求下的Web服务器工作原理。
    这里写图片描述
    其他流程基本不变,着重在于红色与蓝色部分。
    (1) 当用户点击一个网页链接或浏览器加载一些资源(css,jpg …)时产生。
    (6) 服务程序解包后,确定其为GET请求,并且是对该服务器上的某一资源的请求。首先服务程序会去确认该路径是否存在,再确定该路径的文件是否可以获取。
    (7-1) 如果请求的路径有误,或者该资源不能被用户获取,则返回错误提示页面。很多服务器的错误页面只有404,更专业的应该是将错误分类并返回对应的错误代码页面。
    (7-2) 如果该路径合法且文件可以被获取,那么服务程序将根据该文件类型进行不同的装载过程,记录其类型作为(8)中HTTP协议中对应的返回类型,并加入响应头。

    假设以点击一个页面链接为例,浏览器首先将HTML文件请求过来,再以同样的流程对HTML文件中包含的资源文件路径进行依次请求。
    这里写图片描述

    三、Web服务器之数据提交工作原理图解

    仅仅只是网页的浏览并不能满足所有人的需求,客户端与服务器应当是有数据交互的。
    即使单方面的资源请求任然是网络的主力军。
    我们应该清楚的知道,数据提交对于用户来说有什么作用。
    (1) 资源上传 (2) 登陆验证 (3) API接口调用 (4) 远程指令等
    数据提交使得用户的操作性有了质的飞跃,它使得HTTP短连接获取静态文件的方式提升到了动态交互的层次上。该性质也催化出各式各样的编程语言、框架。例如PHP,JavaWeb。
    如果你留意目前主流的那些大型服务器,你会发现再高级再牛逼的东西实际是也是最基础的东西建造的。那么我们还可以顺便学习一下最古老的动态技术CGI
    这里写图片描述
    其他流程基本不变,着重在于红色与蓝色部分。
    (1) 用户提交数据,假设用户点击一个按键提交填好的信息。在(3)中将以POST格式写入,并填入提交至服务端的可执行程序的路径。
    (6) 服务端将参数与该CGI绑定,复制进程,用管道传递参数和接收结果
    (7) 子进程执行CGI,接收(6)父进程传来的参数,运算完成返回结果。
    最后父进程将结果装入静态模板文件,放入缓冲区

    四、动态技术

    我们得明白,Web服务器是以短连接为主,并且获取的数据到达浏览器的那一刻一定是静态的不变的。那么所谓动态实际是指两种情况

    1. 服务端产生
      (1) 用户POST提交数据到某个程序,程序根据该数据作为参数运行,得出结果并装入静态的模板页面中,返回该静态页面。但对于用户来说,同一个页面,做了一个操作后数据不一样了。好了,这就是动态页面。(CGI原理)
      (2) PHP的原理是,用户GET请求一个php后缀的文件,服务器先执行该php后缀文件中的PHP代码,将结果填入代码的位置,再返回。当然也可以提交数据参与运算再返回。
    2. 客户端产生
      (1) 用户GET请求一个JavaScript文件,服务端不做任何运算返回该静态文件。浏览器收到该JS文件,在本地执行并更新页面。
      (2) 用户POST提交数据到服务端,服务端根据该提交的数据指令返回静态文件,浏览器收到后执行并更新。
    展开全文
  • 磁盘工作原理

    万次阅读 2018-11-19 14:51:52
    然后再将这些磁性图拷贝转换成原始数据,这便是磁存储的原理。 磁存储历史 在磁存储出现以前,初级电脑存储介质是1890年Herman Hollerith发明的穿孔卡片。 磁存储的历史可以追溯到1949年6月,一群IBM工程师和科学家...

    大多数永久性或办永久性电脑数据都是将磁盘上的一小片金属物质磁化来实现。然后再将这些磁性图拷贝转换成原始数据,这便是磁存储的原理。

    磁存储历史

    在磁存储出现以前,初级电脑存储介质是1890年Herman Hollerith发明的穿孔卡片。

    磁存储的历史可以追溯到1949年6月,一群IBM工程师和科学家那时正开始研发新的存储设备。他们当时研究的正是用于电脑的第一个磁存储设备,而这个设备改变了整个行业。在1952年5月21日,IBM发布了带IBM 701防御计算器的IBM 726磁带机,这标志着穿孔卡片计算器像电子计算机的变迁。

    四年之后,一小群IBM工程师率先将第一个电脑磁盘存储系统引入308 RAMAC(随机存储控制)计算机。

    305 RAMAC驱动可以在50个磁盘上保存5百万字符。个人数据保存密度仅为2kb/平方英尺。与磁盘驱动器不同,RAMAC的记录磁头可以直接到达每个磁盘表面的位置而不需要读取中间的信息。随机可访性曾有效提高电脑性能,这使得数据的保存和检索的速度都远快于保存在磁带上的速度。

    在60多年的发展中,磁存储行业可以在3.5英尺大小的驱动上存储3TB数据。

    磁场如何保存数据

    所有的磁存储设备都通过电磁学原理读写数据。基础物理原理认为电流通过导体的时候,导体周围会产生磁场。注意电子是从阴极流向阳极,如图所示,尽管我们通常认为电子是从阳极流向阴极。
    图1 电流通过时,在导线周围产生磁场

    电磁现象是1819年由汉斯·克里斯琴·奥斯特发现,当时他发现指南针在靠近通电的电线时无法准确指示方向。而电流通知后,指南针恢复正常。

    电线导体产生的磁场对其周围内的磁性物质会产生影响,当电流方向或电压极性变换时,磁极也随之变换。

    法拉第在1831年发现了另一个电磁效应。他发现如果导体通过移动的磁场,会产生电流。电流方向随磁极方向而改变。

    例如,将交流发电机应用于磁存储设备时,这种双向的电磁作用便能在磁盘上记录和读取数据。记录的时候,磁头将电脉冲变为磁场;而读取的时候又将磁场转为电脉冲。
    在这里插入图片描述
    磁存储设备中读写磁头是U型导体。U型磁头被线圈包裹,从而让电流通过。当电流通过线圈时,会在驱动磁头中产生磁场。实际上,磁头的电压可在两级快速改变。
    在这里插入图片描述
    组成存储介质的磁盘或磁带形成了一些介质形式,在此之上,存放了一层磁化物质。该物质通常是一些杂质氧化铁。存储介质上的灭个磁性粒子都有自己的磁场。介质为空时,这些磁场的磁极通常是杂乱的。由于每个粒子的磁场指示方向都随机,所以出现了相互抵消的情况,从而出现了无明显磁极的现象。

    当驱动的读写磁头产生磁场时,磁场会在U型磁铁的两级之间跳动。因为磁场通过导体逼通过空寂要容易,所以磁场会向外弯曲,然后利用临近的存储介质作为最短途径到达另一端。磁场直接穿过介质将磁性粒子极化,使其与磁场保持一致。磁极的方向由通过线圈的电流方向决定,在磁存储设备的开发过程中,读写磁头和介质之间的距离显著减少。这样被记录磁畴也会变小。而被记录的磁畴越小,数据保存的密度就越大。

    磁场穿过介质的时候,磁头下部区域的方向都相同。当粒子磁畴统一时,就不会长生相互抵消,于是会形成明显的磁场。由许多磁性粒子生成的这个本地磁场现在聚会整齐划一的产生一个可探测累积磁场。磁头中颠倒的磁通量会导致磁碟上磁化粒子磁极的颠倒。

    通量逆转时存储介质表面磁性粒子的磁极发生了改变。一个驱动磁头在介质上创建颠倒的磁通量是为了记录数据。驱动写入任何一个字节,它都会在介质上创造正-负和负-正的颠倒磁通量。在转换区域里的磁通量逆转被用来保存给定数据,这种方式被称之为编码。根据所使用的编码方式,驱动逻辑或控制器保存好数据后将其编码成一系列的通量逆转。

    在写入过程中,磁头被加入电压。由于电压极性改变,磁场电极也随之改变。磁通变换区在极性改变的地方被准确写下来。在读取过程中,磁头生成的信号与写入时的有出入。相反,磁头只在通过磁通逆转时产生了电压脉冲或尖峰电压。当正极变为负极,磁头探测到的脉冲就时负极。当负极变成正极,脉冲就是正极尖峰电压。这种效应之所以发生是因为导体只在以某种角度通过磁力线时才生成电流。由于磁头与磁场平行移动,所以磁头产生电压的唯一机会就是当它通过磁极或磁通变换区进行读取的时候。

    其实,从介质读取信息时,磁头就成磁通变换区的他测器,可以在通过变换区时产生电压脉冲。没有发生转变的区域则不会出现脉冲。下图展示了读取波形图和存储介质上记录的磁通变换区之间的关系。
    在这里插入图片描述
    你可以把写入模式看作是正负极电压的方波形。当电压为正极时,磁头会产生磁场,这样就把磁性介质导往同一个方向。波形改为负极时,磁场会把介质导向另一个方向。波形从正极转到负极时,磁碟上的磁通量也会改变方向,反之亦然。读取过程中,磁头会感知磁通变换区,并生成正负极脉冲波。而不是持续的波形。换言之,除非电压为零,否则磁头就可以探测到磁通量的变换,而且还生成了相应的正负脉冲。脉冲只在磁头通过介质上的磁通变换区时才出现。如果俩姐驱动转一圈的使用的时间,控制器电路就能确定脉冲是否在限定转换时间内衰减。

    磁头以读取模式经过存储介质时会生成脉冲电流,且可能产生大量噪音。驱动中的敏感电流和控制器会放大信号并对微弱脉冲解码成二进制数据,也就是最先被导入的数据。

    硬盘驱动和其它存储设备对数据的读写其实采用的是基本的电磁法则。电流通过磁体(磁头)时,磁体生成可以生成可以保存咋介质中的磁场,驱动写入数据。磁头再通过介质表面式则驱动读取数据。由于磁头在保存的磁场中会出现更改,所以它会产生微弱电流指示信号中食肉出现磁通变换区。

    展开全文
  • 硬盘内部硬件结构和工作原理详解

    万次阅读 2018-05-07 09:19:26
    硬盘的外部物理结构 一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标、型号、序列号、生产日期、容量、参数和主从设置方法等。这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义。...

    硬盘的外部物理结构

    一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标、型号、序列号、生产日期、容量、参数和主从设置方法等。这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义。

    硬盘主要由盘体、控制电路板和接口部件等组成,如图1-1所示。盘体是一个密封的腔体。硬盘的内部结构通常是指盘体的内部结构;控制电路板上主要有硬盘BIOS、硬盘缓存(即CACHE)和主控制芯片等单元,如图1-2所示;硬盘接口包括电源插座、数据接口和主、从跳线,如图1-3所示。


    图1-1 硬盘的外观


    图1-2 控制电路板


    图1-3 硬盘接口

    电源插座连接电源,为硬盘工作提供电力保证。数据接口是硬盘与主板、内存之间进行数据交换的通道,使用一根40针40线(早期)或40针80线(当前)的IDE接口电缆进行连接。新增加的40线是信号屏蔽线,用于屏蔽高速高频数据传输过程中的串扰。中间的主、从盘跳线插座,用以设置主、从硬盘,即设置硬盘驱动器的访问顺序。其设置方法一般标注在盘体外的标签上,也有一些标注在接口处,早期的硬盘还可能印在电路板上。

    此外,在硬盘表面有一个透气孔(见图1-1),它的作用是使硬盘内部气压与外部大气压保持一致。由于盘体是密封的,所以,这个透气孔不直接和内部相通,而是经由一个高效过滤器和盘体相通,用以保证盘体内部的洁净无尘,使用中注意不要将它盖住。

    硬盘的内部物理结构

    硬盘的内部结构通常专指盘体的内部结构。盘体是一个密封的腔体,里面密封着磁头、盘片(磁片、碟片)等部件,如图1-4所示。


    图1-4 硬盘内部结构

    硬盘的盘片是硬质磁性合金盘片,片厚一般在0.5mm左右,直径主要有1.8in(1in=25.4mm)、2.5in、3.5in和5.25in 4种,其中2.5in和3.5in盘片应用最广。盘片的转速与盘片大小有关,考虑到惯性及盘片的稳定性,盘片越大转速越低。一般来讲,2.5in硬盘的转速在5 400 r/min~7 200 r/ min之间;3.5in硬盘的转速在4 500 r/min~5 400 r/min之间;而5.25in硬盘转速则在3 600 r/min~4 500 r/min之间。随着技术的进步,现在2.5in硬盘的转速最高已达15 000 r/min,3.5in硬盘的转速最高已达12 000 r/min。

    有的硬盘只装一张盘片,有的硬盘则有多张盘片。这些盘片安装在主轴电机的转轴上,在主轴电机的带动下高速旋转。每张盘片的容量称为单碟容量,而硬盘的容量就是所有盘片容量的总和。早期硬盘由于单碟容量低,所以,盘片较多,有的甚至多达10余片,现代硬盘的盘片一般只有少数几片。一块硬盘内的所有盘片都是完全一样的,不然控制部分就太复杂了。一个牌子的一个系列一般都用同一种盘片,使用不同数量的盘片,就出现了一个系列不同容量的硬盘产品。

    盘体的完整构造如图1-5所示。


    图1-5 盘体的完整结构

    硬盘驱动器采用高精度、轻型磁头驱动/定位系统。这种系统能使磁头在盘面上快速移动,可在极短的时间内精确地定位在由计算机指令指定的磁道上。目前,磁道密度已高达5 400Tpi(每英寸磁道数)或更高;人们还在研究各种新方法,如在盘上挤压(或刻蚀)图形、凹槽和斑点等作为定位和跟踪标记,以提高到和光盘相等的道密度,从而在保持磁盘机高速度、高位密度和高可靠性的优势下,大幅度提高存储容量。

    硬盘驱动器内的电机都是无刷电机,在高速轴承支持下机械磨损很小,可以长时间连续工作。高速旋转的盘体产生明显的陀螺效应,所以,在硬盘工作时不宜搬动,否则,将增加轴承的工作负荷。为了高速存储和读取信息,硬盘驱动器的磁头质量小,惯性也小,所以,硬盘驱动器的寻道速度明显快于软驱和光驱。

    硬盘驱动器磁头与磁头臂及伺服定位系统是一个整体。伺服定位系统由磁头臂后的线圈和固定在底板上的电磁控制系统组成。由于定位系统限制,磁头臂只能在盘片的内外磁道之间移动。因此,不管开机还是关机,磁头总在盘片上;所不同的是,关机时磁头停留在盘片启停区,开机时磁头“飞行”在磁盘片上方。

     

    硬盘上的数据是如何组织与管理的呢?硬盘首先在逻辑上被划分为磁道、柱面以及扇区,其结构关系如图1-6所示。

    图1-6 磁头、柱面和扇区

    每个盘片的每个面都有一个读写磁头,磁盘盘面区域的划分如图1-7所示。磁头靠近主轴接触的表面,即线速度最小的地方,是一个特殊的区域,它不存放任何数据,称为启停区或着陆区(Landing Zone),启停区外就是数据区。在最外圈,离主轴最远的地方是“0”磁道,硬盘数据的存放就是从最外圈开始的。那么,磁头是如何找到“0”磁道的位置的呢?从图1-5中可以看到,有一个“0”磁道检测器,由它来完成硬盘的初始定位。“0”磁道是如此的重要,以致很多硬盘仅仅因为“0”磁道损坏就报废,这是非常可惜的。这种故障的修复技术在后面的章节中有详细的介绍。


    图1-7 硬盘盘片的启停区和数据区

    早期的硬盘在每次关机之前需要运行一个被称为Parking的程序,其作用是让磁头回到启停区。现代硬盘在设计上已摒弃了这个虽不复杂却很让人不愉快的小缺陷。硬盘不工作时,磁头停留在启停区,当需要从硬盘读写数据时,磁盘开始旋转。旋转速度达到额定的高速时,磁头就会因盘片旋转产生的气流而抬起,这时磁头才向盘片存放数据的区域移动。盘片旋转产生的气流相当强,足以使磁头托起,并与盘面保持一个微小的距离。这个距离越小,磁头读写数据的灵敏度就越高,当然对硬盘各部件的要求也越高。早期设计的磁盘驱动器使磁头保持在盘面上方几微米处飞行。稍后一些设计使磁头在盘面上的飞行高度降到约0.1μm~0.5μm,现在的水平已经达到0.005μm~0.01μm,这只是人类头发直径的千分之一。气流既能使磁头脱离开盘面,又能使它保持在离盘面足够近的地方,非常紧密地跟随着磁盘表面呈起伏运动,使磁头飞行处于严格受控状态。磁头必须飞行在盘面上方,而不是接触盘面,这种位置可避免擦伤磁性涂层,而更重要的是不让磁性涂层损伤磁头。但是,磁头也不能离盘面太远,否则,就不能使盘面达到足够强的磁化,难以读出盘上的磁化翻转(磁极转换形式,是磁盘上实际记录数据的方式)。

    硬盘驱动器磁头的飞行悬浮高度低、速度快,一旦有小的尘埃进入硬盘密封腔内,或者一旦磁头与盘体发生碰撞,就可能造成数据丢失,形成坏块,甚至造成磁头和盘体的损坏。所以,硬盘系统的密封一定要可靠,在非专业条件下绝对不能开启硬盘密封腔,否则,灰尘进入后会加速硬盘的损坏。另外,硬盘驱动器磁头的寻道伺服电机多采用音圈式旋转或直线运动步进电机,在伺服跟踪的调节下精确地跟踪盘片的磁道,所以,硬盘工作时不要有冲击碰撞,搬动时要小心轻放。

    这种硬盘就是采用温彻斯特(Winchester)技术制造的硬盘,所以也被称为温盘。其结构特点如下。

    ①磁头、盘片及运动机构密封在盘体内。

    ②磁头在启动、停止时与盘片接触,在工作时因盘片高速旋转,带动磁头“悬浮”在盘片上面呈飞行状态(空气动力学原理),“悬浮”的高度约为0.1μm~0.3μm,这个高度非常小,图1-8标出了这个高度与头发、烟尘和手指印的大小比较关系,从这里可以直观地“看”出这个高度有多“高”。


    图1-8 盘片结构及磁头高度示意图

    ③磁头工作时与盘片不直接接触,所以,磁头的加载较小,磁头可以做得很精致,检测磁道的能力很强,可大大提高位密度。

    ④磁盘表面非常平整光滑,可以做镜面使用。

    下面对“盘面”、“磁道”、“柱面”和“扇区”的含义逐一进行介绍。

    硬盘存储的逻辑结构

    1. 盘面号

    硬盘的盘片一般用铝合金材料做基片,高速硬盘也可能用玻璃做基片。玻璃基片更容易达到所需的平面度和光洁度,且有很高的硬度。磁头传动装置是使磁头部件作径向移动的部件,通常有两种类型的传动装置。一种是齿条传动的步进电机传动装置;另一种是音圈电机传动装置。前者是固定推算的传动定位器,而后者则采用伺服反馈返回到正确的位置上。磁头传动装置以很小的等距离使磁头部件做径向移动,用以变换磁道。

    硬盘的每一个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利用,都可以存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数。每一个这样的有效盘面都有一个盘面号,按顺序从上至下从“0”开始依次编号。在硬盘系统中,盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头。硬盘的盘片组在2~14片不等,通常有2~3个盘片,故盘面号(磁头号)为0~3或0~5。

    2. 磁道

    磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。磁道从外向内从0开始顺序编号。硬盘的每一个盘面有300~1 024个磁道,新式大容量硬盘每面的磁道数更多。信息以脉冲串的形式记录在这些轨迹中,这些同心圆不是连续记录数据,而是被划分成一段段的圆弧,这些圆弧的角速度一样。由于径向长度不一样,所以,线速度也不一样,外圈的线速度较内圈的线速度大,即同样的转速下,外圈在同样时间段里,划过的圆弧长度要比内圈划过的圆弧长度大。每段圆弧叫做一个扇区,扇区从“1”开始编号,每个扇区中的数据作为一个单元同时读出或写入。一个标准的3.5in硬盘盘面通常有几百到几千条磁道。磁道是“看”不见的,只是盘面上以特殊形式磁化了的一些磁化区,在磁盘格式化时就已规划完毕。

     

    3. 柱面

    所有盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。数据的读/写按柱面进行,即磁头读/写数据时首先在同一柱面内从“0”磁头开始进行操作,依次向下在同一柱面的不同盘面即磁头上进行操作,只在同一柱面所有的磁头全部读/写完毕后磁头才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。电子切换相当快,比在机械上磁头向邻近磁道移动快得多,所以,数据的读/写按柱面进行,而不按盘面进行。也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面来写,一个柱面写满后,才移到下一个扇区开始写数据。读数据也按照这种方式进行,这样就提高了硬盘的读/写效率。

    一块硬盘驱动器的圆柱数(或每个盘面的磁道数)既取决于每条磁道的宽窄(同样,也与磁头的大小有关),也取决于定位机构所决定的磁道间步距的大小。更深层的内容请参考其他书籍,限于篇幅,这里不再深入介绍。

    4. 扇区

    操作系统以扇区(Sector)形式将信息存储在硬盘上,每个扇区包括512个字节的数据和一些其他信息。一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段,如图1-9所示。


    图1-9 硬盘扇区的构成

    标识符就是扇区头标,包括组成扇区三维地址的三个数字:扇区所在的磁头(或盘面)、磁道(或柱面号)以及扇区在磁道上的位置即扇区号。头标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些硬盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束,以供控制器检验扇区头标的读出情况,确保准确无误。

    扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的ECC数字填入这个部分。

    扇区头标包含一个可识别磁道上该扇区的扇区号。有趣的是,这些扇区号物理上并不连续编号,它们不必用任何特定的顺序指定。扇区头标的设计允许扇区号可以从1到某个最大值,某些情况下可达255。磁盘控制器并不关心上述范围中什么编号安排在哪一个扇区头标中。在很特殊的情况下,扇区还可以共用相同的编号。磁盘控制器甚至根本就不管数据区有多大,只管读出它所找到的数据,或者写入要求它写的数据。

    给扇区编号的最简单方法是l,2,3,4,5,6等顺序编号。如果扇区按顺序绕着磁道依次编号,那么,控制器在处理一个扇区的数据期间,磁盘旋转太远,超过扇区间的间隔(这个间隔很小),控制器要读出或写入的下一扇区已经通过磁头,也许是相当大的一段距离。在这种情况下,磁盘控制器就只能等待磁盘再次旋转几乎一周,才能使得需要的扇区到达磁头下面。

    显然,要解决这个问题,靠加大扇区间的间隔是不现实的,那会浪费许多磁盘空间。许多年前,IBM的一位杰出工程师想出了一个绝妙的办法,即对扇区不使用顺序编号,而是使用一个交叉因子(interleave)进行编号。交叉因子用比值的方法来表示,如3﹕1表示磁道上的第1个扇区为1号扇区,跳过两个扇区即第4个扇区为2号扇区,这个过程持续下去直到给每个物理扇区编上逻辑号为止。例如,每磁道有17个扇区的磁盘按2﹕1的交叉因子编号就是:l,10,2,11,3,12,4,13,5,14,6,15,7,16,8,17,9,而按3﹕1的交叉因子编号就是:l,7,13,2,8,14,3,9,15,4,10,16,5,11,17,6,12。当设置1﹕l的交叉因子时,如果硬盘控制器处理信息足够快,那么,读出磁道上的全部扇区只需要旋转一周;但如果硬盘控制器的后处理动作没有这么快,磁盘所转的圈数就等于一个磁道上的扇区数,才能读出每个磁道上的全部数据。将交叉因子设定为2﹕1时,磁头要读出磁道上的全部数据,磁盘只需转两周。如果2﹕1的交叉因子仍不够慢,磁盘旋转的周数约为磁道的扇区数,这时,可将交叉因子调整为3﹕1,如图1-10所示。


    图1-10 不同交叉因子的效果示例

    图1-10所示的是典型的MFM(Modified Frequency Modulation,改进型调频制编码)硬盘,每磁道有17个扇区,画出了用三种不同的扇区交叉因子编号的情况。最外圈的磁道(0号柱面)上的扇区用简单的顺序连续编号,相当于扇区交叉因子是1﹕1。1号磁道(柱面)的扇区按2﹕1的交叉因子编号,而2号磁道按3﹕1的扇区交叉因子编号。

    早期的硬盘管理工作中,设置交叉因子需要用户自己完成。用BIOS中的低级格式化程序对硬盘进行低级格式化时,就需要指定交叉因子,有时还需要设置几种不同的值来比较其性能,而后确定一个比较好的值,以期硬盘的性能较好。现在的硬盘BIOS已经自己解决这个问题,所以,一般低级格式化程序不再提供这一选项设置。

    系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路,还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁盘继续旋转。由于对信息的后处理需要耗费一定的时间,在这段时间内,磁盘已转了相当的角度。

    交叉因子的确定是一个系统级的问题。一个特定硬盘驱动器的交叉因子取决于:磁盘控制器的速度、主板的时钟速度、与控制器相连的输出总线的操作速度等。如果磁盘的交叉因子值太高,就需多花一些时间等待数据在磁盘上存入和读出。如果交叉因子值太低,就会大大降低磁盘性能。

    前面已经述及,系统在磁盘上写入信息时,写满一个磁道后转到同一柱面的下一个磁头,当柱面写满时,再转向下一柱面。从同一柱面的一个磁道到另一个磁道,从一个柱面转到下一个柱面,每一个转换都需要时间,在此期间磁盘始终保持旋转,这就会带来一个问题:假定系统刚刚结束对一个磁道前一个扇区的写入,并且已经设置了最佳交叉因子比值,现在准备在下一磁道的第一扇区写入,这时,必须等到磁头转换好,让磁头部件重新准备定位在下一道上。如果这种操作占用的时间超过了一点,尽管是交叉存取,磁头仍会延迟到达。这个问题的解决办法是以原先磁道所在位置为基准,把新的磁道上全部扇区号移动约一个或几个扇区位置,这就是磁头扭斜。磁头扭斜可以理解为柱面与柱面之间的交叉因子,已由生产厂设置好,用户一般不用去改变它。磁头扭斜的更改比较困难,但是,它们只在文件很长、超过磁道结尾进行读出和写入时才发挥作用,所以,扭斜设置不正确所带来的时间损失比采用不正确的扇区交叉因子值带来的损失要小得多。交叉因子和磁头扭斜可用专用工具软件来测试和更改。更具体的内容这里就不再详述,毕竟现在很多用户都没有见过这些参数。

    扇区号存储在扇区头标中,扇区交叉因子和磁头扭斜的信息也存放在这里。最初,硬盘低级格式化程序只是行使有关磁盘控制器的专门职能来完成设置任务。由于这个过程可能破坏低级格式化的磁道上的全部数据,也极少采用。

    扇区交叉因子由写入到扇区头标中的数字设定,所以,每个磁道可以有自己的交叉因子。在大多数驱动器中,所有磁道都有相同的交叉因子。但有时因为操作上的原因,也可能导致各磁道有不同的扇区交叉因子。如在交叉因子重置程序工作时,由于断电或人为中断,就会造成一些磁道的交叉因子发生了改变,而另一些磁道的交叉因子没有改变。这种不一致性对计算机不会产生不利影响,只是有最佳交叉因子的磁道要比其他磁道的工作速度更快。

     

    4.簇

    将物理相邻的若干个扇区称为了一个簇。操作系统读写磁盘的基本单位是扇区,而文件系统的基本单位是簇(Cluster)。在Windows下,随便找个几字节的文件,在其上面点击鼠标右键选择属性,看看实际大小与占用空间两项内容,如大小:15 字节 (15 字节), 占用空间:4.00 KB (4,096 字节)。这里的占用空间就是你机器分区的簇大小,因为再小的文件都会占用空间,逻辑基本单位是4K,所以都会占用4K。 簇一般有这几类大小 4K,8K,16K,32K,64K等。簇越大存储性能越好,但空间浪费严重。簇越小性能相对越低,但空间利用率高。NTFS格式的文件系统簇的大小为4K。

     

     

     

     

    硬盘读写数据的过程

    现代硬盘寻道都是采用CHS(Cylinder Head Sector)的方式,硬盘读取数据时,读写磁头沿径向移动,移到要读取的扇区所在磁道的上方,这段时间称为寻道时间(seek time)。因读写磁头的起始位置与目标位置之间的距离不同,寻道时间也不同。目前硬盘一般为2到30毫秒,平均约为9毫秒。磁头到达指定磁道后,然后通过盘片的旋转,使得要读取的扇区转到读写磁头的下方,这段时间称为旋转延迟时间(rotational latencytime)。

    一个7200(转/每分钟)的硬盘,每旋转一周所需时间为60×1000÷7200=8.33毫秒,则平均旋转延迟时间为8.33÷2=4.17毫秒(平均情况下,需要旋转半圈)。平均寻道时间和平均选装延迟称为平均存取时间。

    所以,最后看一下硬盘的容量计算公式:
    硬盘容量=盘面数×柱面数×扇区数×512字节


    在博文“Linux启动过程分析”中我们提到过MBR,它是存在于硬盘的0柱面,0磁头,1扇区里,占512字节的空间。这512字节里包含了主引导程序Bootloader和磁盘分区表DPT。其中Bootloader占446字节,分区表占64字节,一个分区要占用16字节,64字节的分区表只能被划分4个分区,这也就是目前我们的硬盘最多只能支持4个分区记录的原因。

     

     

     

    即,如果你将硬盘分成4个主分区的话,必须确保所有的磁盘空间都被使用了(这不是废话么),一般情况下我们都是划分一个主分区加一个扩展分区,然后在扩展分区里再继续划分逻辑分区。当然,逻辑分区表也需要分区表,它是存在于扩展分区的第一个扇区里,所以逻辑分区的个数最多也只能有512/16=32个,并不是想分多少个逻辑分区都可以。
    注意,我们所说的扩展分区也是要占用分区表项的。例如,如果我们的硬盘只划分一个主分区和一个逻辑分区,此时的分区表的排列如下:

       Device Boot      Start         End      Blocks   Id  System

    /dev/sda1   *           1          19      152586   83  Linux

    /dev/sda2              20        2569    20482875   83  Extended

    /dev/sda5            2570        19457     4128705   82  Linux

    主分区为1号分区,扩展分区占用了2号分区,3和4号扩展分区被预留了下来,逻辑分区从5开始编号依次递增,这里我们只划分了一个逻辑分区。

     

     

     

     

    磁盘读写数据所花费的时间

    在了解了硬盘的基本原理之后,不难推算出,磁盘上数据读取和写入所花费的时间可以分为三个部分。

     

    1.寻道时间

    所谓寻道时间,其实就是磁臂移动到指定磁道所需要的时间,这部分时间又可以分为两部分:
    寻道时间=启动磁臂的时间+常数*所需移动的磁道数
    其中常数和驱动器的的硬件相关,启动磁臂的时间也和驱动器的硬件相关

     

     

     

    2.旋转延迟

    旋转延迟指的是把扇区移动到磁头下面的时间。这个时间和驱动器的转数有关,我们通常所说的7200转的硬盘的转就是这个。
    平均旋转延迟=1/(2*转数每秒)
    比如7200转的硬盘的平均旋转延迟等于1/2*120≈4.17ms
    旋转延迟只和硬件有关。

    3.传输时间
    传输时间指的是从磁盘读出或将数据写入磁盘的时间。
    这个时间等于:所需要读写的字节数/每秒转速*每扇区的字节数

     

     

     

     

     

    磁盘调度算法

    通过上面硬盘读写数据所分的三部分时间不难看出,大部分参数是和硬件相关的,操作系统无力优化。只有所需移动的磁道数是可以通过操作系统来进行控制的,所以减少所需移动的磁道数是减少整个硬盘的读写时间的唯一办法。

    因为操作系统内可能会有很多进程需要调用磁盘进行读写,因此合理的安排磁头的移动以减少寻道时间就是磁盘调度算法的目的所在,几种常见的磁盘调度算法如下。

     

     

     

     

     

    1.先来先服务算法(FCFS)

    这种算法将对磁盘的IO请求进行排队,按照先后顺序依次调度磁头。这种算法的特点是简单,合理,但没有减少寻道时间

     

     

     

     

    2.最短寻道时间算法(SSFT)

    这种算法优先执行所需读写的磁道离当前磁头最近的请求。这保证了平均寻道时间的最短,但缺点显而易见:离当前磁头比较远的寻道请求有可能一直得不到执行,这也就是所谓的“饥饿现象”。

     

     

     

     

    3.扫描算法(SCAN)

    这种算法在磁头的移动方向上选择离当前磁头所在磁道最近的请求作为下一次服务对象,这种改进有效避免了饥饿现象,并且减少了寻道时间。但缺点依然存在,那就是不利于最远一端的磁道访问请求。

     

     

     

     

    3.循环扫描算法(CSCAN)

    也就是俗称的电梯算法,这种算法是对最短寻道时间算法的改进。这种算法就像电梯一样,只能从1楼上到15楼,然后再从15楼下到1楼。这种算法的磁头调度也是如此,磁头只能从最里磁道到磁盘最外层磁道。然后再由最外层磁道移动到最里层磁道,磁头是单向移动的,在此基础上,才执行和最短寻道时间算法一样的,离当前磁头最近的寻道请求。这种算法改善了SCAN算法,消除了对两端磁道请求的不公平。

     

     

     

     

    其它优化手段以及SQL Server是如何利用这些手段

    除去上面通过磁盘调度算法来减少寻道时间之外。还有一些其它的手段同样可以利用,在开始之前,我首先想讲一下局部性原理。

     

     

     

     

    局部性原理

    所谓的局部性原理分为时间和空间上的。由于程序是顺序执行的,因此当前数据段附近的数据有可能在接下来的时间被访问到。这就是所谓的空间局部性。而程序中还存在着循环,因此当前被访问的数据有可能在短时间内被再次访问,这就是所谓的时间局部性原理。

    因此在了解了局部性原理之后,我们可以通过以下几个手段来减少磁盘的IO。

     

     

     

     

    提前读(Read-Ahead)

    提前读也被称为预读。根据磁盘原理我们不难看出,在磁盘读取数据的过程中,真正读取数据的时间只占了很小一部分,而大部分时间花在了旋转延迟和寻道时间上,因此根据空间局部性原理,SQL Server每次读取数据的时间不仅仅读取所需要的数据,还将所请求数据附近的数据进行读取。这在SQL Server中被称为预读。SQL Server通过预读可以有效的减少IO请求。

     

     

     

     

    延迟写(Delayed write)

    同样,根据时间局部性原理,最近被访问的数据有可能再次被访问,因此当数据更改之后不马上写回磁盘,而是继续放在内存中,以备接下来的请求读取或者修改,是减少磁盘IO的另一个有效手段,在SQL Server中,实现延迟写是buffer pool,当一个修改请求被commit之后,并不会立刻写回磁盘,而是将修改的页标记为“脏”,然后根据某种机制通过checkpoint或lazy writer写回磁盘,关于checkpoint和lazy writer的原理,可以参考我之前的文章:浅谈SQL Server中的事务日志(二)—-事务日志在修改数据时的角色.

     

     

     

     

    优化物理分布

     

     

    根据磁盘原理不难看出,如果所请求的数据在磁盘物理磁道之间是连续的,那么会减少磁头的移动距离,从而减少了寻道时间。因此相关的数据放在连续的物理空间上会减少寻道时间。SQL Server中,通过聚集索引使得数据根据主键在物理磁盘上连续,从而减少了寻道时间。

     

        文章转载自:https://blog.csdn.net/odeviloo/article/details/53708028

    展开全文
  • HTTP详解(1)-工作原理

    万次阅读 多人点赞 2013-03-16 23:24:05
    ...它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。...在了解HTTP如何工作之前,我...
  • 显卡工作原理

    万次阅读 2019-03-05 15:43:01
    1)显卡工作流程 图像或者视频数据一旦离开CPU,必须通过4个步骤,才会到达显示器: 1、从总线进入GPU(Graphics Processing Unit,图形处理器):将CPU送来的数据总线,再从总线送到GPU里面进行处理。 2、从GPU进入...
  • 区块链的基本概念和工作原理

    万次阅读 2018-06-26 17:14:43
    区块链的基本概念和工作原理1、基本概念区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。区块链...
  • Eureka工作原理

    万次阅读 多人点赞 2019-07-03 10:46:48
    Eureka 工作原理 上节内容为大家介绍了,注册中心 Eureka 产品的使用,以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka,了解它的相关概念、工作流程机制等。 Eureka 作为 Spring Cloud...
  • Mybatis工作原理

    万次阅读 多人点赞 2018-06-24 00:16:53
    本片博客针对Mybatis内部工作原理进行阐述。 一、Mybatis工作原理图 mybatis 原理图如下所示: 二、工作原理解析 mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也...
  • 认识CPU的工作原理

    万次阅读 2018-08-01 11:40:18
    学习CPU的工作原理 在了解CPU的工作原理之前,先简单谈谈CPU是如何生产出来的。 CPU是在特别纯净的硅材料上制造的。一个CPU的芯片包含上百万个精巧的晶体管。人们在一块指甲盖大小的硅片上,用化学的方法蚀刻或...
  • SpringMVC工作原理

    万次阅读 多人点赞 2013-11-25 11:19:08
    SpringMVC框架介绍  1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置...
  • ULN2003的基本介绍 ULN2003的概述 ...ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。 ULN2003...
  • MPU6050工作原理及STM32控制MPU6050

    万次阅读 多人点赞 2017-08-01 21:49:48
    要想知道MPU6050工作原理,得先了解下面俩个传感器:①陀螺仪传感器: 陀螺仪的原理就是,一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向。然后用多种方法读取...
  • MTCNN工作原理

    万次阅读 多人点赞 2018-11-01 17:47:26
    MTCNN工作原理 MTCNN是什么 MTCNN,Multi-task convolutional neural network(多任务卷积神经网络),将人脸区域检测与人脸关键点检测放在了一起,基于cascade框架。总体可分为PNet、RNet、和ONet三层网络结构, ...
  • Java虚拟机工作原理详解

    万次阅读 多人点赞 2012-12-21 15:03:32
     从这个框图很容易从大体上了解java程序工作原理。首先,你写好java代码,保存到硬盘当中。然后你在命令行中输入javac YourClassName.java此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者...
  • Webservice工作原理及实例

    万次阅读 多人点赞 2016-04-04 23:12:08
    Web Service工作原理 一、Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的...
  • DDR工作原理

    万次阅读 多人点赞 2018-06-21 18:57:44
    DDR SDRAM全称为Double Data Rate SDRAM,中文名为“双倍数据流SDRAM”。...本文只着重讲讲DDR的原理和DDR SDRAM相对于传统SDRAM(又称SDR SDRAM)的不同。 DDR的核心频率、时钟频率和数据传输频率: ...
  • 冠状病毒疫情期间,额温枪脱销了,一枪难求,额温枪成了名副其实的防疫物质,此篇博客讲述额温枪的工作原理
  • Boost电路的结构及工作原理

    万次阅读 2019-01-14 20:52:59
    Boost电路定义  Boost升压电路的英文名称为“theboostconverter”,或者叫“step-upconverter”,是一种开关直流升压电路,它能够将直流电变为另一固定电压或可调电压的直流电,也称为直流—直流变换器(DC/...
  • SpringMVC工作原理(含案例图解)

    万次阅读 多人点赞 2018-07-05 17:35:53
    SpimgMVC工作原理 第1步:浏览器发送指定的请求都会交给DispatcherServlet,他会委托其他模块进行真正的业务和数据处理 第2步:DispatcherServlet会查找到HandleMapping,根据浏览器的请求找到对应的Controller,并...
1 2 3 4 5 ... 20
收藏数 1,135,910
精华内容 454,364
关键字:

工作原理