快照(Snapshot)技术发展综述

快照(Snapshot)技术发展综述

刘爱贵

摘要:传统数据备份技术存在备份窗口、恢复时间目标RTO和恢复时间点RPO过长的问题,无法满足企业关键性业务的数据保护需求,因此产生了数据快照技术。本文对快照技术的概念、特点、实现技术和发展现状进行了概括性阐述,并对其未来的发展进行了展望。

关键词:快照,备份,复制,镜像,写时复制,指针重映射

作者简介:刘爱贵,研究方向为网络存储、数据挖掘和分布式计算;毕业于中科院,目前就职于赛门铁克@Symantec,从事存储软件研发。Email: Aigui.Liu@gmail.com

注:作者学识和经验水平有限,如有错误或不当之处,敬请批评指正。

PDF格式下载:http://download.csdn.net/source/1613486

 

一、                 引言

随着计算机技术和网络技术的不断发展,信息技术水平不断得到提高。人类进入称为信息社会的二十一世纪后,诸如数字通信、数字多媒体、电子商务、搜索引擎、数字图书馆、天气预报、地质勘探、科学研究等海量数据型应用的涌现,各种信息呈现爆炸式的增长趋势,存储成为信息计算技术的中心。应用对存储系统的要求不断提高,存储容量不断升级,从GigaByte到TeraByte、 PetaByte、ExaByte,愈显巨大。图灵奖获得者Jim Gray提出一个新的经验定律:网络环境下每18个月生产的数据量等于有史以来的数据量之和。与此同时,现代企业对计算机的依赖性严重增强,信息数据逐渐成为企业赖以生存的基础,数据损坏或丢失将给企业带来巨大的损失。由于黑客、病毒、硬件设备的失效以及火灾、地震等自然灾害的原因,使系统和数据信息遭到破坏甚至毁灭,如果不及时地进行恢复,将对企业造成巨大的损失,所以备份容灾技术显得尤为重要。尤其,9.11等事件造成的灾难性后果使人们更加深刻地认识到数据信息的价值和意义,日益重视数据的保护。

在过去的20多年中,虽然计算机技术取得了巨大的发展,但是数据备份技术却没有长足进步。数据备份操作代价和成本仍然比较高,并且消耗大量时间和系统资源,数据备份的恢复时间目标和恢复点目标比较长。传统地,人们一直采用数据复制、备份、恢复等技术来保护重要的数据信息,定期对数据进行备份或复制。由于数据备份过程会影响应用性能,并且非常耗时,因此数据备份通常被安排在系统负载较轻时进行(如夜间)。另外,为了节省存储空间,通常结合全量和增量备份技术。

显然,这种数据备份方式存在一个显著的不足,即备份窗口问题。在数据备份期间,企业业务需要暂时停止对外提供服务。随着企业数据量和数据增长速度的加快,这个窗口可能会要求越来越长,这对于关键性业务系统来说是无法接受的。诸如银行、电信等机构,信息系统要求24x7不间断运行,短时的停机或者少量数据的丢失都会导致巨大的损失。因此,就需要将数据备份窗口尽可能地缩小,甚至缩小为零,数据快照(Snapshot)、持续数据保护(CDP, Continuous Data Protection)等技术,就是为了满足这样的需求而出现的数据保护技术。

二、                 快照概念

快照(Snapshot)是某个数据集在某一特定时刻的镜像,也称为即时拷贝,它是这个数据集的一个完整可用的副本。存储网络行业协会SNIA对快照的定义是[1]:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本(duplicate),也可以是数据的一个复制品(replicate)。

快照具有很广泛的应用,例如作为备份的源、作为数据挖掘的源、作为保存应用程序状态的检查点,甚至就是作为单纯的数据复制的一种手段等。创建快照的方法也有很多种,按照SNIA的定义[2],快照技术主要分为镜像分离(split mirror) 、改变块(changed block)、 并发(concurrent) 三大类。后两种在实现时通常使用指针重映射(pointer remapping)和写时拷贝(copy on write)技术。changed block 方式的灵活性及使用存储空间的高效性,使得它成为快照技术的主流。

第一种快照是镜像分离。在即时拷贝之前构建数据镜像,当出现一个完整的可供复制的镜像时,就可以通过瞬间“分离”镜像来产生即时拷贝。这种技术的优点是速度快,创建快照无须额外工作。但缺点也很显明,首先它不灵活,不能在任意时刻进行快照;其次,它需要一个与数据卷容量相同的镜像卷;再者,连续地镜像数据变化影响存储系统的整体性能。

第二种快照是改变块[3]。快照创建成功后,源和目标共享同一份物理数据拷贝,直到数据发生写操作,此时源或目标将被写向新的存储空间。共享的数据单元可是块、扇区、扇道或其他的粒度级别。为了记录和追踪块的变化和复制信息,需要一个位图(bitmap),它用于确定实际拷贝数据的位置,以及确定从源还是目标来获取数据。

第三种快照是并发[3]。它与改变块非常相似,但它总是物理地拷贝数据。当即时拷贝执行时,没有数据被复制。取而代之,它创建一个位图来记录数据的复制情况,并在后台进行真正的数据物理复制。

三、                 不同存储层次的快照实现

“计算机科学中的任何问题,都可以通过增加间接层次来解决”-Butler Lampson,1992年图灵奖获得者。对于快照技术,我们可以在存储系统中的不同层次来实现,可以在磁盘阵列、文件系统、卷管理器、NAS系统或备份系统中来实现。

1 存储系统栈与快照实现

存储栈由一组硬件和软件组件组成,为运行在主机操作系统上的应用系统提供物理存储介质,如图1所示。快照可以采用很多不同实现方式,也可以在存储栈中的不同层次来实现,大致分为软件层和硬件层两类,也可分为基于控制器的快照和基于主机的快照两类[4]

基于控制器的快照,在存储设备层或硬件层中实现,由存储系统硬件提供商管理并集成于磁盘阵列中。这种快照在LUN级(块级)完成,独立与操作系统和文件系统。基于主机的快照,在设备驱动和文件系统级之间实现,通常由文件系统、卷管理器或第三方软件来执行。这种快照不依赖存储硬件,但却依赖于文件系统和卷管理软件。该快照作用于逻辑数据视图,这与基于控制器的快照的不同,它作用与物理数据。

在以上各个存储层次中,物理存储层和卷管理器是最适合实现快照的两个组件,它们可以方便地利用物理存储,是当前主流的实现层次。文件系统层实现快照是一个可行的选择,然而诸如数据库等应用会直接选择使用逻辑卷来实现快照,因为在文件系统层它们不能被快照技术所管理。一般来说,没有必要在应用层实现快照,对于备份机制,可以利用下层的文件系统或卷管理器接口来实现,但需要应用暂时停顿以保证快照数据一致性。总的来说,基于软件层的快照易于操作,且提供比较好的恢复粒度,而基于硬件层的快照往往更高的性能和容错性。

目前,存储厂商提供了在不同存储层次实现快照的存储产品。快照在存储子系统中实现的有IBM TotalStorage Disk Systems、NetApp NAS 、EMC Symmetrix,在虚拟化层中实现的有IBM Total Storage SAN Volume Controller,在卷管理器中实现的有Veritas Volume Manager、Linux LVM、IBM Tivoli Storage Manager LVSA、Microsoft® Windows® 2003 VSS System provider,在文件系统中实现的有AIX JFS2、IBM TotalStorage SAN File System、IBM General Parallel File System、IBM N series、NetApp filers、Veritas File System。

四、                 快照实现方式及技术

  快照技术能够实现数据的即时影像,快照影像可以支持在线备份。全量快照是实现所有数据的一个完整的只读副本,为了降低快照所占用的存储空间,人们提出了写时复制(COW ,Copy-On-Write)和写重定向(ROW,Redirect on Write)快照技术。另外,还出现了其他一些快照技术的实现方式,如日志、持续数据保护等,可以提升快照的相关性能。

1、          镜像分离(Split Mirror)

  镜像分裂快照技术在快照时间点到来之前,首先要为源数据卷创建并维护一个完整的物理镜像卷:同一数据的两个副本分别保存在由源数据卷和镜像卷组成的镜像对上。在快照时间点到来时,镜像操作被停止,镜像卷转化为快照卷,获得一份数据快照。快照卷在完成数据备份等应用后,将与源数据卷重新同步,重新成为镜像卷。对于要同时保留多个连续时间点快照的源数据卷,必须预先为其创建多个镜像卷,当第一个镜像卷被转化为快照卷作为数据备份后,初始创建的第二个镜像卷立即与源数据卷同步,与源数据卷成为新的镜像对。镜像分裂快照操作的时间非常短,仅仅是断开镜像卷对所需的时间,通常只有几毫秒,这样小的备份窗口几乎不会对上层应用造成影响,但是这种快照技术缺乏灵活性,无法在任意时间点为任意的数据卷建立快照。另外,它需要一个或者多个与源数据卷容量相同的镜像卷,同步镜像时还会降低存储系统的整体性能。[5]

2、          写时复制(COW, Copy On Write)

2 写时复制快照

写时复制快照使用预先分配的快照空间进行快照创建,在快照时间点之后,没有物理数据复制发生,仅仅复制了原始数据物理位置的元数据。因此,快照创建非常快,可以瞬间完成。然后,快照副本跟踪原始卷的数据变化(即原始卷写操作),一旦原始卷数据块发生首次更新,则先将原始卷数据块读出并写入快照卷,然后用新数据块覆盖原始卷(如图2)。写时复制,因此而得名。

这种快照技术在创建快照时才建立快照卷,但只需分配相对少量的存储空间,用于保存快照时间点之后源数据卷中被更新的数据。每个源数据卷都具有一个数据指针表,每条记录保存着指向对应数据块的指针。在创建快照时,存储子系统为源数据卷的指针表建立一个副本,作为快照卷的数据指针表。当快照时间点结束时,快照建立了一个可供上层应用访问的逻辑副本,快照卷与源数据卷通过各自的指针表共享同一份物理数据。快照创建之后,当源数据卷中某数据将要被更新时,为了保证快照操作的完整性,使用写时复制技术。对快照卷中数据的访问,通过查询数据指针表,根据对应数据块的指针确定所访问数据的物理存储位置。

写时复制技术确保复制操作发生在更新操作之前,使快照时间点后的数据更新不会出现在快照卷上,保证了快照操作的完整性。写时复制快照在快照时间点之前,不会占用任何的存储资源,也不会影响系统性能;而且它在使用上非常灵活,可以在任意时间点为任意数据卷建立快照。在快照时间点产生的“备份窗口”的长度与源数据卷的容量成线性比例,一般为几秒钟,对应用影响甚微,但为快照卷分配的存储空间却大大减少;复制操作只在源数据卷发生更新时才发生,因此系统开销非常小。但是由于快照卷仅仅保存了源数据卷被更新的数据,此快照技术无法得到完整的物理副本,碰到需要完整物理副本的应用就无能为力了,而且如果更新的数据数量超过保留空间,快照就将失效。

3、          指针重映射(Pointer Remapping)

3 指针重映射快照

这种实现方式与写时复制非常相似,区别在于对于原始数据卷的首次写操作将被重定向到预留的快照空间。该快照维持的是指向所有源数据的指针和拷贝数据。当数据被重写时,将会给更新过的数据选择一个新的位置,同时指向该数据的指针也被重新映射,指向更新后的数据。如果拷贝是只读的,那么指向该数据的指针就根本不会被修改。重定向写操作提升了快照I/O性能,只需一次写操作,直接将新数据写入快照卷,同时更新位图映射指针;而写时拷贝需要一次读和两次写操作,即将原始卷数据块读入并写入快照卷,然后将更新数据写入原始卷。

不难发现,快照卷保存的是原始副本,而原始卷保存的则是快照副本。这导致删除快照前需要将快照卷中的数据同步至原始卷,而且当创建多个快照后,原始数据的访问、快照卷和原始卷数据的追踪以及快照的删除将变得异常复杂。此外,快照副本依赖与原始副本,原始副本数据集很快变得分散。

4、          日志文件架构(Log-structured file architecture)

  这种形式的快照技术利用日志文件来记录原始数据卷的写操作。所有针对原始数据卷的写操作都记录在日志系统中,相当于每次数据变化均会生成快照。因此,这与数据库系统事务或文件系统日志非常相似,可以根据需要,从日志恢复数据或者回滚事务到任意合理状态。严格意义讲,这种方式不能称之为快照,但的确能达到快照的目标,不少文件系统实现了这种功能,如ZFS、JFS、EXT3、NTFS等。

5、          克隆快照(Copy on write with background copy)

  前面提到的快照,基本上都不会生成完整的快照副本,无法满足完整物理数据副本的业务需求。克隆快照可生成与源数据卷一致的镜像快照,它充分利用了写时拷贝和镜像分离两种快照技术的优点。快照时间点时,它先使用写时拷贝方式快速产生快照副本,然后在后台启动一个拷贝进程来执行源数据卷至快照卷的块级数据拷贝任务。一旦复制完成,就可以通过镜像分离技术获得一个克隆快照。克隆快照同样继承了镜像分离快照的缺点,除了需要一个与源数据卷容量相等的快照卷外,还会一定程度上影响存储系统的整体性能。

6、          持续数据保护(Continuous data protection)

以上几种快照技术均存在共同的不足之处,即不能在任意点创建任意多的快照。日志型快照虽然没有上述不足,但却依赖与具体的文件系统,无法直接应用到使用不同文件系统的应用,对于非基于文件系统的数据应用无能为力。

持续数据保护[6],也称连续备份,它自动持续捕捉源数据卷数据块的变化,并连续完整地记录这些数据块版本。每一次数据块变化都会被记录,生成瞬间快照,这与其他快照技术在快照时间点上创建快照是不同的。因为写操作都被记录保存下来,因此能够动态地访问任意一个时间点的数据状态,提供了细粒度的数据恢复,可以实现瞬间和即时的恢复,有效拉近恢复点目标。数据块级的持续数据保护技术的优点是与应用的藕合比较松,性能和效率比较高,系统连续不间断运行,不存在快照窗口问题。它的缺点是对存储空间的要求比较高,这也是限制数据块级持续数据保护技术广泛应用的根本原因。

表1[4]从不同角度对以上几种快照技术进行了分析对比。

镜像分离

指针重映射

写时复制

日志文件

克隆快照

持续数据保护

快照是否依赖源数据卷?

NO
镜像包含完整的数据副本

YES
未变化的数据从源数据卷访问

YES
未变化数据从源数据卷访问

YES
未变化数据从源数据卷访问

ONLY
仅在后台拷贝未被完成时

YES
除了包含源数据副本实现外

空间效率

NO
要求源数据卷相同容量存储空间

YES
大多数据情况下要求变化数据存储空间

YES
大多数据情况下要求变化数据存储空间

YES
要求变化数据存储空间

NO
要求源数据卷相同容量存储空间

YES
存储空间需求取决于保存变化数据的数据和频率

源数据卷系统CPU和I/O负载

LOW/HIGH
镜像分离后低,分离前数据同步高

HIGH/NONE
软件型快照高,硬件型快照无

HIGH/NONE
软件型快照高,硬件型快照无

HIGH
对写操作进行日志时高

LOW
一般由存储子硬件执行

具体实现相关

源数据卷写负载

NONE
写负载发生在分离前

NONE
写直接重定向至新块

HIGH
首次写产生额外写负载

HIGH
写操作必须进行日志

HIGH
拷贝完成前的首次写产生写负载

HIGH
每次写操作导致相应的写操作 

逻辑数据错误保护机制

YES
数据必须从镜像卷拷贝,变化没有记录,速度较慢

YES
数据变化可以回滚或者同步至源数据源

YES
数据变化可以回滚或者同步至源数据源

YES
数据变化可以回滚

YES
可以反向建立快照,由于仅复制变化数据块,速度较快

YES
数据变化可以同步至原始数据副本

源数据卷物理介质故障保护机制

YES
镜像卷是完整副本

NONE
有效源数据卷必须存在

NONE
有效源数据卷必须存在

NONE
有效源数据卷必须存在

YES
后台复制完成后完全保护

具体实现相关

1 快照技术一览及对比

五、                 案例分析

  目前,几乎所有存储厂商的存储产品都支持快照,这成了事实上的行业标准,不具备快照功能的产品无法参与市场的竞争。不同厂商的快照实现方式各不相同,各有技术优势,也有不足之处,用户可以根据应用数据的特点来选择不同的方案。下面简要介绍当前主流存储厂商的快照技术。

1、      EMC TimeFinder

EMC TimeFinder [7][8]提供本地存储复制,以提高应用程序可用性和数据恢复速度。利用 EMC Symmetrix 系统,提供了很高的部署灵活性和大规模可扩展性以满足任何服务级别要求。TimeFinder 帮助企业执行备份,加载数据仓库,并在不停机的情况下轻松提供用于应用程序测试和开发的数据。

TimeFinder最早仅支持镜像分离快照,随后又增加了写时复制快照支持。因此,目前它可以同时支持以上两种快照技术。TimeFinder镜像分离快照,支持每个生产设备最多可有 16 个副本;TimeFinder写时复制快照,支持每个生产设备最多可有 128 个副本。

TimderFinder快照在存储子系统层次实现,独立于主机、操作系统、应用和数据库系统,它可以帮助企业管理备份窗口,实现瞬间数据复制,并且有效降低备份对应用和主机性能的影响。

2、      IBM FlashCopy

FlashCopy[4]是基于卷实现的快照技术,主要用于逻辑卷的时间点复制。FlashCopy属于克隆快照,利用了写时拷贝和镜像分离两种快照技术的优点。目前,FlashCopy的后台复制操作是可选的,即支持写时复制快照(即不选择复制),帮助用户高效利用存储空间。FlashCopy主要用于IBM磁盘阵列系统,尤其是中高端企业级应用系统。

选择复制情况下,即为标准的FlashCopy。首先在存储子系统分配一个与原始卷容量相同的快照卷,然后使用写时复制技术创建快照卷,并创建一个追踪数据复制的位图,这个过程是瞬间完成的。之后,后台复制进程被启动,执行从原始卷到快照卷的块级数据拷贝。在复制期间,对原始卷的数据更新按照写时复制技术处理,即先将数据复制到快照卷再进行原始卷更新,并对位图信息进行更新。复制一旦完成,则使用镜像分离技术获得一个完整可用的快照副本,可以独立用于相关应用。

3、      HDS ShadowImage

ShowImage[9]是基于存储子系统实现的镜像分离快照方案,可提供即时、不停机的信息共享和接入,帮助提供决策支持,完成测试和开发,或优化磁带备份操作。此外,ShadowImage 还使备份可以在生产的同时进行,因此可提高可创收应用的可用性。ShadowImage软件的基于磁盘的复制可在数据毁坏后提供非常迅速的恢复。

ShowImage是存储系统内部的数据复制技术,磁盘的镜像功能对于主机系统是透明的,异步方式数据复制技术不会增加主机I/O响应时间;可以定义生产数据逻辑卷与备份逻辑卷的镜像复制关系,以异步方式实时的保持2个逻辑卷的数据同步;可产生一个或多个与生产卷P-Vol完全相同的一个备份镜像卷S-Vol,备份镜像卷中的数据和生产卷中的数据完全相同。HDS ShadowImage生成的份镜像卷,可以提供给客户其他的应用主机作为审计、分析,同时还可以用于对生产卷进行备份恢复。

4、      NetApp Snapshot

NetApp快照技术[10]是基于其WAFL(Write Anywhere File Layout)文件系统实现的。WAFL文件系统的特点是:所有数据块(卷信息除外)可写至任意位置,不存在覆盖写操作,因为所有的写操作都写在新块上。NetApp创建的快照是静态只读的WAFL卷视图,可以实现多版本的文件、目录层次、LUN和应用数据。Snapshot可以在线创建,每个WAFL卷最多可达255个,不会对应用运行和性能产生影响。而且,这些快照对用户是可见的,可由用户驱动进行数据恢复。

图4展示了SnapShot的工作原理,它与写重定向快照基本相同。WAFL文件系统可以理解成数据块树状结构,其根部的数据结构描述了inode文件信息。这份inode文件信息则包含了对文件系统中所有inode的描述,它包含诸如空闲块图和空闲inode图等元数据信息。图(a)可视为整个文件系统的概貌图,其上部展现的就是根数据结构。WAFL通过复制根数据结构创建新的数据拷贝SnapShot。根数据结构只有128比特,并且不需要复制额外的数据块,一个新的SnapShot几乎不耗费额外的磁盘存储空间,直到用户修改或者删除文件系统中的数据。

4 NetApp Snapshot原理

5、      Veritas Snapshot

Veritas为不同级别的快照提供了多种实现方式,提供卷级(VxVM, Veritas Volume Manager)和文件系统级(VxFS, Veritas File System)两大类快照,具体细分为五种快照类型,分别是卷级的镜像分离快照、空间优化快照、完全即时快照以及文件系统级的文件系统快照、检查点快照[11]。按照实现技术,它们又可分为镜像分离、写时复制、克隆快照三种类型。这里简要介绍一下文件系统级的两种快照。

5 Veritas快照:文件系统快照和检查点快照

卷级快照捕捉数据块变化,而Veritas文件系统快照则捕捉文件内容和元数据变化。文件系统快照通常发生在文件系统操作边界,当文件发生变化时,快照会自动感知这些变化,在文件系统事务之前或之后进行快照操作,不在事务期间进行。两种文件系统级快照工作原理如图5所示。

文件系统快照(图5左)是VxFS文件系统的非持久的只读快照,它采用写时复制技术,只支持单一数据卷。这种快照没有包含全部文件系统映像数据和元数据,不能离线用于其他应用处理。VxFS维护一个内存映射图,用于表示文件系统卷上数据块地址与快照卷上文件块地址的映射关系,快照卷保存文件系统数据和元数据块变化前的映像。

检查点快照(图5右)与快照文件系统相同,也采用写时复制技术,区别在于:快照是持久的,除非进行删除;快照是可写的,比文件系统快照应用更为广泛;快照卷不是必须的,可使用文件系统自身空闲存储空间;可应用于从多卷文件系统,多个快照之间可以保持协调。

六、                 结论与展望

快照技术是对传统数据备份与复制技术的重大革新,解决了备份窗口问题,有效拉近了恢复时间目标和恢复时间点目标,成为了事实上的存储行业标准。本文对快照在实现方式和相关技术作了较为全面详细的阐述,并简要介绍了当前主流存储厂商的快照技术和存储产品。

快照技术发明以来,人们进行了大量意义重大的改进。快照窗口不断缩小,从几秒到瞬间完成;几乎可以在任意时刻创建快照,粒度越来越细,数量不断增大;快照性能大幅提升,对主机、应用的影响降低至微;快照灵活性、可扩展性、可管理性不断增强。然而,人们对技术的进步要求从来都是没有止境的。针对当前的各种解决方案,在综合性能、灵活性、管理性方面,快照技术仍然存在很大的改进空间。存储厂商不断推出新的快照存储产品或新的版本,是最有力的证明。

近年来,存储技术的发展日新月异,面向对象存储、固态硬盘、存储虚拟化、重复数据删除,新的存储架构、技术和解决方案不断涌现。这些可能会对快照技术的变革产生更加深远的影响,为快照技术的发展创造更加宽广的空间。我们可以预测,未来快照技术在空间效率、快照对象粒度(文件、文件集)、虚拟化存储支持以及性能和用户体验方面有长足的进步,在数据复制和备份领域将有更加广泛的应用前景。

参考文献:

[1] Snapshot.  http://www.snia.org/education/dictionary/s/#snapshot

[2] Point in time copy. http://www.snia.org.cn/dic.php?word=p

[3] Alain AzagIIry, Michael E Factor, Julian Satran. Point-in-time copy: Yesterday, Today and Tomorrow[C]. College Park, USA: the 19th IEEE Symposium on Mass Storage Systems. 2002:259-270.

[4] Snapshot.  http://www.ibm.com/developerworks/tivoli/library/t-snaptsm1/index.html

[5] 袁晓铭, 林安. 几种主流快照技术的分析比较. 微处理机, 2008年第1期.

[6] 王树鹏, 云晓春, 郭莉. 持续数据保护(CDP)技术的发展综述. 信息技术快报, 2008年第6卷第6期.

[7] EMC TimeFinder. http://china.emc.com/products/detail/software/timefinder.htm

[8] EMC TimeFinder. http://china.emc.com/collateral/software/data-sheet/1700-timefinder.pdf

[9] HDS ShadowImage. http://www.hds.com/cn/products/storage-software/shadowimage-in-system-replication.html

[10] NetApp Snapshot. http://www.netapp.com/us/products/platform-os/snapshot.html

[11] Veritas Snapshot.http://eval.symantec.com/mktginfo/enterprise/yellowbooks/using_local_copy_services_03_2006.en-us.pdf

上一篇:BZOJ 2844 albus就是要第一个出场(高斯消元)


下一篇:多线程程序设计学习(6)Producer-Consumer模式