CN101968795B - 一种数据块长度可变的文件系统缓存方法 - Google Patents
一种数据块长度可变的文件系统缓存方法 Download PDFInfo
- Publication number
- CN101968795B CN101968795B CN2010102717877A CN201010271787A CN101968795B CN 101968795 B CN101968795 B CN 101968795B CN 2010102717877 A CN2010102717877 A CN 2010102717877A CN 201010271787 A CN201010271787 A CN 201010271787A CN 101968795 B CN101968795 B CN 101968795B
- Authority
- CN
- China
- Prior art keywords
- data block
- data
- file
- alive
- data piece
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Abstract
本发明涉及一种数据块长度可变的文件系统缓存方法,属于计算机数据存储技术领域。利用用户态文件系统驱动模块截获来自计算机应用程序的打开已有文件、从已打开文件中读取数据、向已打开文件中写入数据、修改文件属性、以及关闭已打开文件的操作命令,并以守护进程形式运行一个缓存管理模块,将当前各被打开文件中近期被读写的部分数据临时保存为计算机内存中的不定长数据块,以降低文件系统对外部存储设备的访问频率,提高向文件系统中存取数据的效率和吞吐量。本发明方法能够使数据重构和数据切分过程对用户和计算机应用程序透明,从而在不损害兼容性的情况下,使文件系统支持重复数据删除功能,有效提高物理存储空间的利用效率。
Description
技术领域
本发明涉及一种数据块长度可变的文件系统缓存方法,属于计算机数据存储技术领域。
背景技术
文件系统是计算机系统的重要组成部分,它负责将文件组织、管理和存储到外部存储设备(如硬盘、U盘等)上,以实现对数据的持久化保存。然而,将数据直接存储到外部设备上并不是一种高效的明智选择:首先,外部存储设备无法像内部存储器(RAM)一样支持以字节为粒度随机读写数据,例如,硬盘就是以块(block)作为读写数据的基本操作单元,一个块通常包括几千甚至几十万个字节;而且,外部存储设备存取数据(I/O)的速度一般比内部存储器慢几个数量级,更是远远落后于CPU处理数据的速度,成为公认的性能瓶颈。在内部存储器中设置文件系统缓存是解决上述问题的关键机制,它能够显著提高操作系统对外部存储设备的访问效率,从而极大改善向文件系统中存取数据的性能。
由于硬盘等主流外部存储设备是以等大小的扇区作为基本操作单元,传统的文件系统通常把文件内容切分成大小为扇区整数倍的固定长度的数据块进行存储。为此,现有的文件系统缓存方法也都是以定长的数据块作为操作单元。例如,Windows操作系统的文件系统缓存方法就是基于256KB(千字节)的定长数据块单元,通过称作虚拟块地址(VBA)的结构体数组(文件过大时,会采用分级的数组结构)对缓存进行索引。
近年来,随着数据量的爆炸式增长,同一文件的不同版本甚至不同文件之间的重复内容也飞速增长,并促使重复数据删除发展成当前存储领域一项炙手可热的关键技术。在进行重复数据删除时,需要基于文件的内容对文件进行可变长度的切块,才能更有效的删除文件中重复出现的冗余数据,从而提高物理存储空间的利用效率。例如,文件系统中存在A、B两个文件,B文件只是在A文件的起始处插入了几个字节,如果采用固定长度(如100KB)的切块方式,将难以在两个文件切得的数据块中发现和去重冗余数据,但是,如果采用基于内容的不定长分块,则在两个文件切得的数据块中仅有前面的少数几个不同,而后面的大多数数据块都将完全一样,很容易就能够删除两个文件之间的重复数据。
显然,基于定长块的文件系统缓存管理方法并不能有效适应上述基于文件内容进行变长切块的数据操作特点,因为在对缓存中已被修改的数据重新进行基于内容的切分时,需要将待切分的数据放置在一段连续的内存空间中,为此,基于定长块的文件系统缓存将需要进行大量的内存分配和数据搬移操作,既效率低下又管理复杂,稳定性差。
因定长块文件系统缓存方法在支持重复数据删除方面的固有缺陷,很多利用重复数据删除思想降低网络带宽开销的系统,如Muthitacharoen等人在2001年的第18届ACM SOSP大会论文集中提出的“A Low-Bandwidth Network File System”系统以及广域网数据备份同步系统Dropbox等,都需要在客户端保存被操作文件完整副本,而无论是由数据块重构文件副本还是将修改后的文件副本重新切分成数据块都要耗费很多存储和计算资源,是一种低效率的实现方法。
发明内容
本发明的目的是提出一种数据块长度可变的文件系统缓存方法,利用用户态文件系统驱动模块截获来自计算机应用程序的打开已有文件、从已打开文件中读取数据、向已打开文件中写入数据、修改文件属性、以及关闭已打开文件的操作命令,并以守护进程形式运行一个缓存管理模块,将当前各被打开文件中近期被读写的部分数据临时保存为计算机内存中的不定长数据块,以降低文件系统对外部存储设备的访问频率,提高向文件系统中存取数据的效率和吞吐量。
本发明提出的数据块长度可变的文件系统缓存方法,包括以下步骤:
(1)在计算机内存中设置一个全局缓存索引,使全局缓存索引采用哈希表的数据结构,哈希表中的每一条记录对应一个被计算机操作系统当前打开的文件,每一条记录的键是该被打开文件的文件标识,记录的值是该被打开文件包含的数据块的索引树;数据块的索引树采用以数组实现的平衡二叉搜索树结构,索引树中的元素按照与该元素对应的数据块的起始位置在该数据块所属的文件中的偏移量由小到大排列;
将数据块定义为活跃数据块和非活跃数据块:数据块内容在内存中的为活跃数据块,数据块内容不在内存中的为非活跃数据块,将活跃数据块分为内容已经被保存到硬盘上的第一类活跃数据块及更新后的内容未被保存到硬盘上的第二类活跃数据块;
数据块索引树中的每个元素都含有一个指向与该元素对应的数据块的指针,根据指针及该指针指向的数据块的种类,将元素分为以下三类:第一类元素与非活跃数据块对应,指针为空,第二类元素与第一类活跃数据块相对应,指针指向一个第一类活跃数据块,第三类元素是与第二类活跃数据块相对应,指针指向一个第二类活跃数据块;
(2)在计算机内存中设置一个全局活跃数据块链表,采用有序双向链表的数据结构,链表中的活跃数据块按照该数据块最近一次被访问时间由近及远的顺序排列;
(3)设置一个以守护进程形式运行的缓存管理模块,在计算机操作系统中注册用户态文件系统驱动模块,用于接收和响应计算机应用程序对文件系统发起的操作命令,该操作命令包括打开已有文件、从已打开文件中读取数据、向已打开文件中写入数据、修改文件属性、以及关闭已打开的文件,具体过程如下:
(3-1)当用户态文件系统驱动模块接收来自计算机应用程序的打开已有文件的操作命令时,进行以下操作:
(3-1-1)用户态文件系统驱动模块通知缓存管理模块打开与操作命令中指定的文件标识识为X1的文件F1;
(3-1-2)缓存管理模块在全局缓存索引中检索键为X1的记录,若检索到,则通知文件系统继续执行操作命令,若检索不到,则进行步骤(3-1-3);
(3-1-3)从文件系统中读取文件F1的数据块索引信息,为每个数据块生成相应的索引元素,并用生成的所有索引元素创建文件F1的数据块索引树;
(3-1-4)将步骤(3-1-3)中生成的文件F1的数据块索引树保存到全局缓存索引中,并通知文件系统继续执行操作命令;
(3-2)当用户态文件系统驱动模块接收到来自计算机应用程序的从已打开文件中读取数据的操作命令时,进行以下操作:
(3-2-1)用户态文件系统驱动模块通知缓存管理模块对操作命令中指定的文件标识为X2的文件F2从偏移量p2处开始读取长度为m2的数据;
(3-2-2)缓存管理模块分配一块长度为m2的内存空间R2,并将R2初始化为空,内存空间R2的起始位置与文件F2偏移量为p2的位置相对应;
(3-2-3)从全局缓存索引中检索键为X2的记录,从检索到的记录中取出文件F2的数据块索引树T2,从T2中检索元素E2,E2满足:与E2相对应的数据块的起始位置在F2中的偏移量小于p2+m2、且大于或等于与T2中其他元素相对应的数据块起始位置在F2中的偏移量;若检索到元素E2,且待读取数据区域与E2相对应的数据块的覆盖区域存在重叠,进行步骤(3-2-4),若检索不到元素E2,或待读取数据区域与E2相对应的数据块的覆盖区域不存在重叠,则将R2中的数据返回至用户态文件系统驱动模块;
(3-2-4)根据数据块索引树T2及检索到的索引元素E2,确定E2在构成T2的数组中的下标i;
(3-2-5)从构成索引树T2的数组中取出下标为i的元素T[i],对与T[i]相对应的数据块的覆盖区域进行判断,若与T[i]相对应的数据块的覆盖区域与待读取数据区域存在重叠,则进行步骤(3-2-6),若与T[i]相对应的数据块的覆盖区域与待读取数据区域不存在重叠,则将R2中的数据返回至用户态文件系统驱动模块;
(3-2-6)对元素T[i]进行判断,若T[i]为上述第一类元素,则将与元素T[i]对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块,进行步骤(3-2-7);若T[i]为上述第二类元素或上述第三类元素,则修改与元素T[i]相对应的数据块的最新访问时间,并将该数据块移动到全局活跃数据块链表的表头,进行步骤(3-2-7);
(3-2-7)从与元素T[i]对应的数据块中读取该数据块覆盖区域与待读取区域相重叠部分的数据,并将读取的数据写入到R2的相应区域中;
(3-2-8)对元素T[i]的下标i进行判断,若i小于或等于0,则将R2中的数据返回至用户态文件系统驱动模块;若i大于0,则将i赋值为i-1,返回步骤(3-2-5);
(3-3)当用户态文件系统驱动模块接收到来自计算机应用程序的向已打开文件写入数据的操作命令时,进行以下操作:
(3-3-1)根据操作命令,用户态文件系统驱动模块通知缓存管理模块对文件标识为X3的已打开文件F3从偏移量p3处开始写入长度为m3的数据;
(3-3-2)从全局缓存索引中检索键为X3的记录,从检索到的记录中取出文件F3的数据块索引树T3,从T3中检索元素E3,E3满足:与E3相对应的数据块的起始位置在F3中的偏移量小于或等于p3、且大于或等于与T3中其他元素相对应的数据块的起始位置在F3中的偏移量;若检索到元素E3,且p3处于与E3相对应的数据块的覆盖区域之内,则进行步骤(3-3-4),若检索不到元素E3,或p3不处于与E3相对应的数据块的覆盖区域之内,则进行步骤(3-3-3);
(3-3-3)生成一个新元素E3’及与E3’相对应的数据块,将与E3’相对应的数据块的起始位置在F中的偏移量初始化为p3,将E3’插入到文件F3的数据块索引树T3中,将待写入数据写入到与E3’相对应的数据块内,并将与E3’相对应的数据块插入到全局活跃数据块链表的表头,进行步骤(3-3-7);
(3-3-4)对与元素E3相对应的数据块进行判断,若该数据块为活跃数据块,则进行步骤(3-3-6),若该数据块为非活跃数据块,则进行步骤(3-3-5);
(3-3-5)将与E3相对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块;
(3-3-6)根据操作命令,将待写入数据写入到与E3相对应的数据块中,覆盖该数据块尾部与待写入数据区域相重叠的部分;
(3-3-7)从索引树T3中检索元素E3”,E3”满足:与E3”相对应的数据块的起始位置在F3中的偏移量小于p3+m3、且大于或等于与T3中其他元素相对应的数据块的起始位置在F3中的偏移量;若检索到元素E3”,且p3+m3处于与E3”相对应的数据块的覆盖区域之内,则进行步骤(3-3-8),若检索不到元素E3”,或p3+m3不处于与E3”相对应的数据块的覆盖区域之内,则进行步骤(3-3-9);
(3-3-8)将与元素E3”相对应的数据块中的尾部数据D写入到与元素E3相对应的或与元素E3’相对应的数据块的末尾,D满足:D的起始位置在文件F3中的偏移量等于p3+m3;
(3-3-9)对与E3对应的或与元素E3’相对应的数据块的大小进行判断,若该数据块的大小超过文件系统采用的数据块切分算法要求的数据块大小的最大值,则进行步骤(3-3-10),若不超过,则进行步骤(3-3-11);
(3-3-10)用文件系统采用的数据块切分算法对与元素E3相对应的或与元素E3’相对应的数据块进行切分,将新生成的数据块依次插入到全局活跃数据块链表的表头,为每个新生成的数据块创建元素,并将创建的元素插入到索引树T3中;
(3-3-11)修改与元素E3相对应的或与元素E3’相对应的数据块的最新访问时间,将该数据块移动到全局活跃数据块链表的表头;
(3-3-12)从索引树T3中检索元素,该元素满足:与该元素对应的数据块的起始位置在F3中的偏移量大于p3并且小于p3+m3,从T3中删除检索到的元素,从全局活跃数据块链表中删除与检索到的元素相对应的活跃数据块,并释放活跃数据块占用的内存空间,通知文件系统继续执行操作命令;
(3-4)当用户态文件系统驱动模块接收到来自计算机应用程序的修改文件属性的操作命令时,进行以下操作:
(3-4-1)根据操作命令,用户态文件系统驱动模块通知缓存管理模块修改文件标识为X4的文件F4的文件属性;
(3-4-2)对操作命令进行判断,若是修改文件F4的文件大小属性,且修改后的文件大小L4小于文件F4原来的文件大小,则进行步骤(3-4-3),若不是修改文件F4的文件大小属性,或修改后的文件大小L4大于或等于文件F4原来的文件大小,则通知文件系统继续执行操作命令;
(3-4-3)从全局缓存索引中检索键为X4的记录,从检索到的记录中取出文件F4的数据块索引树T4,从T4中检索元素E4,E4满足:与E4相对应的数据块的起始位置在F4中的偏移量小于L4并且大于或等于与T4中其他元素对应的数据块的起始位置在F4中的偏移量,若检索到元素E4、且L4处于与E4对应的数据块的覆盖区域之内,则进行步骤(3-4-4),若检索不到元素E4,或L4不处于与E4对应的数据块的覆盖区域之内,则进行步骤(3-4-7);
(3-4-4)对与E4对应的数据块进行判断,若该数据块为活跃数据块,则进行步骤(3-4-6),若该数据块为非活跃数据块,则进行步骤(3-4-5);
(3-4-5)将与元素E4对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块;
(3-4-6)从与元素E4对应的数据块中删除在F4中的偏移量大于或等于L4的尾部数据,并修改E4中该数据块大小的信息;
(3-4-7)从索引树T4中检索元素,该元素满足:与该元素对应的数据块的起始位置在F4中的偏移量大于或等于L4;从索引树T4中删除检索到的元素,从全局活跃数据块链表中删除与检索到的元素相对应的活跃数据块,并释放活跃数据块占用的内存空间,通知文件系统继续执行操作命令;
(3-5)当用户态文件系统驱动模块接收到来自计算机应用程序的关闭已打开文件的操作命令时,进行以下操作:
(3-5-1)根据操作命令,用户态文件系统驱动模块通知缓存管理进程关闭文件标识为X5的已打开文件F5;
(3-5-2)从全局缓存索引中检索键为X5的记录,若未检索到记录,则通知文件系统继续执行操作命令,若检索到记录,则从检索到的记录中取出文件F5的数据块索引树T5,进行步骤(3-5-3);
(3-5-3)遍历索引树T5中的每一个元素,进行如下操作:
(3-5-3-1)若元素为第一类元素,则跳过该元素,继续处理下一元素,若元素为第二类元素或第三类元素,则进行步骤(3-5-3-2);
(3-5-3-2)若元素为第二类元素,则将与该元素相对应的活跃数据块从全局活跃数据块链表中删除,并释放该活跃数据块占用的内存空间;
(3-5-3-3)若元素为第三类元素,则存储与该元素相对应的活跃数据块的内容,并将该活跃数据块从全局活跃数据块链表中删除,释放该活跃数据块占用的内存空间;
(3-5-4)从全局缓存索引中删除键为X5的记录,并通知文件系统继续执行操作命令;
(4)步骤(3-2-8)、步骤(3-3-5)和步骤(3-4-5)中分别加载数据块到计算机内存成为活跃数据块的过程中,若当前使用的内存空间未超过用户设定的大小,则直接将数据块内容读取到计算机内存中,若当前使用的内存空间已超过用户设定的大小,则从全局活跃数据块链表中替换出一部分活跃数据块,以释放出所需要的内存空间,参见图8所示的流程框图,具体过程如下:
(4-1)根据步骤(3-2-8)、步骤(3-3-5)或步骤(3-4-5)中待加载数据块的大小,缓存管理模块计算出需释放的内存空间大小S;
(4-2)从全局活跃数据块链表的末尾开始遍历全局活跃数据块链表,将遍历指针初始化为指向全局活跃数据块链表的表尾末节点;
(4-3)判断遍历指针指向的当前活跃数据块的种类,若当前活跃数据块为第一类活跃数据块,则进行步骤(4-4),若当前活跃数据块为第二类活跃数据块,则返回步骤(4-3);
(4-4)从全局活跃数据块链表中删除上述当前活跃数据块,释放当前活跃数据块占用的内存空间,并将该内存空间大小记为B1,将与当前活跃数据块相对应的元素的数据块指针赋值为空,将需释放的内存空间大小S更新为S-B1;
(4-5)对需释放的内存空间大小S进行判断,若S小于或等于0,则将待加载数据块的内容读取到计算机内存,若S大于0,则进行步骤(4-6);
(4-6)将全局活跃数据块链表的遍历指针向前移动一步,若无法移动,即遍历指针已经到达全局活跃数据块链表的表头首节点之前,则进行步骤(4-7),若可以移动,则返回步骤(4-3);
(4-7)从全局活跃数据块链表的末尾开始重新遍历全局活跃数据块链表,将遍历指针重新初始化为指向全局活跃数据块链表的表尾末节点;
(4-8)将当前活跃数据块的内容存储到计算机外部存储设备上,从全局活跃数据块链表中删除该当前活跃数据块,释放当前活跃数据块占用的内存空间,并将该内存空间大小记为B2,将与当前活跃数据块对应的元素的数据块指针赋值为空,将需释放的内存空间大小SS更新为S-B2;
(4-9)对需释放的内存空间大小S进行判断,若S小于或等于0,则将待加载数据块的内容读取到计算机内存,若S大于0,则进行步骤(4-10);
(4-10)将全局活跃数据块链表的遍历指针向前移动一步,若无法移动,即遍历指针已经到达全局活跃数据块链表的表头首节点之前,则通知用户态文件系统驱动模块操作命令无法执行。
本发明提出的数据块长度可变的文件系统缓存方法,具备以下优点:
1、利用本发明的方法,能够将近期向文件系统中写入和从文件系统中读取的数据临时存储在内存中,使得后续对这些数据的访问和修改能够直接在内存中完成,将计算机应用程序发起的零散的文件系统操作命令转化成从外部存储设备中批量存取数据,从而有效降低对外部存储设备的访问频率,提高文件系统读、写数据的效率和性能。
2、与已有的数据块长度不可变的文件系统缓存方法相比,本发明的方法采用长度可变的数据块,更具一般性,也更具有更强的通用性和灵活性,长度不可变的文件系统缓存方法可视作是本发明的一种特例。
3、本发明的方法能够更好地支持重复数据删除功能,由于本方法能够使基于文件内容进行长度可变的数据块切分以及由数据块重组文件等操作在文件系统内部完成,因此,它使得重复数据删除过程对应用程序和用户完全透明,让支持重复数据删除的存储系统能够像普通文件系统一样,无缝兼容现有各种应用程序的文件操作,几乎不会对用户感受造成任何负面影响。而且,在支持重复数据删除的时,本方法无须重构文件副本,也无须对文件中未经修改的数据重新进行切分,因此,比其他缓存方法更节省计算资源。
附图说明
图1是本发明方法的数据结构示意图。
图2是本发明方法的系统结构示意图。
图3是本发明方法中文件系统的驱动模块接收到来自应用程序的从已打开文件中读取数据的操作命令时的流程框图。
图4是本发明方法计算读取数据区域的示意图。
图5是本发明方法中文件系统的驱动模块接收到来自应用程序的向已打开文件中写入数据的操作命令时的流程框图。
图6是本发明方法计算写入数据区域的示意图。
图7是本发明方法中文件系统的驱动模块接收到来自应用程序的修改文件属性的操作命令时计算删除数据区域的示意图。
图8是本发明方法进行活跃数据块替换以释放所需内存空间的流程框图。
具体实施方式
下面结合附图,详细介绍本发明提出的数据块长度可变的文件系统缓存方法:
(1)在计算机内存中设置一个全局缓存索引,使全局缓存索引采用哈希表的数据结构,哈希表中的每一条记录对应一个被计算机操作系统当前打开的文件,每一条记录的键是该被打开文件的文件标识,即该被打开文件在文件系统中的inode号,记录的值是该被打开文件包含的数据块的索引树。利用上述全局缓存索引,能够以O(1)的复杂度找到一个被打开文件的数据块索引树。
数据块索引树采用以数组实现的平衡二叉搜索树结构,索引树中的元素按照与该元素对应的数据块的起始位置在该数据块所属的文件中的偏移量由小到大排列。对于含有N个数据块的文件,给定任一偏移量,就能够通过该文件的数据块索引树以O(logN)的复杂度检索到与该偏移量最近邻的数据块。而且,由于数据块索引树以数组结构实现,因此能够通过树中元素在数组中的下标,以O(1)的复杂度对该元素进行访问。
根据数据块内容当前是否在内存之中,将数据块定义为活跃数据块和非活跃数据块:数据块内容在内存中的为活跃数据块,数据块内容不在内存中的为非活跃数据块,将活跃数据块分为内容已经被保存到硬盘上的第一类活跃数据块及更新后的内容未被保存到硬盘上的第二类活跃数据块。
数据块索引树中的每个元素都含有一个指向与该元素对应的数据块的指针,根据指针及该指针指向的数据块的种类,将元素分为以下三类:第一类元素与非活跃数据块对应,指针为空,第二类元素与第一类活跃数据块相对应,指针指向一个第一类活跃数据块,第三类元素是与第二类活跃数据块相对应,指针指向一个第二类活跃数据块。
(2)在计算机内存中设置一个全局活跃数据块链表,采用有序双向链表的数据结构,链表中的活跃数据块按照该数据块最近一次被访问时间由近及远的顺序排列,也就是说,将最近刚刚被访问的活跃数据块置于全局活跃数据块链表的表头,而将已经最久未被访问的活跃数据块置于全局活跃数据块链表的表尾。
图1展示了内存中全局缓存索引和活跃数据块链表的数据结构以及它们二者之间的相互联系。
(3)如图2中的系统结构图所示,设置一个以守护进程形式运行的缓存管理模块,在计算机操作系统中注册用户态文件系统驱动模块,用于接收和响应计算机应用程序对文件系统发起的操作命令,该操作命令包括打开已有文件、从已打开文件中读取数据、向已打开文件中写入数据、修改文件属性、以及关闭已打开的文件,具体过程如下:
(3-1)当用户态文件系统驱动模块接收来到自计算机应用程序的打开已有文件的操作命令时,进行以下操作:
(3-1-1)用户态文件系统驱动模块通知缓存管理模块打开与操作命令中指定的文件标识为X1的文件F1;
(3-1-2)缓存管理模块在全局缓存索引中检索键为X1的记录,若检索到,则通知文件系统继续执行操作命令,若检索不到,则进行步骤(3-1-3);
(3-1-3)从文件系统中读取文件F1的数据块索引信息,为每个数据块生成相应的索引元素,并用生成的所有索引元素创建文件F1的数据块索引树;
(3-1-4)将步骤(3-1-3)中生成的文件F1的数据块索引树保存到全局缓存索引中,并通知文件系统继续执行操作命令。
(3-2)当用户态文件系统驱动模块接收到来自计算机应用程序的从已打开文件中读取数据的操作命令时,参见图3所示的流程框图,进行以下操作:
(3-2-1)用户态文件系统驱动模块通知缓存管理模块对操作命令中指定的文件标识为X2的文件F2从偏移量p2处开始读取长度为m2的数据;
(3-2-2)缓存管理模块分配一块长度为m2的内存空间R2,并将R2初始化为空,内存空间R2的起始位置与文件F2偏移量为p2的位置相对应;
(3-2-3)从全局缓存索引中检索键为X2的记录,从检索到的记录中取出文件F2的数据块索引树T2,从T2中检索元素E2,E2满足:与E2相对应的数据块的起始位置在F2中的偏移量小于p2+m2、且大于或等于与T2中其他元素相对应的数据块起始位置在F2中的偏移量,参见图4所示的示意图;若检索到元素E2,且待读取数据区域与E2相对应的数据块的覆盖区域存在重叠,进行步骤(3-2-4),若检索不到元素E2,或待读取数据区域与E2相对应的数据块的覆盖区域不存在重叠,则将R2中的数据返回至用户态文件系统驱动模块;
(3-2-4)根据数据块索引树T2及检索到的索引元素E2,确定E2在构成T2的数组中的下标i;
(3-2-5)从构成索引树T2的数组中取出下标为i的元素T[i],对与T[i]相对应的数据块的覆盖区域进行判断,若与T[i]相对应的数据块的覆盖区域与待读取数据区域存在重叠,则进行步骤(3-2-6),若与T[i]相对应的数据块的覆盖区域与待读取数据区域不存在重叠,则将R2中的数据返回至用户态文件系统驱动模块;
(3-2-6)对元素T[i]进行判断,若T[i]为上述第一类元素,则将与元素T[i]对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块,进行步骤(3-2-7);若T[i]为上述第二类元素或上述第三类元素,则修改与元素T[i]相对应的数据块的最新访问时间,并将该数据块移动到全局活跃数据块链表的表头,进行步骤(3-2-7);
(3-2-7)从与元素T[i]对应的数据块中读取该数据块覆盖区域与待读取区域相重叠部分的数据,并将读取的数据写入到R2的相应区域中;
(3-2-8)对元素T[i]的下标i进行判断,若i小于或等于0,则将R2中的数据返回至用户态文件系统驱动模块;若i大于0,则将i赋值为i-1,返回步骤(3-2-5)。
(3-3)当用户态文件系统驱动模块接收到来自计算机应用程序的向已打开文件写入数据的操作命令时,参见图5所示的流程框图,进行以下操作:
(3-3-1)根据操作命令,用户态文件系统驱动模块通知缓存管理模块对文件标识为X3的已打开文件F3从偏移量p3处开始写入长度为m3的数据;
(3-3-2)从全局缓存索引中检索键为X3的记录,从检索到的记录中取出文件F3的数据块索引树T3,从T3中检索元素E3,E3满足:与E3相对应的数据块的起始位置在F3中的偏移量小于或等于p3、且大于或等于与T3中其他元素相对应的数据块的起始位置在F3中的偏移量,参见图6所示的示意图;若检索到元素E3,且p3处于与E3相对应的数据块的覆盖区域之内,则进行步骤(3-3-4),若检索不到元素E3,或p3不处于与E3相对应的数据块的覆盖区域之内,则进行步骤(3-3-3);
(3-3-3)生成一个新元素E3’及与E3’相对应的数据块,将与E3’相对应的数据块的起始位置在F3中的偏移量初始化为p3,将E3’插入到文件F3的数据块索引树T3中,将待写入数据写入到与E3’相对应的数据块内,并将该数据块插入到全局活跃数据块链表的表头;进行步骤(3-3-7);
(3-3-4)对与元素E3相对应的数据块进行判断,若该数据块为活跃数据块,则进行步骤(3-3-6),若该数据块为非活跃数据块,则进行步骤(3-3-5);
(3-3-5)将与E3相对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块;
(3-3-6)根据操作命令,将待写入数据写入到与E3相对应的数据块中,覆盖该数据块尾部与待写入数据区域相重叠的部分,参见图6所示的示意图;
(3-3-7)从索引树T3中检索元素E3”,E3”满足:与E3”相对应的数据块的起始位置在F3中的偏移量小于p3+m3、且大于或等于与T3中其他元素相对应的数据块的起始位置在F3中的偏移量,参见图6所示的示意图;若检索到元素E3”,且p3+m3处于与E3”相对应的数据块的覆盖区域之内,则进行步骤(3-3-8),若检索不到元素E3”,或p3+m3不处于与E3”相对应的数据块的覆盖区域之内,则进行步骤(3-3-9);
(3-3-8)将与元素E3”相对应的数据块中的尾部数据D写入到与元素E3相对应的或与元素E3’相对应的数据块的末尾,D满足:D的起始位置在文件F3中的偏移量等于p3+m3;
(3-3-9)对与E3相对应的或与E3’相对应数据块的大小进行判断,若该数据块的大小超过文件系统使用的数据块切分算法要求的数据块大小的最大值,则进行步骤(3-3-10),若不超过,则进行步骤(3-3-11);
(3-3-10)用文件系统使用的数据块切分算法对与元素E3相对应的或与元素E3’相对应的数据块进行切分,在本方法的一个实施例中,具体使用了Muthitacharoen等人在“A Low-Bandwidth Network File System”一文中提出的基于文件内容的Rabin指纹的可变长数据块切分方法;将新生成的数据块依次插入到全局活跃数据块链表的表头,为每个新生成的数据块创建元素,并将创建的元素插入到索引树T3中;
(3-3-11)修改与元素E3相对应与元素E3’相对应的数据块的最新访问时间,将该数据块移动到全局活跃数据块链表的表头;
(3-3-12)从索引树T3中检索元素,该元素满足:与该元素对应的数据块的起始位置在F3中的偏移量大于p3并且小于p3+m3,从T3中删除检索到的元素,从全局活跃数据块链表中删除与检索到的元素相对应的活跃数据块,并释放活跃数据块占用的内存空间,通知文件系统继续执行操作命令;
(3-4)当用户态文件系统驱动模块接收到来自计算机应用程序的修改文件属性的操作命令时,进行以下操作:
(3-4-1)根据操作命令,用户态文件系统驱动模块通知缓存管理模块修改文件标识为X4的文件F4的文件属性;
(3-4-2)对操作命令进行判断,若是修改文件F4的文件大小属性,且修改后的文件大小L4小于文件F4原来的文件大小,则进行步骤(3-4-3),若不是修改文件F4的文件大小属性,或修改后的文件大小L4大于或等于文件F4原来的文件大小,则通知文件系统继续护行操作命令;
(3-4-3)从全局缓存索引中检索键为X4的记录,从检索到的记录中取出文件F4的数据块索引树T4,从T4中检索元素E4,E4满足:与E4相对应的数据块的起始位置在F4中的偏移量小于L4并且大于或等于与T4中其他元素对应的数据块的起始位置在F4中的偏移量,参见图7所示的示意图;若检索到元素E4、且L4处于与E4对应的数据块的覆盖区域之内,则进行步骤(3-4-4),若检索不到元素E4,或L4不处于与E4对应的数据块的覆盖区域之内,则进行步骤(3-4-7);
(3-4-4)对与E4对应的数据块进行判断,若该数据块为活跃数据块,则进行步骤(3-4-6),若该数据块为非活跃数据块,则进行步骤(3-4-5);
(3-4-5)将与元素E4对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块;
(3-4-6)从与元素E4对应的数据块中删除在F4中的偏移量大于或等于L4的尾部数据,参见图7所示的示意图;
(3-4-7)从索引树T4中检索元素,该元素满足:与该元素对应的数据块的起始位置在F4中的偏移量大于或等于L4;从索引树T4中删除检索到的元素,从全局活跃数据块链表中删除与检索到的元素相对应的活跃数据块,并释放活跃数据块占用的内存空间,通知文件系统继续执行操作命令;
(3-5)当用户态文件系统驱动模块接收到来自计算机应用程序的关闭已打开文件的操作命令时,进行以下操作:
(3-5-1)根据操作命令,用户态文件系统驱动模块通知缓存管理进程关闭文件标识为X5的已打开文件F5;
(3-5-2)从全局缓存索引中检索键为X5的记录,若未检索到记录,则通知文件系统继续执行操作命令,若检索到记录,则从检索到的记录中取出文件F5的数据块索引树T5,进行步骤(3-5-3);
(3-5-3)遍历索引树T5中的每一个元素,进行如下操作:
(3-5-3-1)若元素为第一类元素,则跳过该元素,继续处理下一元素,若元素为第二类元素或第三类元素,则进行步骤(3-5-3-2);
(3-5-3-2)若元素为第二类元素,则将与该元素相对应的活跃数据块从全局活跃数据块链表中删除,并释放该活跃数据块占用的内存空间;
(3-5-3-3)若元素为第三类元素,则存储与该元素相对应的活跃数据块的内容,并将该活跃数据块从全局活跃数据块链表中删除,释放该活跃数据块占用的内存空间;
(3-5-4)从全局缓存索引中删除键为X5的记录,并通知文件系统继续执行操作命令;
(4)步骤(3-2-8)、步骤(3-3-5)和步骤(3-4-5)中分别加载数据块到计算机内存成为活跃数据块的过程中,若当前使用的内存空间未超过用户设定的大小,则直接将数据块内容读取到计算机内存中,若当前使用的内存空间已超过用户设定的大小,则从全局活跃数据块链表中替换出一部分活跃数据块,以释放出所需要的内存空间,在进行替换时,采用“最近最少优先”(LRU)的替换策略,并且优先替换内容已经被成功存储到硬盘上的活跃数据块,再替换内容尚未被成功存储到硬盘上的活跃数据块,具体过程如下:
(4-1)根据步骤(3-2-8)、步骤(3-3-5)或步骤(3-4-5)中待加载数据块的大小,缓存管理模块计算出需释放的内存空间大小S;在计算需释放的内存空间大小S时,为避免频繁进行替换,本方法的一个实施例中考虑下述二项因素:待加载数据块大小的10倍和当前使用内存空间大小的一半,并令需释放内存空间大小S等于二者中的最小值;
(4-2)从全局活跃数据块链表的末尾开始遍历全局活跃数据块链表,将遍历指针初始化为指向全局活跃数据块链表的表尾末节点;
(4-3)判断遍历指针指向的当前活跃数据块的种类,若当前活跃数据块为第一类活跃数据块,则进行步骤(4-4),若当前活跃数据块为第二类活跃数据块,则返回步骤(4-3);
(4-4)从全局活跃数据块链表中删除上述当前活跃数据块,释放当前活跃数据块占用的内存空间,并将该内存空间大小记为B1,将与当前活跃数据块相对应的元素的数据块指针赋值为空,将需释放的内存空间大小S更新为S-B1;
(4-5)对需释放的内存空间大小S进行判断,若S小于或等于0,则将待加载数据块的内容读取到计算机内存,若S大于0,则进行步骤(4-6);
(4-6)将全局活跃数据块链表的遍历指针向前移动一步,若无法移动,即遍历指针已经到达全局活跃数据块链表的表头首节点之前,则进行步骤(4-7),若可以移动,则返回步骤(4-3);
(4-7)从全局活跃数据块链表的末尾开始重新遍历全局活跃数据块链表,将遍历指针重新初始化为指向全局活跃数据块链表的表尾末节点;
(4-8)将当前活跃数据块的内容存储到计算机外部存储设备上,从全局活跃数据块链表中删除该当前活跃数据块,释放当前活跃数据块占用的内存空间,并将该内存空间大小记为B2,将与当前活跃数据块对应的元素的数据块指针赋值为空,将需释放的内存空间大小SS更新为S-B2;
(4-9)对需释放的内存空间大小S进行判断,若S小于或等于0,则将待加载数据块的内容读取到计算机内存,若S大于0,则进行步骤(4-10);
(4-10)将全局活跃数据块链表的遍历指针向前移动一步,若无法移动,即遍历指针已经到达全局活跃数据块链表的表头首节点之前,则通知用户态文件系统驱动模块操作命令无法执行。
Claims (1)
1.一种数据块长度可变的文件系统缓存方法,其特征在于该方法包括以下步骤:
(1)在计算机内存中设置一个全局缓存索引,使全局缓存索引采用哈希表的数据结构,哈希表中的每一条记录对应一个被计算机操作系统当前打开的文件,每一条记录的键是该被打开文件的文件标识,记录的值是该被打开文件包含的数据块的索引树;数据块的索引树采用以数组实现的平衡二叉搜索树结构,索引树中的元素按照与该元素对应的数据块的起始位置在该数据块所属的文件中的偏移量由小到大排列;
将数据块定义为活跃数据块和非活跃数据块:数据块内容在内存中的为活跃数据块,数据块内容不在内存中的为非活跃数据块,将活跃数据块分为内容已经被保存到硬盘上的第一类活跃数据块及更新后的内容未被保存到硬盘上的第二类活跃数据块;
数据块索引树中的每个元素都含有一个指向与该元素对应的数据块的指针,根据指针及该指针指向的数据块的种类,将元素分为以下三类:第一类元素与非活跃数据块对应,指针为空,第二类元素与第一类活跃数据块相对应,指针指向一个第一类活跃数据块,第三类元素是与第二类活跃数据块相对应,指针指向一个第二类活跃数据块;
(2)在计算机内存中设置一个全局活跃数据块链表,采用有序双向链表的数据结构,链表中的活跃数据块按照该数据块最近一次被访问时间由近及远的顺序排列;
(3)设置一个以守护进程形式运行的缓存管理模块,在计算机操作系统中注册用户态文件系统驱动模块,用于接收和响应计算机应用程序对文件系统发起的操作命令,该操作命令包括打开已有文件、从已打开文件中读取数据、向已打开文件中写入数据、修改文件属性、以及关闭已打开的文件,具体过程如下:
(3-1)当用户态文件系统驱动模块接收来自计算机应用程序的打开已有文件的操作命令时,进行以下操作:
(3-1-1)用户态文件系统驱动模块通知缓存管理模块打开与操作命令中指定的文件标识为X1的文件F1;
(3-1-2)缓存管理模块在全局缓存索引中检索键为X1的记录,若检索到,则通知文件系统继续执行操作命令,若检索不到,则进行步骤(3-1-3);
(3-1-3)从文件系统中读取文件F1的数据块索引信息,为每个数据块生成相应的索引元素,并用生成的所有索引元素创建文件F1的数据块索引树;
(3-1-4)将步骤(3-1-3)中生成的文件F1的数据块索引树保存到全局缓存索引中,并通知文件系统继续执行操作命令;
(3-2)当用户态文件系统驱动模块接收到来自计算机应用程序的从已打开文件中读取数据的操作命令时,进行以下操作:
(3-2-1)用户态文件系统驱动模块通知缓存管理模块对操作命令中指定的文件标识为X2的文件F2从偏移量p2处开始读取长度为m2的数据;
(3-2-2)缓存管理模块分配一块长度为m2的内存空间R2,并将R2初始化为空,内存空间R2的起始位置与文件F2偏移量为p2的位置相对应;
(3-2-3)从全局缓存索引中检索键为X2的记录,从检索到的记录中取出文件F2的数据块索引树T2,从T2中检索元素E2,E2满足:与E2相对应的数据块的起始位置在F2中的偏移量小于p2+m2、且大于或等于与T2中其他元素相对应的数据块起始位置在F2中的偏移量;若检索到元素E2,且待读取数据区域与E2相对应的数据块的覆盖区域存在重叠,进行步骤(3-2-4),若检索不到元素E2,或待读取数据区域与E2相对应的数据块的覆盖区域不存在重叠,则将R2中的数据返回至用户态文件系统驱动模块;
(3-2-4)根据数据块索引树T2及检索到的索引元素E2,确定E2在构成T2的数组中的下标i;
(3-2-5)从构成索引树T2的数组中取出下标为i的元素T[i],对与T[i]相对应的数据块的覆盖区域进行判断,若与T[i]相对应的数据块的覆盖区域与待读取数据区域存在重叠,则进行步骤(3-2-6),若与T[i]相对应的数据块的覆盖区域与待读取数据区域不存在重叠,则将R2中的数据返回至用户态文件系统驱动模块;
(3-2-6)对元素T[i]进行判断,若T[i]为上述第一类元素,则将与元素T[i]对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块,进行步骤(3-2-7);若T[i]为上述第二类元素或上述第三类元素,则修改与元素T[i]相对应的数据块的最新访问时间,并将该数据块移动到全局活跃数据块链表的表头,进行步骤(3-2-7);
(3-2-7)从与元素T[i]对应的数据块中读取该数据块覆盖区域与待读取区域相重叠部分的数据,并将读取的数据写入到R2的相应区域中;
(3-2-8)对元素T[i]的下标i进行判断,若i小于或等于0,则将R2中的数据返回至用户态文件系统驱动模块;若i大于0,则将i赋值为i-1,返回步骤(3-2-5);
(3-3)当用户态文件系统驱动模块接收到来自计算机应用程序的向已打开文件写入数据的操作命令时,进行以下操作:
(3-3-1)根据操作命令,用户态文件系统驱动模块通知缓存管理模块对文件标识为X3的已打开文件F3从偏移量p3处开始写入长度为m3的数据;
(3-3-2)从全局缓存索引中检索键为X3的记录,从检索到的记录中取出文件F3的数据块索引树T3,从T3中检索元素E3,E3满足:与E3相对应的数据块的起始位置在F3中的偏移量小于或等于p3、且大于或等于与T3中其他元素相对应的数据块的起始位置在F3中的偏移量;若检索到元素E3,且p3处于与E3相对应的数据块的覆盖区域之内,则进行步骤(3-3-4),若检索不到元素E3,或p3不处于与E3相对应的数据块的覆盖区域之内,则进行步骤(3-3-3);
(3-3-3)生成一个新元素E3’及与E3’相对应的数据块,将与E3’相对应的数据块的起始位置在F中的偏移量初始化为p3,将E3’插入到文件F3的数据块索引树T3中,将待写入数据写入到与E3’相对应的数据块内,并将与E3’相对应的数据块插入到全局活跃数据块链表的表头,进行步骤(3-3-7);
(3-3-4)对与元素E3相对应的数据块进行判断,若该数据块为活跃数据块,则进行步骤(3-3-6),若该数据块为非活跃数据块,则进行步骤(3-3-5);
(3-3-5)将与E3相对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块;
(3-3-6)根据操作命令,将待写入数据写入到与E3相对应的数据块中,覆盖该数据块尾部与待写入数据区域相重叠的部分;
(3-3-7)从索引树T3中检索元素E3”,E3”满足:与E3”相对应的数据块的起始位置在F3中的偏移量小于p3+m3、且大于或等于与T3中其他元素相对应的数据块的起始位置在F3中的偏移量;若检索到元素E3”,且p3+m3处于与E3”相对应的数据块的覆盖区域之内,则进行步骤(3-3-8),若检索不到元素E3”,或p3+m3不处于与E3”相对应的数据块的覆盖区域之内,则进行步骤(3-3-9);
(3-3-8)将与元素E3”相对应的数据块中的尾部数据D写入到与元素E3相对应的或与元素E3’相对应的数据块的末尾,D满足:D的起始位置在文件F3中的偏移量等于p3+m3;
(3-3-9)对与E3对应的或与元素E3’相对应的数据块的大小进行判断,若该数据块的大小超过文件系统采用的数据块切分算法要求的数据块大小的最大值,则进行步骤(3-3-10),若不超过,则进行步骤(3-3-11);
(3-3-10)用文件系统采用的数据块切分算法对与元素E3相对应的或与元素E3’相对应的数据块进行切分,将新生成的数据块依次插入到全局活跃数据块链表的表头,为每个新生成的数据块创建元素,并将创建的元素插入到索引树T3中;
(3-3-11)修改与元素E3相对应的或与元素E3’相对应的数据块的最新访问时间,将该数据块移动到全局活跃数据块链表的表头;
(3-3-12)从索引树T3中检索元素,该元素满足:与该元素对应的数据块的起始位置在F3中的偏移量大于p3并且小于p3+m3,从T3中删除检索到的元素,从全局活跃数据块链表中删除与检索到的元素相对应的活跃数据块,并释放活跃数据块占用的内存空间,通知文件系统继续执行操作命令;
(3-4)当用户态文件系统驱动模块接收到来自计算机应用程序的修改文件属性的操作命令时,进行以下操作:
(3-4-1)根据操作命令,用户态文件系统驱动模块通知缓存管理模块修改文件标识为X4的文件F4的文件属性;
(3-4-2)对操作命令进行判断,若是修改文件F4的文件大小属性,且修改后的文件大小L4小于文件F4原来的文件大小,则进行步骤(3-4-3),若不是修改文件F4的文件大小属性,或修改后的文件大小L4大于或等于文件F4原来的文件大小,则通知文件系统继续执行操作命令;
(3-4-3)从全局缓存索引中检索键为X4的记录,从检索到的记录中取出文件F4的数据块索引树T4,从T4中检索元素E4,E4满足:与E4相对应的数据块的起始位置在F4中的偏移量小于L4并且大于或等于与T4中其他元素对应的数据块的起始位置在F4中的偏移量,若检索到元素E4、且L4处于与E4对应的数据块的覆盖区域之内,则进行步骤(3-4-4),若检索不到元素E4,或L4不处于与E4对应的数据块的覆盖区域之内,则进行步骤(3-4-7);
(3-4-4)对与E4对应的数据块进行判断,若该数据块为活跃数据块,则进行步骤(3-4-6),若该数据块为非活跃数据块,则进行步骤(3-4-5);
(3-4-5)将与元素E4对应的数据块加载到全局活跃数据块链表的表头,使该数据块成为活跃数据块;
(3-4-6)从与元素E4对应的数据块中删除在F4中的偏移量大于或等于L4的尾部数据,并修改E4中该数据块大小的信息;
(3-4-7)从索引树T4中检索元素,该元素满足:与该元素对应的数据块的起始位置在F4中的偏移量大于或等于L4;从索引树T4中删除检索到的元素,从全局活跃数据块链表中删除与检索到的元素相对应的活跃数据块,并释放活跃数据块占用的内存空间,通知文件系统继续执行操作命令;
(3-5)当用户态文件系统驱动模块接收到来自计算机应用程序的关闭已打开文件的操作命令时,进行以下操作:
(3-5-1)根据操作命令,用户态文件系统驱动模块通知缓存管理进程关闭文件标识为X5的已打开文件F5;
(3-5-2)从全局缓存索引中检索键为X5的记录,若未检索到记录,则通知文件系统继续执行操作命令,若检索到记录,则从检索到的记录中取出文件F5的数据块索引树T5,进行步骤(3-5-3);
(3-5-3)遍历索引树T5中的每一个元素,进行如下操作:
(3-5-3-1)若元素为第一类元素,则跳过该元素,继续处理下一元素,若元素为第二类元素或第三类元素,则进行步骤(3-5-3-2);
(3-5-3-2)若元素为第二类元素,则将与该元素相对应的活跃数据块从全局活跃数据块链表中删除,并释放该活跃数据块占用的内存空间;
(3-5-3-3)若元素为第三类元素,则存储与该元素相对应的活跃数据块的内容,并将该活跃数据块从全局活跃数据块链表中删除,释放该活跃数据块占用的内存空间;
(3-5-4)从全局缓存索引中删除键为X5的记录,并通知文件系统继续执行操作命令;
(4)步骤(3-2-8)、步骤(3-3-5)和步骤(3-4-5)中分别加载数据块到计算机内存成为活跃数据块的过程中,若当前使用的内存空间未超过用户设定的大小,则直接将数据块内容读取到计算机内存中,若当前使用的内存空间已超过用户设定的大小,则从全局活跃数据块链表中替换出一部分活跃数据块,以释放出所需要的内存空间,具体过程如下:
(4-1)根据步骤(3-2-8)、步骤(3-3-5)或步骤(3-4-5)中待加载数据块的大小,缓存管理模块计算出需释放的内存空间大小S;
(4-2)从全局活跃数据块链表的末尾开始遍历全局活跃数据块链表,将遍历指针初始化为指向全局活跃数据块链表的表尾末节点;
(4-3)判断遍历指针指向的当前活跃数据块的种类,若当前活跃数据块为第一类活跃数据块,则进行步骤(4-4),若当前活跃数据块为第二类活跃数据块,则返回步骤(4-3);
(4-4)从全局活跃数据块链表中删除上述当前活跃数据块,释放当前活跃数据块占用的内存空间,并将该内存空间大小记为B1,将与当前活跃数据块相对应的元素的数据块指针赋值为空,将需释放的内存空间大小S更新为S-B1;
(4-5)对需释放的内存空间大小S进行判断,若S小于或等于0,则将待加载数据块的内容读取到计算机内存,若S大于0,则进行步骤(4-6);
(4-6)将全局活跃数据块链表的遍历指针向前移动一步,若无法移动,即遍历指针已经到达全局活跃数据块链表的表头首节点之前,则进行步骤(4-7),若可以移动,则返回步骤(4-3);
(4-7)从全局活跃数据块链表的末尾开始重新遍历全局活跃数据块链表,将遍历指针重新初始化为指向全局活跃数据块链表的表尾末节点;
(4-8)将当前活跃数据块的内容存储到计算机外部存储设备上,从全局活跃数据块链表中删除该当前活跃数据块,释放当前活跃数据块占用的内存空间,并将该内存空间大小记为B2,将与当前活跃数据块对应的元素的数据块指针赋值为空,将需释放的内存空间大小S更新为S-B2;
(4-9)对需释放的内存空间大小S进行判断,若S小于或等于0,则将待加载数据块的内容读取到计算机内存,若S大于0,则进行步骤(4-10);
(4-10)将全局活跃数据块链表的遍历指针向前移动一步,若无法移动,即遍历指针已经到达全局活跃数据块链表的表头首节点之前,则通知用户态文件系统驱动模块操作命令无法执行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010102717877A CN101968795B (zh) | 2010-09-03 | 2010-09-03 | 一种数据块长度可变的文件系统缓存方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010102717877A CN101968795B (zh) | 2010-09-03 | 2010-09-03 | 一种数据块长度可变的文件系统缓存方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101968795A CN101968795A (zh) | 2011-02-09 |
CN101968795B true CN101968795B (zh) | 2012-05-09 |
Family
ID=43547952
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010102717877A Expired - Fee Related CN101968795B (zh) | 2010-09-03 | 2010-09-03 | 一种数据块长度可变的文件系统缓存方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101968795B (zh) |
Families Citing this family (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102298631B (zh) * | 2011-08-31 | 2013-08-21 | 江苏大学 | 一种新型元数据管理系统和一种元数据属性混合索引方法 |
CN102999427B (zh) * | 2011-09-19 | 2015-06-17 | 汉王科技股份有限公司 | 内存空洞检测和清除的方法和装置 |
CN102508902A (zh) * | 2011-11-08 | 2012-06-20 | 西安电子科技大学 | 云存储系统中可变分块大小的块数据分块方法 |
CN103514106B (zh) * | 2012-06-20 | 2016-06-22 | 北京神州泰岳软件股份有限公司 | 一种数据缓存方法 |
CN102779180B (zh) * | 2012-06-29 | 2015-09-09 | 华为技术有限公司 | 数据存储系统的操作处理方法,数据存储系统 |
CN103077232A (zh) * | 2013-01-07 | 2013-05-01 | 北京亿赞普网络技术有限公司 | 一种数据处理方法和装置 |
CN103984647B (zh) * | 2013-02-08 | 2017-07-21 | 上海芯豪微电子有限公司 | 存储表替换方法 |
US20160217079A1 (en) | 2013-02-08 | 2016-07-28 | Shanghai Xinhao Microelectronics Co., Ltd. | High-Performance Instruction Cache System and Method |
CN104050200B (zh) * | 2013-03-15 | 2017-12-08 | 伊姆西公司 | 用于数据拷贝的方法和装置 |
CN104516828B (zh) * | 2013-09-27 | 2018-01-09 | 伊姆西公司 | 用于移除缓存数据的方法和设备 |
CN104699692B (zh) * | 2013-12-04 | 2018-06-15 | 华为技术有限公司 | 一种处理数据的方法和装置 |
CN103955530B (zh) * | 2014-05-12 | 2017-02-22 | 暨南大学 | 一种在线重复数据删除系统的数据重建优化方法 |
CN105205069B (zh) * | 2014-06-24 | 2020-04-21 | 鸿合科技股份有限公司 | 一种基于分页文件的缓存打开方法和装置 |
CN104268231B (zh) * | 2014-09-26 | 2018-03-06 | 可牛网络技术(北京)有限公司 | 一种文件访问方法、装置及智能文件系统 |
CN105068889B (zh) * | 2015-08-03 | 2018-05-25 | 四川效率源信息安全技术股份有限公司 | 恢复Ext3/Ext4中已彻底删除文件的方法 |
CN107193947A (zh) * | 2017-05-22 | 2017-09-22 | 郑州云海信息技术有限公司 | 一种文件系统缓存增量刷新方法及系统 |
CN109445702B (zh) * | 2018-10-26 | 2019-12-06 | 黄淮学院 | 一种块级数据去重存储系统 |
CN111736913B (zh) * | 2019-03-25 | 2021-11-19 | 华为技术有限公司 | 类加载方法和装置 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101699412B (zh) * | 2009-10-15 | 2012-02-22 | 清华大学 | 一种计算机事务存储方法 |
CN101694639B (zh) * | 2009-10-15 | 2011-06-01 | 清华大学 | 一种计算机数据的缓存方法 |
CN101770504B (zh) * | 2009-12-29 | 2012-08-29 | 成都市华为赛门铁克科技有限公司 | 数据存储、读取方法及设备 |
CN101777056B (zh) * | 2009-12-31 | 2012-01-04 | 成都市华为赛门铁克科技有限公司 | 数据存储方法及设备 |
-
2010
- 2010-09-03 CN CN2010102717877A patent/CN101968795B/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN101968795A (zh) | 2011-02-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101968795B (zh) | 一种数据块长度可变的文件系统缓存方法 | |
US10031675B1 (en) | Method and system for tiering data | |
EP2780796B1 (en) | Method of and system for merging, storing and retrieving incremental backup data | |
CN101187901B (zh) | 一种实现文件访问的高速缓存系统和方法 | |
CN101263462B (zh) | 具有区块管理的非易失性存储器 | |
US20060218347A1 (en) | Memory card | |
US20140164730A1 (en) | System and methods for managing storage space allocation | |
CN109445702B (zh) | 一种块级数据去重存储系统 | |
CN101777017B (zh) | 一种连续数据保护系统的快速恢复方法 | |
CN103164490B (zh) | 一种不固定长度数据的高效存储实现方法和装置 | |
US9146928B1 (en) | Techniques for storing metadata of a filesystem in persistent memory | |
CN101183383A (zh) | 一种快照系统及其使用方法 | |
EP2972747B1 (en) | Data storage, file and volume system providing mutliple tiers | |
US20230046216A1 (en) | Data management system and method of controlling | |
CN100424699C (zh) | 一种属性可扩展的对象文件系统 | |
US9116904B2 (en) | File system operation on multi-tiered volume | |
CN101916290B (zh) | 内存数据库的管理方法和装置 | |
KR101356470B1 (ko) | 플래시 파일 시스템 | |
CN104461390A (zh) | 将数据写入叠瓦状磁记录smr硬盘的方法及装置 | |
US20140281227A1 (en) | Provisioning in heterogenic volume of multiple tiers | |
CN103761053A (zh) | 一种数据处理方法和装置 | |
CN102169460A (zh) | 变长数据管理方法及装置 | |
WO2021208239A1 (zh) | 一种低延迟的文件系统地址空间管理方法、系统及介质 | |
CA2758235A1 (en) | Device and method for storage, retrieval, relocation, insertion or removal of data in storage units | |
CN103473298A (zh) | 数据归档方法和装置以及存储系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120509 Termination date: 20210903 |
|
CF01 | Termination of patent right due to non-payment of annual fee |