zoukankan      html  css  js  c++  java
  • 如何做磁盘阵列和磁盘镜象

          磁盘阵列是把多个磁盘组成一个阵列,当作单一磁盘使用,它将数据以分段(striping)的方式储存在不同的磁盘中,存取数据时,阵列中的相关磁盘一起动作,大幅减低数据的存取时间,同时有更佳的空间利用率。磁盘阵列所利用的不同的技术,称为RAIDlevel,不同的level针对不同的系统及应用,以解决数据安全的问题。目前业界公认的标准是RAID0~RAID5。这个level并不代表技术的高低,level5并不高于level3,level1也不低过level4,至于要选择那一种RAIDlevel的产品,纯视用户的操作环境(operatingenvironment)及应用(application)而定,与level的高低没有必然的关系。 RAID1 RAID1是使用磁盘镜像(diskmirroring)的技术。


      磁盘镜像应用在RAID1之前就在很多系统中使用,它的方式是在工作磁盘(workingdisk)之外再加一额外的备份磁盘(backupdisk),两个磁盘所储存的数据完全一样,数据写入工作磁盘的同时亦写入备份磁盘。磁盘镜像不见得就是RAID1,如NovellNetware亦有提供磁盘镜像的功能,但并不表示Netware有了RAID1的功能。一般磁盘镜像和RAID1有二点最大的不同: RAID1无工作磁盘和备份磁盘之分,多个磁盘可同时动作而有重叠(overlaping)读取的功能,甚至不同的镜像磁盘可同时作写入的动作,这是一种最佳化的方式,称为负载平衡(load-balance)。例如有多个用户在同一时间要读取数据,系统能同时驱动互相镜像的磁盘,同时读取数据,以减轻系统的负载,增加I/O的性能。

      RAID1的磁盘是以磁盘延伸的方式形成阵列,而数据是以数据分段的方式作储存,因而在读取时,它几乎和RAID0有同样的性能。从RAID的结构就可以很清楚的看出RAID1和一般磁盘镜像的不同。 RAID2 RAID2是把数据分散为位(bit)或块(block),加入海明码HammingCode,在磁盘阵列中作间隔写入(interleaving)到每个磁盘中,而且地址(address)都一样,也就是在各个磁盘中,其数据都在相同的磁道(cylinderortrack)及扇区中。RAID2的设计是使用共轴同步(spindlesynchronize)的技术,存取数据时,整个磁盘阵列一起动作,在各作磁盘的相同位置作平行存取,所以有最好的存取时间(accesstime),其总线(bus)是特别的设计,以大带宽(bandwide)并行传输所存取的数据,所以有最好的传输时间(transfertime)。在大型档案的存取应用,RAID2有最好的性能,但如果档案太小,会将其性能拉下来,因为磁盘的存取是以扇区为单位,而RAID2的存取是所有磁盘平行动作,而且是作单位元的存取,故小于一个扇区的数据量会使其性能大打折扣。RAID2是设计给需要连续且大量数据的电脑使用的,如大型电脑(mainframetosupercomputer)、作影像处理或CAD/CAM的工作站(workstation)等,并不适用于一般的多用户环境、网络服务器(networkserver),小型机或PC。 RAID2的安全采用内存阵列(memoryarray)的技术,使用多个额外的磁盘作单位错误校正(single-bitcorrection)及双位错误检测(double-bitdetection);至于需要多少个额外的磁盘,则视其所采用的方法及结构而定,例如八个数据磁盘的阵列可能需要三个额外的磁盘,有三十二个数据磁盘的高档阵列可能需要七个额外的磁盘。 RAID3 RAID3的数据储存及存取方式都和RAID2一样,但在安全方面以奇偶校验(paritycheck)取代海明码做错误校正及检测,所以只需要一个额外的校检磁盘(paritydisk)。奇偶校验值的计算是以各个磁盘的相对应位作XOR的逻辑运算,然后将结果写入奇偶校验磁盘,任何数据的修改都要做奇偶校验计算 如某一磁盘故障,换上新的磁盘后,整个磁盘阵列(包括奇偶校验磁盘)需重新计算一次,将故障磁盘的数据恢复并写入新磁盘中;如奇偶校验磁盘故障,则重新计算奇偶校验值,以达容错的要求.

      较之RAID1及RAID2,RAID3有85%的磁盘空间利用率,其性能比RAID2稍差,因为要做奇偶校验计算;共轴同步的平行存取在读档案时有很好的性能,但在写入时较慢,需要重新计算及修改奇偶校验磁盘的内容。RAID3和RAID2有同样的应用方式,适用大档案及大量数据输出入的应用,并不适用于PC及网络服务器。 RAID4 RAID4也使用一个校验磁盘,但和RAID3不一样。RAID4是以扇区作数据分段,各磁盘相同位置的分段形成一个校验磁盘分段(parityblock),放在校验磁盘。这种方式可在不同的磁盘平行执行不同的读取命今,大幅提高磁盘阵列的读取性能;但写入数据时,因受限于校验磁盘,同一时间只能作一次,启动所有磁盘读取数据形成同一校验分段的所有数据分段,与要写入的数据做好校验计算再写入。即使如此,小型档案的写入仍然比RAID3要快,因其校验计算较简单而非作位(bitlevel)的计算;但校验磁盘形成RAID4的瓶颈,降低了性能,因有RAID5而使得RAID4较少使用。 RAID5 RAID5避免了RAID4的瓶颈,方法是不用校验磁盘而将校验数据以循环的方式放在每一磁盘中。磁盘阵列的第一个磁盘分段是校验值,第二个磁盘至后一个磁盘再折回第一个磁盘的分段是数据,然后第二个磁盘的分段是校验值,从第三个磁盘再折回第二个磁盘的分段是数据,以此类推,直到放完为止。图中的第一个parityblock是由A0,A1...,B1,B2计算出来,第二个parityblock是由B3,B4,...,C4,D0计算出来,也就是校验值是由各磁盘同一位置的分段的数据所计算出来。这种方式能大幅增加小档案的存取性能,不但可同时读取,甚至有可能同时执行多个写入的动作,如可写入数据到磁盘1而其parityblock在磁盘2,同时写入数据到磁盘4而其parityblock在磁盘1,这对联机交易处理(OLTP,On-LineTransactionProcessing)如银行系统、金融、股市等或大型数据库的处理提供了最佳的解决方案(solution),因为这些应用的每一笔数据量小,磁盘输出入频繁而且必须容错。

      事实上RAID5的性能并无如此理想,因为任何数据的修改,都要把同一parityblock的所有数据读出来修改后,做完校验计算再写回去,也就是RMWcycle(Read-Modify-Writecycle,这个cycle没有包括校验计算);正因为牵一而动全身,所以: R:N(可同时读取所有磁盘) W:1(可同时写入磁盘数) S:N-1(利用率) RAID5的控制比较复杂,尤其是利用硬件对磁盘阵列的控制,因为这种方式的应用比其他的RAIDlevel要掌握更多的事情,有更多的输出入需求,既要速度快,又要处理数据,计算校验值,做错误校正等,所以价格较高;其应用最好是OLTP,至于用于图像处理等,不见得有最佳的性能。 RAID0及RAID1适用于PC及PC相关的系统如小型的网络服务器(networkserver)及需要高磁盘容量与快速磁盘存取的工作站等,比较便宜;RAID3及RAID4适用于大型电脑及影像、CAD/CAM等处理;RAID5多用于OLTP,因有金融机构及大型数据处理中心的迫切需要,故使用较多而较有名气,RAID2较少使用,其他如RAID6,RAID7,乃至RAID10等,都是厂商各做各的,并无一致的标准.



    =============================================================================


      一、什么是RAID?其具备哪些常用的工具模式?

      即然提到了RAID磁盘阵列,那么我们就先来了解一下什么是RAID?所谓的RAID,是Redundant Arrays of Independent Disks的简称,中文为廉价冗余磁盘阵列。由1987年由加州大学伯克利分校提出的,初衷是为了将较廉价的多个小磁盘进行组合来替代价格昂贵的大容量磁盘,希望单个磁盘损坏后不会影响到其它磁盘的继续使用,使数据更加的安全。RAID作为一种廉价的磁盘冗余阵列,能够提供一个独立的大型存储设备解决方案。在提高硬盘容量的同时,还能够充分提高硬盘的速度,使数据更加安全,更加易于磁盘的管理。

      了解RAID基本定义以后,我们再来看看RAID的几种常见工作模式。

      1、RAID 0

      RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术。RAID 0是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID 0没有提供冗余或错误修复能力,是实现成本是最低的。

      RAID 0最简单的实现方式就是把N块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起创建一个大的卷集。在使用中电脑数据依次写入到各块硬盘中,它的最大优点就是可以整倍的提高硬盘的容量。如使用了三块80GB的硬盘组建成RAID 0模式,那么磁盘容量就会是240GB。其速度方面,各单独一块硬盘的速度完全相同。最大的缺点在于任何一块硬盘出现故障,整个系统将会受到破坏,可靠性仅为单独一块硬盘的1/N。

      为了解决这一问题,便出一了RAID 0的另一种模式。即在N块硬盘上选择合理的带区来创建带区集。其原理就是将原先顺序写入的数据被分散到所有的四块硬盘中同时进行读写。四块硬盘的并行操作使同一时间内磁盘读写的速度提升了4倍。

      在创建带区集时,合理的选择带区的大小非常重要。如果带区过大,可能一块磁盘上的带区空间就可以满足大部分的I/O操作,使数据的读写仍然只局限在少数的一、两块硬盘上,不能充分的发挥出并行操作的优势。另一方面,如果带区过小,任何I/O指令都可能引发大量的读写操作,占用过多的控制器总线带宽。因此,在创建带区集时,我们应当根据实际应用的需要,慎重的选择带区的大小。

      带区集虽然可以把数据均匀的分配到所有的磁盘上进行读写。但如果我们把所有的硬盘都连接到一个控制器上的话,可能会带来潜在的危害。这是因为当我们频繁进行读写操作时,很容易使控制器或总线的负荷超载。为了避免出现上述问题,建议用户可以使用多个磁盘控制器。最好解决方法还是为每一块硬盘都配备一个专门的磁盘控制器。

      虽然RAID 0可以提供更多的空间和更好的性能,但是整个系统是非常不可靠的,如果出现故障,无法进行任何补救。所以,RAID 0一般只是在那些对数据安全性要求不高的情况下才被人们使用。

      2、RAID 1

      RAID 1称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行,当一块硬盘失效时,系统会忽略该硬盘,转而使用剩余的镜像盘读写数据,具备很好的磁盘冗余能力。虽然这样对数据来讲绝对安全,但是成本也会明显增加,磁盘利用率为50%,以四块80GB容量的硬盘来讲,可利用的磁盘空间仅为160GB。另外,出现硬盘故障的RAID系统不再可靠,应当及时的更换损坏的硬盘,否则剩余的镜像盘也出现问题,那么整个系统就会崩溃。更换新盘后原有数据会需要很长时间同步镜像,外界对数据的访问不会受到影响,只是这时整个系统的性能有所下降。因此,RAID 1多用在保存关键性的重要数据的场合。

      RAID 1主要是通过二次读写实现磁盘镜像,所以磁盘控制器的负载也相当大,尤其是在需要频繁写入数据的环境中。为了避免出现性能瓶颈,使用多个磁盘控制器就显得很有必要。

      3、RAID0+1

      从RAID 0+1名称上我们便可以看出是RAID0与RAID1的结合体。在我们单独使用RAID 1也会出现类似单独使用RAID 0那样的问题,即在同一时间内只能向一块磁盘写入数据,不能充分利用所有的资源。为了解决这一问题,我们可以在磁盘镜像中建立带区集。因为这种配置方式综合了带区集和镜像的优势,所以被称为RAID 0+1。把RAID0和RAID1技术结合起来,数据除分布在多个盘上外,每个盘都有其物理镜像盘,提供全冗余能力,允许一个以下磁盘故障,而不影响数据可用性,并具有快速读/写能力。RAID0+1要在磁盘镜像中建立带区集至少4个硬盘。

      由于我们此次只是介绍家用台式机如何组建RAID磁盘阵列功能,目前主流的主板也只是提供这三种组建模式,因此其它诸如服务等的高级RAID模式,这里我们将不再过多的介绍。

      二、主板芯片组RAID控制芯片介绍

      Intel南桥芯片ICH5R、ICH6R集成有SATA-RAID控制器,但仅支持SATA-RAID,不支持PATA-RAID。Intel采用的是桥接技术,就是把SATA-RAID控制器桥接到IDE控制器,因此可以通过BIOS检测SATA硬盘,并且通过BIOS设置SATA-RAID。当连接SATA硬盘而又不做RAID时,是把SATA硬盘当作PATA硬盘处理的,安装OS时也不需要驱动软盘,在OS的设备管理器内也看不到SATA-RAID控制器,看到的是IDE ATAPI控制器,而且多了两个IDE通道(由两个SATA通道桥接的)。只有连接两个SATA硬盘,且作SATA-RAID时才使用SATA-RAID控制器,安装OS时需要需要驱动软盘,在OS的设备管理器内可以看到SATA-RAID控制器。安装ICH5R、ICH6R的RAID IAA驱动后,可以通过IAA程序查看RAID盘的性能参数。

      VIA南桥芯片VT8237、VT8237R的SATA-RAID设计与Intel不同,它是把一个SATA-RAID控制器集成到8237南桥内,与南桥里的IDE控制器没有关系。当然这个SATA-RAID控制器也不见得是原生的SATA模式,因为传输速度也没有达到理想的SATA性能指标。BIOS不负责检测SATA硬盘,所以在BIOS里看不到SATA硬盘。SATA硬盘的检测和RAID设置需要通过SATA-RAID控制器自己BootROM(也可以叫SATA-RAID控制器的BIOS)。所以BIOS自检后会启动一个BootROM检测SATA硬盘,检测到SATA硬盘后就显示出硬盘信息,此时按快捷键Tab就可以进入BootROM设置SATA-RAID。在VIA的VT8237南桥的主板上使用SATA硬盘,无论是否做RAID安装OS时都需要驱动软盘,在OS的设备管理器内可以看到SATA-RAID控制器。VIA的芯片也只是集成了SATA-RAID控制器。

      NVIDIA的nForce2/ nForce3/ nForce4芯片组的SATA/IDE/RAID处理方式是集Intel和VIA的优点于一身。第一是把SATA/IDE/RAID控制器桥接在一起,在不做RAID时,安装XP/2000也不需要任何驱动。第二是在BIOS里的SATA硬盘不像Intel那样需要特别设置,接上SATA硬盘BIOS就可以检测到。第三是不仅SATA硬盘可以组成RAID,PATA硬盘也可以组成RAID,PATA硬盘与SATA硬盘也可以组成RAID。这给需要RAID的用户带来极大的方便,Intel的ICH5R、ICH6R,VIA的VT8237都不支持PATA的IDE RAID。

      三、NVIDIA芯片组BIOS设置和RAID设置简单介绍

      nForce系列芯片组的BIOS里有关SATA和RAID的设置选项有两处,都在Integrated Peripherals(整合周边)菜单内。

      SATA的设置项:Serial-ATA,设定值有[Enabled], [Disabled]。这项的用途是开启或  

    关闭板载Serial-ATA控制器。使用SATA硬盘必须把此项设置为[Enabled]。如果不使用SATA硬盘可以将此项设置为[Disabled],可以减少占用的中断资源。

      RAID的设置项在Integrated Peripherals/Onboard Device(板载设备)菜单内,光标移到Onboard Device,按进入如子菜单:RAID Config就是RAID配置选项,光标移到RAID Config,按就进入如RAID配置菜单:

      第一项IDE RAID是确定是否设置RAID,设定值有[Enabled], [Disabled]。如果不做RAID,就保持缺省值[Disabled],此时下面的选项是不可设置的灰色。

      如果做RAID就选择[Enabled],这时下面的选项才变成可以设置的黄色。IDE RAID下面是4个IDE(PATA)通道,再下面是SATA通道。nForce2芯片组是2个SATA通道,nForce3/4芯片组是4个SATA通道。可以根据你自己的意图设置,准备用哪个通道的硬盘做RAID,就把那个通道设置为[Enabled]。

      设置完成就可退出保存BIOS设置,重新启动。这里要说明的是,当你设置RAID后,该通道就由RAID控制器管理,BIOS的Standard CMOS Features里看不到做RAID的硬盘了。

      BIOS设置后,仅仅是指定那些通道的硬盘作RAID,并没有完成RAID的组建,前面说过做RAID的磁盘由RAID控制器管理,因此要由RAID控制器的RAID BIOS检测硬盘,以及设置RAID模式。BIOS启动自检后,RAID BIOS启动检测做RAID的硬盘,检测过程在显示器上显示,检测到硬盘后留给用户几秒钟时间,以便用户按F 1 0 进入RAID BIOS Setup。

      nForce芯片组提供的RAID(冗余磁盘阵列)的模式共有下面四种:

      RAID 0:硬盘串列方案,提高硬盘读写的速度。

      RAID 1:镜像数据的技术。

      RAID 0+1:由RAID 0和RAID 1阵列组成的技术。

      Spanning (JBOD):不同容量的硬盘组成为一个大硬盘。

      四、操作系统安装过程介绍

      按F10进入RAID BIOS Setup,会出现NVIDIA RAID Utility -- Define a New Array(定义一个新阵列)。默认的设置是:RAID Mode(模式)--Mirroring(镜像),Striping Block(串列块)--Optimal(最佳)。

      通过这个窗口可以定义一个新阵列,需要设置的项目有:选择RAID Mode(RAID模式):Mirroring(镜像)、Striping(串列)、Spanning(捆绑)、Stripe Mirroring(串列镜像)。

      设置Striping Block(串列块):4 KB至128 KB/Optimal

      指定RAID Array(RAID阵列)所使用的磁盘

      用户可以根据自己的需要设置RAID模式,串列块大小和RAID阵列所使用的磁盘。其中串列块大小最好用默认的Optimal。RAID阵列所使用的磁盘通过光标键→添加。

      做RAID的硬盘可以是同一通道的主/从盘,也可以是不同通道的主/从盘,建议使用不同通道的主/从盘,因为不同通道的带宽宽,速度快。Loc(位置)栏显示出每个硬盘的通道/控制器(0-1)/主副状态,其中通道0是PATA,1是SATA;控制器0是主,1是从;M是主盘,S是副盘。分配完RAID阵列磁盘后,按F7。出现清除磁盘数据的提示。按Y清除硬盘的数据,弹出Array List窗口:如果没有问题,可以按Ctrl-X保存退出,也可以重建已经设置的RAID阵列。至此RAID建立完成,系统重启,可以安装OS了。

      安装Windows XP系统,安装系统需要驱动软盘,主板附带的是XP用的,2000的需要自己制作。从光驱启动Windows XP系统安装盘,在进入蓝色的提示屏幕时按F6键,告诉系统安装程序:需要另外的存储设备驱动。当安装程序拷贝一部分设备驱动后,停下来提示你敲S键,指定存储设备驱动:

      系统提示把驱动软盘放入软驱,按提示放入软盘后,敲回车。系统读取软盘后,提示你选择驱动。nForce的RAID驱动与Intel和VIA的不同,有两个:NVIDIA RAID CLASS DRIVER和NVIDIA Nforce Storage Controller都要安装。

      第一次选择NVIDIA RAID CLASS DRIVER,敲回车系统读入,再返回敲S键提示界面,此时再敲S键,然后选择NVIDIA Nforce Storage Controller,敲回车,系统继续拷贝文件,然后返回到下面界面。

      在这个界面里显示出系统已经找到NVIDIA RAID CLASS DRIVER和NVIDIA Nforce Storage Controller,可以敲回车继续。

      系统从软盘拷贝所需文件后重启,开始检测RAID盘,找到后提示设置硬盘。此时用户可以建立一个主分区,并格式化,然后系统向硬盘拷贝文件。在系统安装期间不要取出软盘,直到安装完成。

      剩余的磁盘分区等安装完系统后,我们可以用XP的磁盘管理器分区格式化。用XP的磁盘管理器分区,逻辑盘可以格式化为FAT32格式、NTFs格式。

    ****************************************************************************

           计算机系统的正常运行和数据的安全保存是一项非常重要的工作,如果计算机硬盘发生损坏,保存在硬盘上的所有数据丢失,无法找回,就会给使用者造成不可弥补的损失。医院信息系统(HIS)更是这样,门诊和住院病人收费、住院病人用药医嘱、药房发药等数据不能有任何丢失和中断,如果不采取预防措施,硬盘的物理损坏所造成的损失将是灾难性的。磁盘镜像是预防磁盘物理损坏的有效措施之一,花费也不大,当一个硬盘损坏时,可以由另一个硬盘自动发挥作用,系统数据不受任何损失。

      我院最近升级了医院信息管理软件,需要重新组网。因资金原因,系统只有一台较先进的服务器,需要做一个磁盘镜像来保证数据安全,尤其是防止硬盘发生物理损坏时造成损失。服务器为HP-TC4100双硬盘,系统标识为磁盘0(C盘)和磁盘1(D盘),操作系统为Windows2000Server。要做镜像,必须有至少两个动态磁盘,因此应将两个磁盘都由基本磁盘升级为动态磁盘。

      1、将基本磁盘升级到动态磁盘

      首先打开控制面板,在管理工具中找到磁盘管理。右键单击需要升级的基本磁盘,单击“升级到动态磁盘”,选择磁盘0和磁盘1,按下“确定”,选择升级,出现“一旦将这些磁盘升级为动态磁盘,您将不能从这些磁盘上的任何卷启动Windows的以前版本。确实要升级吗”的提示,按“确定”,接着出现“任何要升级的磁盘上的文件系统将被强制拆下,想继续这个操作吗”的提示,按“确定”。

      注 意

      必须以管理员或管理组成员的身份登录才能完成该过程。如果计算机与网络连接,则网络策略设置也可能阻止您完成此步骤。将基本磁盘升级到动态磁盘后,不能将动态卷改回到分区。相反,必须删除磁盘上的所有动态卷,然后使用“还原为基本磁盘”命令。在升级磁盘之前,关闭所有磁盘上运行的程序。为使升级成功,任何要升级的磁盘都必须至少包含1MB的未分配空间。在磁盘上创建分区或卷时,“磁盘管理”将自动保留这个空间,但是带有其他操作系统创建的分区或卷的磁盘上可能没有这个空间(这个空间即使在“磁盘管理”中看不到也存在)。一旦升级,动态磁盘就不能包含分区或逻辑驱动器,也不能被MS-DOS或Windows2000以外的其他Windows操作系统访问。将基本磁盘升级到动态磁盘时,基本磁盘上已有的全部分区都变为动态磁盘上的简单卷。已有的镜像卷(镜像集)、带区卷(带区集)、RAID-5卷(具有奇偶校验的带区集)或跨区卷(卷集),分别变成动态镜像卷、动态带区卷、动态RAID-5卷或动态跨区卷。

    “添加镜像”。屏幕上提示“描述:为现存的卷添加镜像,会因维持卷数据的多份副本,而造成数据重复。选择一个磁盘作为C:的镜像空间”,选择磁盘1,然后选择添加镜像,显示“您已启动镜像卷。要从镜像磁盘启动,请给您的BOOT.INI文件添加合适项目”,选择“确定”,即完成操作。

      注 意

      必须以管理员或管理组成员的身份登录才能完成该过程。如果计算机与网络连接,则网络策略设置也可能阻止您完成此步骤。只能为运行Windows2000Server的计算机中的卷做镜像。只要该磁盘有足够的未分配空间,现有的任何简单卷均可以镜像到其他动态磁盘上。如果没有足够未分配空间的动态磁盘,“添加镜像”命令将无法使用。镜像卷具备容错能力,镜像卷的两个副本(镜像)使用相同的驱动器号。

      看似简单的磁盘镜像,做起来并不容易,操作失误会丢失原有的数据。由于相关的论述较少,本人特将升级经过记录下来,供大家在实际应用中参考。

      需要说明的是,一些大医院早已采用了双机热备份、群集解决方案等先进技术来保证数据安全,但成本也相当高,技术难度大。采用磁盘镜像技术,简单易行,而且几乎不需要额外投资,适合中小医院或大医院旧系统的安全性改造。

  • 相关阅读:
    HDU-2067-小兔的棋盘
    HDU-1861-游船出租
    C语言笔记
    P1164 小A点菜
    P1028 数的计算
    P1217 [USACO1.5]回文质数 Prime Palindromes
    P1088 火星人
    P2392 kkksc03考前临时抱佛脚
    P3799 妖梦拼木棒
    First Step (ファーストステップ)
  • 原文地址:https://www.cnblogs.com/chuncn/p/1441352.html
Copyright © 2011-2022 走看看