背景技术
伙伴(Buddy)算法是Linux下的一种内存管理算法,只能分配2n字节的空间块,n≥12(即至少是4kb)。空间块之间的关系可由图1的二叉树表示,除了叶子,每块都可以拆半***成两块以供分配,回收的两块相邻兄弟空闲块可以合并成其父结点-更大的空闲块。由于块与地址空间有一一对应关系,所以其相邻结点的位置确定而且唯一,父结点也确定而唯一。例如512MB块的地址一定是0、512M、1024M,1536M,其中0与512M是相邻结点,其父结点的地址是0。伙伴算法的优点是由于空闲结点可以很方便的合并成更大的空闲块,所以不会产生不可回收碎片。
在利用伙伴算法进行内存空间管理时,由两部分结构来保存分配回收信息,这两部分都是内存结构。参见图1,空闲队列用于将空闲块分类组织起来,便于分配空间,当所需的长度没有时,则向下查找更大的空闲块以***出所需空间。右边的二叉树表示了所有结点的占用关系与邻接关系,由其可方便的查找一个回收空闲块其相邻结点的占用情况,便于递归向上合并空闲结点,产生更大的空闲块-父结点。
磁盘数据文件通常有两种,一种是格式固定,不能动态改变或是改变时不能回收空闲的空间,不具备磁盘空间管理能力。另一种有分配回收的普通空间管理能力。
如图2所示,普通空间管理通常的做法是将未占用空间分配成固定大小的块和同类大小的块,回收时通过链式串起来成为对应块长度的空闲队列。但通常为了更好的使用空间,可以支持若干种大小的分配,每种大小都形成一个空闲队列,空闲队列用光,则从未占用空间分配对应大小。由于结点不***,故不可能有非常大的结点类型,对某些数据流的保存(比如长度达到某级别),通常只能以物理上链式指针来保存表达。
在上述普通磁盘空间管理方案中,由于考虑到磁盘读取效率,不能合并回收的空闲块,所以每种回收队列的长度都与历史峰值有关,即使大小支持的种类分得细,也不能有效提高利用率。同时,对于某些数据流的链式结构表达,由于其不连续,在I/O(输入/输出)时需要开销额外的时间用于磁头重定位。操作***对簇进行操作时需要读取比较多的无用信息,或是由于结点跨簇,从而开销更多的簇操作单位,降低了磁盘的I/O性能。另外,由于每块的位置都不一致,无法支持数据的灾难恢复,需要对数据进行额外备份。
发明内容
本发明的一个目的在于提供一种磁盘空间管理方法,旨在解决现有技术中存在的在磁盘管理过程中空闲块无法回收,I/O性能较低且需要额外的资源进行灾难恢复的问题。
本发明的另一个目的在于提供一种磁盘空间管理***。
本发明是这样实现的:一种磁盘空间管理方法,所述方法包括下述步骤:
A.设置位图二叉树表,用于记录空间块的地址、使用状态及空间块之间的父子关系;
B.利用所述位图二叉树表对空间块进行分配和回收。
所述步骤B进一步包括:
当数据输入磁盘时,查找所述位图二叉树表,分配与存储所述数据的空间块;
当数据输出磁盘时,回收对应的空闲空间块;
根据空间块的分配或者回收状态更新所述位图二叉树表,保持所述位图二叉树表的结构与磁盘空间的使用状态一致。
所述方法进一步包括:
C.将所述位图二叉树表映射到内存,将空间管理的磁盘操作转换为内存操作。
所述方法进一步包括:
D.在发生灾难时,恢复所述位图二叉树表。
所述步骤D进一步包括:
D1.设置磁盘灾难标志和内存灾难标志;
D2.根据所述磁盘灾难标志和内存灾难标志是否同步判断是否发生灾难,当判断发生灾难时,扫描磁盘空间,根据磁盘空间的实际使用状态遍历所述位图二叉树表,对所述位图二叉树表进行结构更新。
一种磁盘空间管理***,所述***包括:
对外接口模块,用于接收外部输入的数据,或者将磁盘保存的数据对外输出;
数据读写模块,用于将所述对外接口模块接收的数据写入磁盘,或者将磁盘保存的数据通过所述对外接口模块输出;
位图二叉树表管理模块,用于设置位图二叉树表,并利用所述位图二叉树表对空间块进行分配和回收;
所述位图二叉树表用于记录空间块的地址、使用状态及空间块之间的父子关系。
所述***进一步包括:
内存镜像映射模块,用于将所述位图二叉树表映射到内存,将空间管理的磁盘操作转换为内存操作。
所述***进一步包括:
灾难标志管理模块,用于设置磁盘灾难标志和内存灾难标志;
灾难恢复管理模块,用于根据所述磁盘灾难标志和内存灾难标志是否同步判断是否发生灾难,当判断发生灾难时,扫描磁盘空间,根据磁盘空间的实际使用状态遍历所述位图二叉树表,对所述位图二叉树表进行结构更新。
采用本发明进行磁盘空间管理时,除正常的分配回收能力外,具有最佳的磁盘I/O性能。同时,空间可快速合并,形成大的可闲块,利用率高,不会产生碎片。另外,具有良好的数据灾难恢复能力,且不需要占用额外的资源。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明将伙伴算法对于内存空间管理应用于磁盘空间管理,在解决其引入磁盘空间管理带来的问题基础上,利用其特点提供了性能良好、安全而有灾难恢复能力的磁盘空间管理方案,由于结点位置固定,而且其中没有链式指针,不全因指针数据不同步而产生结构错误。
在本发明中,首先将磁盘管理文件写入到磁盘中,图3示出了磁盘管理文件的结构,包括灾难标志、位图二叉树表以及正文,灾难标志、位图二叉树表为磁盘管理文件的Header(头部)部分。其中,位图二叉树表用来记录磁盘空间中结点(空间块)的大小以及使用情况,当数据写入磁盘或者数据被删除时,相应结点被分配或者回收,位图二叉树表的结构将发生更新。正文是用来分配装载数据的磁盘空间。灾难标志用来标识磁盘管理文件是否处于灾难状态,以判断是否进行灾难恢复。
本发明使用位图二叉树表来同时表达伙伴算法中的空闲回收队列与二叉树结构,如图4所示。位图的下标之间的关系反映了如同二叉树的结点父子关系,以位图的值的0与1表示结点的占用状态,该位图二叉树表占用磁盘空间的前64KB。由位图二叉树表的位图下标,可得知某结点的相邻结点的位置与使用情况,也可知某种长度的结点所对应的位图下标上下限。因此,当数据写入磁盘需要分配空间时,可先于该范围内查找空闲结点,如果找不到则递归向更大结点的位图下标上下限内查找空闲块,以***产生所需的空间块。当需要对空闲结点进行回收时,由位图可以确定相邻结点的占用状态,并递归向上合并结点,如图5所示。
如果直接操作磁盘上的位图二叉树表,会由于磁盘I/O造成性能下降,本发明将该位图二叉树表映射到内存成为一个镜像,由于磁盘管理文件映射同步到磁盘的操作,会自动发生在磁盘管理文件映射关闭时由操作***处理,所以使用时只需操作内存镜像,相当于纯内存操作,参见图4。
上述方案除了具有伙伴算法在磁盘空间管理上无碎片的优点外,还具有如下优点:
第一、每块空间都是连续的,对任意长度的数据,理论上只需开销一次磁头定位,有物理磁盘级最高的I/O性能,实际上与数据在物理磁盘上是否连续有关,但依然有最低的磁头定位次数;
第二、伙伴算法的空间***方式与机器的二进制相同,所以很容易可以做到所有块都簇对齐。操作***通常以簇I/O最小操作单元(NTFS的簇为4KB,FAT32为2KB的倍数,Linux下称为块,默认大小是1KB)来管理文件,簇(块)大小通常为2n,对于文件会分配若干个簇用于存放其数据,又由于伙伴算法中的空间块都是这些簇(块)的倍数,不影响簇对齐关系,所以可以断言,所有块的起始地址都位于某簇的起始位置,因此每次操作都只作用于最少的操作***操作单位(簇),如图6所示,这样就会具有最高的磁盘与操作***操作性能。
在本发明中,由于通过位图二叉树表来实现磁盘空间的管理,因此位图二叉树表的数据安全必须的,包括数据安全访问验证与数据灾难恢复。
实现数据安全访问验证时可以在使用的结点前部预留若干字节,用于保存验证信息以区别于空闲结点。在访问时,可以通过验证信息确定该结点状态是否正常、是否可以正常使用,避免分配已使用的结点或是回收本来就空闲的结点。在本发明中,验证信息除了表示结点的使用状态外,还表示此结点的大小,实现可由结点大小与结点地址等信息来产生唯一的安全访问验证码。
在本发明中,除了位图二叉数表是缓存性质外,所有操作都作用于物理磁盘,所以灾难只会影响到该位图二叉树表,只可能产生位图二叉数表的不正确,因此数据灾难恢复可以只针对位图二叉树表来做。
对于因程序异常关闭引起的灾难,由于位图二叉数表使用了磁盘文件映射,操作***维持镜像与磁盘文件的对应关系,即使程序异常关闭,也会由操作***来保持维护位图二叉树表的同步,因此对于该种灾难无需恢复。
对于因***崩溃或磁盘物理崩溃引起的灾难,在本发明的一个实施例中,通过如下方式解决:
在磁盘管理文件头部设置灾难标志,***启动时将该灾难标志连同位图二叉树表一起通过磁盘管理文件映射加载到内存,然后通过磁盘管理文件映射,将磁盘上的磁盘管理文件的灾难标志设置为“灾难发生”,而将其内存镜像的灾难标志设置为“无灾难”,人为产生不同步,这样就可通过两者是否同步来辨认灾难是否发生。当第一种灾难发生时,操作***会维持两者同步,所以磁盘管理文件的灾难标志会更新为“无灾难”,故对该种灾难不会产生误判。当第二种灾难发生时,此时镜像无法被同步回磁盘,由于数据安全访问验证时,结点的验证信息除了表明结点是否使用的状态外,还表达了其大小,而且伙伴算法中每种类型的结点的地址都固定,只需以最小结点的长度4K为扫描间隔,对磁盘空间进行一次扫描,就可以遍历二叉树的所有结点,以纠正位图二叉树的值(所有结点的起始位置都簇对齐,而且在4K的倍数位置上),更新位图二叉树表的结构,使得位图二叉树表与实际的磁盘空间分配使用情况相符,达到灾难恢复的目的。
图7示出了在本发明提供的初始化过程中的灾难恢复的实现流程,详述如下:
在步骤S601中,将磁盘管理文件加载到磁盘;
在步骤S602中,判断该磁盘管理文件是不是新文件,如果磁盘上没有该文件,表明该文件为新文件,执行步骤S603,如果磁盘上已经存在该文件,则执行步骤S604;
在步骤S603中,对该文件的Header部分进行初始化,设置灾难标志,建立位图二叉树表;
在步骤S604中,将Header部分映射到内存,建立镜像;
在步骤S605中,检查磁盘管理文件的灾难标志,如果根据灾难标志发现已经发生过灾难,则执行步骤S606,否则执行步骤S607;
在步骤S606中,对位图二叉树表进行如上所述的灾难恢复;
在步骤S607中,设置灾难标志,使得磁盘管理文件的灾难标志与内存镜像的灾难标志不同步。
当磁盘运行期间,发生数据的动态输入输出时,需要即时调整结点信息,更新位图二叉树表,如图8所示:
当有数据流输入到磁盘时,需要查找位图二叉树表分配结点以便存储数据,并对位图二叉树表的结构进行更新,同时设置结点的头部信息,包括结点大小以及结点地址,建立结点地址索引。
当需要使用结点中的数据,例如数据输出或者被删除时,程序将根据结点地址索引,检查结点地址,找到需要使用数据的对应结点。数据使用后,结点变为空闲,需要同步更新位图二叉树表,以实时记录磁盘的使用状态。
图9示出了本发明提供的磁盘空间管理***的组成结构,为了使得描述更加简便,上面已经描述的内容不再赘述。
应用程序或者操作***的调用对外接口模块901,向磁盘写入或者读出数据,数据读写模块902将数据写入磁盘或者将磁盘中的数据读出。
位图二叉树表管理模块903负责维护更新位图二叉树表,从而使得位图二叉树表与磁盘的实际使用状态保持一致,当数据写入磁盘时,查找位图二叉树表,为数据写入分配相应的结点,当数据从磁盘读出时,回收对应的空闲结点。
灾难标志管理模块904用于设置磁盘管理文件以及内存镜像的灾难标志。灾难恢复管理模块905根据灾难标志管理模块904设置的灾难标志,在判断发生灾难时对位图二叉树表进行灾难恢复。
内存镜像映射模块906负责将位图二叉树表和灾难标志映射到内存,作为内存镜像操作,以提高磁盘空间管理的I/O性能。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。