一种基于多线程的高速磁盘镜像算法
2016-07-22张秋霞张志强刘克东
张秋霞+张志强+刘克东
摘要:随着时代不断发展,磁盘镜像技术亦受到越来越多的关注。当前计算机磁盘容量越来越大,如何对大容量的磁盘进行全盘镜像成为一个新的研究方向。该文提出一种基于多线程的高速磁盘镜像算法,该算法采用缓冲池及队列技术,充分利用计算资源,大大提升了磁盘镜像速度。
关键词:磁盘镜像;多线程;队列
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)13-0240-02
随着计算机和网络的飞速发展和普及应用,计算机日益成为人们工作和生活的重要工具,人们的日常工作和生活自然也越来越依赖于计算机系统的正常运行和数据的安全保存。而计算机安全涉及的磁盘镜像技术也越来越受到广泛应用。磁盘镜像是指对原始数据媒介采用位对位(bit to bit)方式进行精确复制而生成的文件,该镜像文件可采用一定的机制进行校验,以确认该镜像文件与原始文件完全一致,并未被修改[1]。
纵观市场上流行的几种磁盘镜像工具,普遍存在镜像速度慢、效率低的缺点,以500G硬盘为例,常用工具都需要一小时以上甚至数小时的时间才能完成镜像文件制作,制约了磁盘镜像技术的广泛应用和深入研究。
因此,本文在传统磁盘镜像算法的基础上,提出一种基于多线程的高效磁盘镜像算法,充分利用计算机空闲资源,采用缓冲池及队列技术,大幅度提高了磁盘镜像速度,实验得出最高镜像速度达到6.78GB/min。
1 相关概念及技术
1.1 磁盘镜像格式
DD格式是一种通用的磁盘镜像格式,也称为原始镜像(RAWIMAGE)格式。DD格式最初是由LINUX下的DD命令所生成的备份文件,该命令可以对目标媒介进行逐比特复制制作镜像文件。该格式的支持软件最为广泛,几乎可以被所有的取证软件所读取[2]。该格式镜像文件的后缀为.dd或者.001,并且可以被分割。以适应镜像文件存储的需要。其优点还在于,可以被各类程序直接访问而无须进行特别的转换,这样就避免了格式转换中引入错误[1]。
1.2 校验算法
磁盘镜像的结果必须与源磁盘内容保持一致,通过计算并对比源磁盘与镜像文件的哈希值可以验证镜像结果是否正确。在进行磁盘镜像之前,计算源磁盘的哈希值,同时计算镜像文件的哈希值,比较两次哈希值,如果相等,表明镜像文件与源磁盘内容一致,否则,磁盘镜像出现错误。常用的哈希校验算法主要有以下几种:
1)MD4
MD4算法是由麻省理工学院(MIT)的讲座教授 Ronald L. Rivest 在 1990 年提出的,它一般使用在32位的计算机处理器模块内[3]。该算法存在一些安全性漏洞,提出后不久就曾被相关人士进行了破译。
2) MD5
MD5是一种常用的哈希计算方法,用于确保信息的完整一致,防止信息篡改,在密码学和取证方面都有广泛应用[4]。
3) SHA1
SHA-1算法是由美国国家标准技术研究院(NIST)与美国国家安全局(NSA)设计的,已成为美国国家标准[5],是目前较先进的加密技术,主要应用于数字签名标准里面定义的数字签名算法(DSA)[3]。
基于效率与安全性的考虑,本文采用MD5算法对镜像文件进行校验。
1.3多线程及线程间通信、同步技术
由于多线程技术可以避免某单一任务长期占用CPU资源,提高程序处理效率,故该技术在目前的程序开发中应用较为广泛。并且MFC也提供了多线程编程的相关类库,使得多线程编程更加方便。
在多线程技术中,线程之间的通信是不可避免的。目前线程间通信的方式主要有两种,一种是使用消息机制,此种方式的理论基础是应用程序的每一个线程都有其自身的消息队列,接收消息的线程只需启动了消息循环机制,消息发送线程即可利用操作系统的消息驱动机制将所需传递的消息转发给接收线程,这就使得利用消息在线程之间进行通信变得非常简单[6]。由于同属于一个进程的多个线程共享操作系统分配的内存,故另一种线程间通信的方式是使用全局变量,即是本文使用的方法。由于本文中线程间传递的信息较为复杂,故定义一个全局的结构体变量进行线程间通信。
虽然使用多线程可以提高效率,但也有一定的弊端,由于多线程的运行具有一定的不确定性,就有可能出现两个线程同时对同一个全局变量进行操作,进而发生错误,且这种错误很难重现。这就要求在多个线程之间进行同步处理,保证一个线程访问共享变量时,其他线程禁止访问该变量。MFC提供了多种多线程同步机制:主要有互斥对象(CMutex)、事件内核对象(CEvent)、信号量(CSemaphore)、临界区(CCriticalSection)[7]。
本文使用 CCriticalSection 类进行线程间同步,即在任意时间片只允许一个线程访问共享资源,已“抢占”共享资源的线程可以采用“加锁”机制对共享资源进行保护,其他试图访问共享资源的线程必须等待“解锁”后才能成功访问,否则将一直挂起等待。
2 基于多线程的高速磁盘镜像算法
如图1算法流程图所示,首先分配一个全局的缓冲区队列,便于读写线程之间进行通信;并定义一个用来线程之间同步的CCriticalSection 类锁,以避免读写线程同时对同一块内存区域进行操作;同时获取源盘的相关信息(磁盘大小等,便于判断读写工作是否结束)。进入读线程后,循环读取一块固定大小的源盘数据到临时缓冲区,并检测缓冲区队列中是否有空闲区域,如果有则将数据压入缓冲区队列,否则循环等待,直至读取到源盘末尾。写进程即循环从缓冲区队列中取出一块数据并写入目的镜像文件中,同时更新目的文件的哈希值。当文件全部写完后,比较源盘与目的镜像文件的哈希值是否一致,以保证镜像文件与源盘的数据一致性。该算法的优点在于可以同时进行源盘数据的读取和镜像文件的写入,避免了计算机资源浪费,提高了磁盘镜像的速度。
3 实验环境及结果分析
从以上结果可以看出,当源磁盘容量较小时,两种算法的镜像速度相差不大,使用本文提出的算法未能使镜像速度得到大幅度提升,未发挥出该算法的优越性;当磁盘容量为128G时,使用本文提出的算法与单线程算法相比,磁盘镜像速度大大提高,达到最高值即6.78GB/min,即对128G的硬盘制作全盘镜像仅需要18分钟,这在实际使用时将大大提高工作效率。
4 结论
本文在传统磁盘镜像技术的基础上,提出一种基于多线程的高效磁盘镜像算法。该算法有效利用了计算机空闲资源,提高了磁盘镜像的速度,有助于磁盘镜像技术的进一步广泛应用。
参考文献:
[1] 冯效栋.计算机取证磁盘镜像技术速览[J].管理科学与工程技术,2010(3):206-206.
[2] 马林.数据重现-文件系统原理精解与数据恢复最佳实践[M].北京:清华大学出版社,2009.
[3] 黄云轲,辛小龙等.关于对哈希算法的研究与应用[J].计算机关盘软件与应用,2012(3):201-201.
[4] 张建伟,李鑫,张梅峰.基于MD5算法的身份鉴别技术的研究与实现[J].计算机工程,2003,29(4):118-145.
[5] 林雅榕,侯整风.对哈希算法SHA-1的分析和改进[J].计算机技术与发展,2006,16(3).
[6] 伍光胜.多线程技术及其应用的研究[J].计算机应用研究,2001,18(1):33-36.
[7] 孙鑫,余安萍.VC++深入详解[M[.北京:电子工业出版社,2006.