CN110990302B - 数据缓存方法、装置、电子设备及存储介质 - Google Patents
数据缓存方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN110990302B CN110990302B CN201911158097.8A CN201911158097A CN110990302B CN 110990302 B CN110990302 B CN 110990302B CN 201911158097 A CN201911158097 A CN 201911158097A CN 110990302 B CN110990302 B CN 110990302B
- Authority
- CN
- China
- Prior art keywords
- task queue
- refreshing
- cache volume
- read
- task
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/12—Replacement control
- G06F12/121—Replacement control using replacement algorithms
- G06F12/123—Replacement control using replacement algorithms with age lists, e.g. queue, most recently used [MRU] list or least recently used [LRU] list
- G06F12/125—Replacement control using replacement algorithms with age lists, e.g. queue, most recently used [MRU] list or least recently used [LRU] list being generated by decoding an array or storage
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
- G06F2212/1021—Hit rate improvement
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本申请提出一种数据缓存方法、装置、电子设备及存储介质。具体实现方案为:将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中;将刷新任务队列的队首元素取出,并将队首元素作为当前缓存卷;确定当前缓存卷的状态;在当前缓存卷的状态是已写满状态的情况下,在刷新任务队列中选择当前缓存卷作为执行刷新操作的逻辑缓存卷。本申请实施例中,将已写满状态的当前缓存卷作为执行刷新操作的逻辑缓存卷,利用连续大块的顺序存储的数据读写吞吐量大于零散的小块数据读写量的特性,从而充分利用数据的访问的连续性,提高了缓存的刷新效率和系统的数据吞吐量,进而提高缓存的命中率。
Description
技术领域
本申请涉及信息技术领域,尤其涉及一种数据缓存方法、装置、电子设备及存储介质。
背景技术
缓存(Cache)是数据交换的缓冲区。例如应用程序要读取数据时,会首先从缓存查询数据。若从缓存中查询到数据,则表示已经命中缓存,数据被读取并返回给应用程序。如果在缓存中没有查询到数据,则未命中缓存。应用程序必须做一些额外的工作,例如需要从下层存储设备来读取数据,将数据返回给客户端。传统的缓存算法在缓存未命中的情况下,性能退化比较严重,例如存在缓存的刷新效率低从而导致命中率低的问题。
发明内容
本申请实施例提供一种数据缓存方法、装置、电子设备及存储介质,以解决相关技术存在的问题,技术方案如下:
第一方面,本申请实施例提供了一种数据缓存方法,包括:
将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中;
将刷新任务队列的队首元素取出,并将队首元素作为当前缓存卷;
确定当前缓存卷的状态;
在当前缓存卷的状态是已写满状态的情况下,在刷新任务队列中选择当前缓存卷作为执行刷新操作的逻辑缓存卷。
在一种实施方式中,获取当前缓存卷的状态之后,上述方法还包括:
在所述当前缓存卷的状态是未写满状态的情况下,对当前缓存卷的跳过计数值进行累加操作;
在跳过计数值小于预设最大计数值的情况下,将当前缓存卷推入刷新任务队列的队尾;
在跳过计数值等于预设最大计数值的情况下,将当前缓存卷推入优先刷新队列,优先刷新队列用于记录待优先执行刷新操作的逻辑缓存卷。
在一种实施方式中,将刷新任务队列的队首元素取出之后,上述方法还包括:对预先设置的访问计数进行累加操作;
将刷新任务队列的队首元素取出之前,方法还包括:
在访问计数小于等于刷新任务队列的长度的情况下,转向执行将刷新任务队列的队首元素取出的步骤;
在访问计数大于刷新任务队列的长度的情况下,确定不对刷新任务队列中的逻辑缓存卷执行刷新操作。
在一种实施方式中,将刷新任务队列的队首元素取出之前,上述方法还包括:
在当前挂起的读写任务数小于预设最大挂起任务数的情况下,将刷新优先刷新队列中的逻辑缓存卷加入到当前挂起的读写任务中。
在一种实施方式中,将刷新任务队列的队首元素取出之前,上述方法还包括:
判断当前挂起的读写任务数是否大于预设最小挂起任务数;
在当前挂起的读写任务数大于预设最小挂起任务数的情况下,转向执行将刷新任务队列的队首元素取出的步骤,以在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在当前挂起的读写任务数小于等于预设最小挂起任务数的情况下,利用最近最少使用算法在刷新任务队列中选择执行刷新操作的逻辑缓存卷。
在一种实施方式中,在刷新任务队列中选择执行刷新操作的逻辑缓存卷,还包括:
获取读写开关指示的状态,读写开关指示的状态包括在刷新任务队列中当前执行的任务是读任务或写任务,在刷新任务队列中读任务对应的任务队列为读任务队列,在刷新任务队列中写任务对应的任务队列为写任务队列;
确定与读写开关指示的状态对应的任务队列是否为空队列;
在读写开关指示的状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在读写开关指示的状态对应的任务队列是空队列的情况下,确定与读写开关指示的状态的翻转状态对应的任务队列是否为空队列;
在读写开关指示的状态的翻转状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态的翻转状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷。
在一种实施方式中,将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中,包括:
判断待执行刷新操作的逻辑缓存卷是否在当前的刷新任务队列中;
若待执行刷新操作的逻辑缓存卷在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷移除并插入到当前的刷新任务队列的队尾;若待执行刷新操作的逻辑缓存卷不在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷插入到当前的刷新任务队列的队尾;
将待执行刷新操作的逻辑缓存卷的跳过计数值进行清零操作。
在一种实施方式中,上述方法还包括:
接收写任务;
获取逻辑缓存卷;
将数据写入逻辑缓存卷并修改写入数据区域变量;
根据写入数据区域变量设置逻辑缓存卷的状态,逻辑缓存卷的状态包括已写满状态或未写满状态;
转向执行将刷新任务队列的队首元素取出的步骤;
释放逻辑缓存卷。
在一种实施方式中,上述方法还包括:
接收读任务;
获取逻辑缓存卷;
判断写入数据区域变量是否包括读任务中指示的数据读取区域;
若写入数据区域变量不包括读任务中指示的数据读取区域,则转向执行将刷新任务队列的队首元素取出的步骤;
若数据区域包括读任务中指示的数据读取区域,则从逻辑缓存卷中读取数据并修改已读数据区域变量;
判断已读数据区域变量是否是逻辑缓存卷的全范围;若否则将逻辑缓存卷移至读任务对应的任务队列的队首;
释放逻辑缓存卷。
第二方面,本申请实施例提供了一种数据缓存装置,包括:
插入单元,用于将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中;
取出单元,用于将刷新任务队列的队首元素取出,并将队首元素作为当前缓存卷;
确定单元,用于确定当前缓存卷的状态;
选择单元,用于在当前缓存卷是已写满状态的情况下,在刷新任务队列中选择当前缓存卷作为执行刷新操作的逻辑缓存卷。
在一种实施方式中,上述装置还包括调整单元,调整单元用于:
在当前缓存卷的状态是未写满状态的情况下,对当前缓存卷的跳过计数值进行累加操作;
在跳过计数值小于预设最大计数值的情况下,将当前缓存卷推入刷新任务队列的队尾;
在跳过计数值等于预设最大计数值的情况下,将当前缓存卷推入优先刷新队列,优先刷新队列用于记录待优先执行刷新操作的逻辑缓存卷。
在一种实施方式中,上述装置还包括遍历单元,遍历单元用于:
对预先设置的访问计数进行累加操作;
将刷新任务队列的队首元素取出之前,方法还包括:
在访问计数小于等于刷新任务队列的长度的情况下,转向执行将刷新任务队列的队首元素取出的步骤;
在访问计数大于刷新任务队列的长度的情况下,确定不对刷新任务队列中的逻辑缓存卷执行刷新操作。
在一种实施方式中,上述装置还包括任务控制单元,任务控制单元包括第一控制子单元,第一控制子单元用于:
在当前挂起的读写任务数小于预设最大挂起任务数的情况下,将刷新优先刷新队列中的逻辑缓存卷加入到当前挂起的读写任务中。
在一种实施方式中,任务控制单元还包括第二控制子单元,第二控制子单元包括:
判断子单元,用于判断当前挂起的读写任务数是否大于预设最小挂起任务数;
选择子单元,用于:
在当前挂起的读写任务数大于预设最小挂起任务数的情况下,转向执行将刷新任务队列的队首元素取出的步骤,以在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷;在当前挂起的读写任务数小于等于预设最小挂起任务数的情况下,利用最近最少使用算法在刷新任务队列中选择执行刷新操作的逻辑缓存卷。
在一种实施方式中,选择子单元还用于:
获取读写开关指示的状态,读写开关指示的状态包括在刷新任务队列中当前执行的任务是读任务或写任务,在刷新任务队列中读任务对应的任务队列为读任务队列,在刷新任务队列中写任务对应的任务队列为写任务队列;
确定与读写开关指示的状态对应的任务队列是否为空队列;
在读写开关指示的状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在读写开关指示的状态对应的任务队列是空队列的情况下,确定与读写开关指示的状态的翻转状态对应的任务队列是否为空队列;
在读写开关指示的状态的翻转状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态的翻转状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷。
在一种实施方式中,插入单元还用于:
判断待执行刷新操作的逻辑缓存卷是否在当前的刷新任务队列中;
若待执行刷新操作的逻辑缓存卷在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷移除并插入到当前的刷新任务队列的队尾;若待执行刷新操作的逻辑缓存卷不在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷插入到当前的刷新任务队列的队尾;
将待执行刷新操作的逻辑缓存卷的跳过计数值进行清零操作。
在一种实施方式中,所述装置还包括数据写入单元,用于:
接收写任务;
获取逻辑缓存卷;
将数据写入逻辑缓存卷并修改写入数据区域变量;
根据写入数据区域变量设置逻辑缓存卷的状态,逻辑缓存卷的状态包括已写满状态或未写满状态;
转向执行将刷新任务队列的队首元素取出的步骤;
释放逻辑缓存卷。
在一种实施方式中,所述装置还包括数据读取单元,用于:
接收读任务;
获取逻辑缓存卷;
判断写入数据区域变量是否包括读任务中指示的数据读取区域;
若写入数据区域变量不包括读任务中指示的数据读取区域,则转向执行将刷新任务队列的队首元素取出的步骤;
若数据区域包括读任务中指示的数据读取区域,则从逻辑缓存卷中读取数据并修改已读数据区域变量;
判断已读数据区域变量是否是逻辑缓存卷的全范围;若否则将逻辑缓存卷移至读任务对应的任务队列的队首;
释放逻辑缓存卷。
第三方面,本申请实施例提供了一种电子设备,该设备包括:存储器和处理器。其中,该存储器和该处理器通过内部连接通路互相通信,该存储器用于存储指令,该处理器用于执行该存储器存储的指令,并且当该处理器执行该存储器存储的指令时,使得该处理器执行上述各方面任一种实施方式中的方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,计算机可读存储介质存储计算机程序,当计算机程序在计算机上运行时,上述各方面任一种实施方式中的方法被执行。
上述技术方案中的优点或有益效果至少包括:利用个人语料训练得到个人语言模型,将个人语言模型与基础语言模型进行融合,使得融合后的模型区分了说话人的风格,提升了数据缓存系统对说话人音频的识别能力。
上述概述仅仅是为了说明书的目的,并不意图以任何方式进行限制。除上述描述的示意性的方面、实施方式和特征之外,通过参考附图和以下的详细描述,本申请进一步的方面、实施方式和特征将会是容易明白的。
附图说明
在附图中,除非另外规定,否则贯穿多个附图相同的附图标记表示相同或相似的部件或元素。这些附图不一定是按照比例绘制的。应该理解,这些附图仅描绘了根据本申请公开的一些实施方式,而不应将其视为是对本申请范围的限制。
图1为根据本申请实施例的数据缓存方法的流程图;
图2为根据本申请实施例的数据缓存方法的系统架构示意图;
图3为根据本申请实施例的数据缓存方法的获取逻辑缓存卷的流程图;
图4为根据本申请实施例的数据缓存方法的释放逻辑缓存卷的流程图;
图5为根据本申请实施例的数据缓存方法的写操作的流程图;
图6为根据本申请实施例的数据缓存方法的读操作的流程图;
图7为根据本申请实施例的数据缓存方法的逻辑缓存卷的状态变化图;
图8为根据本申请实施例的数据缓存方法的刷新服务架构示意图;
图9为根据本申请实施例的数据缓存方法的刷新服务处理IO的流程图;
图10为根据本申请实施例的数据缓存方法的触发检查刷新的流程图;
图11为根据本申请实施例的数据缓存方法的读写分时操作的流程图;
图12为根据本申请实施例的数据缓存方法的满优先flush策略的流程图;
图13是根据本申请实施例的数据缓存装置的结构示意图;
图14是用来实现本申请实施例的电子设备的框图。
具体实施方式
在下文中,仅简单地描述了某些示例性实施例。正如本领域技术人员可认识到的那样,在不脱离本申请的精神或范围的情况下,可通过各种不同方式修改所描述的实施例。因此,附图和描述被认为本质上是示例性的而非限制性的。
图1为根据本申请实施例的数据缓存方法的流程图。如图1所示,该数据缓存方法可以包括:
步骤S110,将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中;
步骤S120,将刷新任务队列的队首元素取出,并将队首元素作为当前缓存卷;
步骤S130,确定当前缓存卷的状态;
步骤S140,在当前缓存卷的状态是已写满状态的情况下,在刷新任务队列中选择当前缓存卷作为执行刷新操作的逻辑缓存卷。
缓存介于应用程序和下层存储设备之间,目的是为了降低应用程序直接读写永久数据存储源的频率,从而提高运行性能。为了使缓存和下层存储设备保持数据同步,需要制定合理的刷新策略。例如,使用缓存之后,就相当于把数据存放了两份,一份是在下层存储设备中,另一份存放在缓存中。当有新的数据要写入或者旧数据需要刷新的时候,如果只刷新了其中一份数据源,那么缓存和下层存储设备的数据就不一致了。所以需要制定合理的刷新策略,使缓存数据与下层存储设备的数据进行有效且快速的同步,保证数据的最终一致性。
传统的缓存算法在缓存未命中的情况下,性能退化比较严重。缓存的刷新策略可直接影响到缓存的命中率。本申请实施例中,将已写满状态的当前缓存卷作为执行刷新操作的逻辑缓存卷,提高了系统的数据吞吐量和缓存的刷新效率,进而提高缓存的命中率。采用本申请的方案,当数据发生变化时,采用直接刷新缓存的值的方法,会比采用移除缓存(或者让缓存过期)的方法的命中率更高。
在本申请的实施例中,在步骤S110中,可预先创建刷新任务队列,将缓存中的待执行刷新操作的逻辑缓存卷存储在刷新任务队列中。队列是一种受限制的线性表,限制之处在于:在队列中只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的后端称为队尾,进行删除操作的前端称为队首。队列的数据元素又称为队列元素。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出线性表。
在本申请的实施例中,在步骤S120中,按照先进先出的原则,将刷新任务队列的队首元素取出,并将队首元素作为当前缓存卷,在后续步骤中对当前缓存卷进行处理,并且在缓存方法的处理流程中遍历刷新任务队列中的所有队列元素。
在本申请的实施例中,在步骤S130中,确定当前缓存卷的状态是已写满状态还是未写满状态。
在本申请的实施例中,在步骤S140中,将已写满状态的当前缓存卷作为执行刷新操作的逻辑缓存卷。而如果当前缓存卷是未写满状态,则暂不执行刷新操作。上述方法中的缓存刷新策略将已写满状态的逻辑缓存卷优先执行刷新操作,因此将上述策略简称为“满优先flush(刷新)策略”。采用满优先flush策略使得刷新操作的数据量增加,从而提高了缓存的刷新效率和系统的数据吞吐量。
在一个示例中,用于实现本申请缓存方法的缓存装置可以是在一种由内存和SSD(Solid State Disk或Solid State Drive,固态驱动器)组成的二级缓存装置。目前常用的缓存刷新策略主要有以下几种:Cache-Aside、Read-Though Cache、Write-Through Cache、Write-Around、Write-Back。本申请实施例中,第一级缓存可使用Cache-Aside策略,第二级缓存可使用Write-Back策略,可在此基础上构建缓存系统。
上述技术方案中的优点或有益效果至少包括:将已写满状态的当前缓存卷作为执行刷新操作的逻辑缓存卷,利用连续大块的顺序存储的数据读写吞吐量大于零散的小块数据读写量的特性,从而充分利用数据的访问的连续性,提高了缓存的刷新效率和系统的数据吞吐量,进而提高缓存的命中率。
图2为根据本申请实施例的数据缓存方法的系统架构示意图。图2中的Cache表示缓存系统。using_cache_device_map表示正在使用的逻辑缓存卷,也就是缓存中所有的逻辑缓存卷(cache_device)所占用的磁盘空间在内存中的映射。其中,逻辑缓存卷的相关设置和属性可包括:Device_stat表示逻辑缓存卷的执行状态、Range(data/dirty/read)分别表示写入数据区域变量、脏数据区域变量、已读数据区域变量、Memory_buf表示缓存数据区、wait_flush_queue表示等待刷新队列、Cache_id表示缓存标识。Full_write_hotlist表示已写满的逻辑缓存卷按照热度排序的列表,Odd_write_hotlist表示未写满的逻辑缓存卷按照热度排序的列表,Read_hotlist表示最近读的逻辑缓存卷按照热度排序的列表。Pcache_device表示指向逻辑缓存卷的指针。Outstanding_wait_queue表示未处理的请求队列。例如来自应用程序的读写请求过多的情况下,当前系统只能处理其中的一部分,则将另一部分未处理的请求插入Outstanding_wait_queue。Free_device_list表示空闲资源。Flush_service表示刷新服务,例如将内存中的缓存刷新到SSD中。刷新服务中的设置可包括Write_dirtylist(写任务队列)和Read_dirtylist(读任务队列)。
在对逻辑缓存卷进行读写操作之前,需要首先获取逻辑缓存卷,也就是分配系统资源。在对逻辑缓存卷进行读写操作之后,需要释放逻辑缓存卷,也就是释放系统资源。
图3为根据本申请实施例的数据缓存方法的获取逻辑缓存卷的流程图。如图3所示,首先执行步骤3.1,判断读写操作所针对的逻辑缓存卷是否在using_cache_device_map中,也就是判断读写操作所针对的逻辑缓存卷是否在本次读写请求之前已经被命中。
在本次读写请求之前有在先请求已经命中了本次读写请求所针对的逻辑缓存卷,则执行步骤3.2,找到cache_device,并将其对应的引用变量的值加1。在步骤3.2中,在using_cache_device_map中找到本次读写请求所针对的逻辑缓存卷,且将该逻辑缓存卷的引用变量的值加1。其中,逻辑缓存卷的引用变量用于指示正在使用该逻辑缓存卷的读写操作的个数。在后续流程中,如果引用变量的值为0,则可释放该逻辑缓存卷。在步骤3.2之后执行步骤3.3,通知调用者Device_got(获得资源的设备)。
若在步骤3.1中的判断结果是否,则执行步骤3.4,判断Free_device_list中是否有本次读写请求所针对的逻辑缓存卷cache_device。若步骤3.4判断的结果为是,则执行步骤3.5,从Free_device_list中获取ceche_device,并设置cache_device的相关设置参数的初始值,包括:dirty_range(脏数据区域变量)的初始值是全范围、Data_range(写入数据区域变量)的初始值是无范围、read_range(已读数据区域变量)的初始值是无范围。然后执行步骤3.3。
若步骤3.4判断的结果为是,则执行步骤3.6,尝试从hotlist中回收cache_device。在步骤3.6中尝试回收的cache_device是从using_cache_device_map中取出的引用变量的值为0的,并已放入Free_device_list中的逻辑缓存卷。其中,hotlist包括Full_write_hotlist、Odd_write_hotlist和Read_hotlist。在步骤3.6之后执行步骤3.7,判断Free_device_list是否有Ceche_device,若有则执行步骤3.5和步骤3.3,若无则执行步骤3.8,将请求存入outstanding队列(Outstanding_wait_queue)。
图4为根据本申请实施例的数据缓存方法的释放逻辑缓存卷的流程图。如图4所示,首先执行步骤4.1,判断Cache_device的引用变量的值减1后是否为0。若Cache_device的引用变量的值减1后不为零,则不执行释放逻辑缓存卷的操作。若Cache_device的引用变量的值减1后为零,则执行步骤4.2,判断outstanding队列是否为空。若outstanding队列为空,则不执行释放逻辑缓存卷的操作。若outstanding队列不为空,则执行步骤4.3,从hotlist中回收cache_device并将outstanding队列存放于临时队列。然后执行步骤4.4,从临时队列中取出元素,判断请求是否命中。步骤4.4中的判断结果为是,则执行步骤4.5,Cache_device的引用变量的值加1,然后返回步骤4.4,再从临时队列中取出元素,进行下一次循环。步骤4.4中的判断结果为否,则执行步骤4.6,判断Free_device_list是否为空。若Free_device_list为空则中途退出循环,结束程序。若Free_device_list不为空,则执行步骤4.7,从Free_device_list中获取ceche_device并进行初始化,为outstanding队列中要执行的读写操作分配逻辑缓存卷。
在一种实施方式中,上述方法还包括:
接收写任务;
获取逻辑缓存卷;
对逻辑缓存卷进行写操作;
释放逻辑缓存卷。
其中,对逻辑缓存卷进行写操作,包括:
将数据写入逻辑缓存卷并修改写入数据区域变量;
根据写入数据区域变量设置逻辑缓存卷的状态,逻辑缓存卷的状态包括已写满状态或未写满状态;
转向执行将刷新任务队列的队首元素取出的步骤,也就是执行图1所示的缓存方法以选择作为执行刷新操作的逻辑缓存卷。
在一个示例中,上述方法中获取逻辑缓存卷和释放逻辑缓存卷的执行步骤如图3和图4所示,对逻辑缓存卷进行写操作的执行步骤如图5所示。
在图5中,对逻辑缓存卷进行写操作首先执行步骤5.1,将数据拷贝到Memory_buf中,并修改dirty_range和data_range的值的范围。其中,data_range表示I/O(Input/Output,输入/输出)访问卷的范围;dirty_range表示在Memory_buf中哪一部分是与下层存储设备(例如磁盘)中不同步的内容。
在步骤5.1之后执行步骤5.2,判断Data_range是否为逻辑缓存卷的容量,也就是判断逻辑缓存卷是否已写满。例如逻辑缓存卷的容量为100M,则判断Data_range是否为100M。若步骤5.2的判断结果为是,则执行步骤5.3,将cache_device设置为已写满状态,并将cache_device从odd_write_hotlist移入fuli_write_hotlist。若步骤5.2的判断结果为否,则执行步骤5.4,将cache_device设置为未写满状态,并将cache_device从odd_write_hotlist移入fuli_write_hotlist。在步骤5.3或步骤5.4之后执行步骤5.5,调用cache_flush_service的写接口,可执行图1所示的缓存方法以选择作为执行刷新操作的逻辑缓存卷。在一个示例中,可采用异步调用的方式调用cache_flush_service的写接口。
在一种实施方式中,上述方法还包括:
接收读任务;
获取逻辑缓存卷;
对逻辑缓存卷进行读操作;
释放逻辑缓存卷。
其中,对逻辑缓存卷进行读操作,包括:
判断写入数据区域变量是否包括读任务中指示的数据读取区域;
若写入数据区域变量不包括读任务中指示的数据读取区域,则转向执行将刷新任务队列的队首元素取出的步骤,也就是执行图1所示的缓存方法以选择作为执行刷新操作的逻辑缓存卷;
若数据区域包括读任务中指示的数据读取区域,则从逻辑缓存卷中读取数据并修改已读数据区域变量;
判断已读数据区域变量是否是逻辑缓存卷的全范围;若否则将逻辑缓存卷移至读任务对应的任务队列的队首。
在一个示例中,上述方法中获取逻辑缓存卷和释放逻辑缓存卷的执行步骤如图3和图4所示,对逻辑缓存卷进行写操作的执行步骤如图6所示。
在图6中,对逻辑缓存卷进行写操作首先执行步骤6.1,判断Data_range是否覆盖要读的区域,也就是判断写入数据区域变量是否包括读任务中指示的数据读取区域。若步骤6.1的判断结果为否,则执行步骤6.2,调用cache_flush_service的读接口,可执行图1所示的缓存方法以选择作为执行刷新操作的逻辑缓存卷。在一个示例中,可采用异步调用的方式调用cache_flush_service的读接口。
若步骤6.1的判断结果为是,则执行步骤6.3,从cache_device中取走要读的数据,并且修改read_range。修改read_range之后执行步骤6.4,判断read_range是否是全范围,若是则结束程序,若否则执行步骤6.5,将cache_device移动到read_hotlist的队首,下次回收时会将其回收。在步骤6.5中,将全部内容都已被读取的逻辑缓存卷移动到read_hotlist的队首,以使其从缓存中优先被淘汰。
图7为表示cache_device状态的cache_device状态机的状态变化示意图。在图7所示的示例中,cache_device一共有init、writing、full_writen、reading、to_destoy五种状态。
在程序中的对象首次经过get_device(获取设备)分配某个执行任务时,cache_device的状态为init。
在进行读时状态为reading,在进行写时状态为writing。这两个状态下cache_device应该存在于odd_write_device/read_device中。在写完成时cache_device为full_writen状态。在读完成时cache_device变成to_destoy状态。
状态机流转方向如图7所示,双向箭头代表两个状态可以直接相互转化,单向箭头代表状态只能从一端转化到另一端。在本申请实施例中所有回到free_device_list的cache_device都会变成init状态,但init状态下的cache_device不全是在free_device_list中。例如,reading状态想要转化成writing状态时,无需将cache_device放回free_device_list,直接对其结构进行初始化(主要是对Range(data/dirty/read)的操作)后即可完成。在init状态下执行写操作,如果一次性操作后已写满,则由init状态直接转变为full_writen状态。
图8为根据本申请实施例的数据缓存方法的刷新服务架构示意图。图8中的Cache表示刷新服务的缓存系统。cache_device表示逻辑缓存卷。逻辑缓存卷的相关设置和属性可包括:Range(data/dirty/read)分别表示写入数据区域变量、脏数据区域变量、已读数据区域变量、Memory_buf表示缓存数据区、Wait_flush_queue表示等待刷新队列、skip_num表示跳过计数值、Cache_id表示缓存标识。flush_service表示刷新服务。flush_service中的相关设置和参数可包括:dirtylist表示刷新任务队列、prior_dirtylist表示优先刷新队列、min_pending_size表示最小挂起任务数、max_pending_size表示最大挂起任务数、cur_pending_size表示当前挂起的读写任务数、rw_switch表示读写开关。其中,dirtylist包括write_dirtylist(写任务队列)和read_dirtylist(读任务队列)。Pcache_device表示指向逻辑缓存卷的指针。图8中的logical_disk_service表示逻辑盘服务,即下层存储设备(如SSD)提供的服务。
在一种实施方式中,将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中,包括:
判断待执行刷新操作的逻辑缓存卷是否在当前的刷新任务队列中;
若待执行刷新操作的逻辑缓存卷在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷移除并插入到当前的刷新任务队列的队尾;若待执行刷新操作的逻辑缓存卷不在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷插入到当前的刷新任务队列的队尾;
将待执行刷新操作的逻辑缓存卷的跳过计数值进行清零操作。
其中,当前的刷新任务队列可包括write_dirtylist和read_dirtylist。
图9为根据本申请实施例的数据缓存方法的刷新服务处理IO的流程图。如图9所示,在刷新服务处理IO的流程中,首先执行步骤9.1,判断待执行刷新操作的逻辑缓存卷cache_device是否在write_dirtylist或read_dirtylist中。cache_device是否在write_dirtylist或read_dirtylist中,说明之前有IO请求发送给刷新服务,请求对该cache_device进行刷新操作,刷新服务已该cache_device放入write_dirtylist或read_dirtylist中,但还没有完成刷新操作。
若步骤9.1的判断结果为是,则执行步骤9.2,将cache_device从write_dirtylist或read_dirtylist中移除,然后再执行步骤9.3,将cache_device加到write_dirtylist或read_dirtylist的尾部,将cache_device的skip_num清0。若步骤9.1的判断结果否,则直接执行步骤9.3。在步骤9.2和步骤9.3中调整了cache_device在write_dirtylist或read_dirtylist中的位置。将cache_device加到write_dirtylist或read_dirtylist的尾部,使被频繁访问的逻辑缓存卷延后处理,由于被频繁访问的逻辑缓存卷的数据内容的改写的几率较大,因此对其进行延后处理(延后写入或读取)可减少频繁改写的次数、提高系统的实时性,从而提高系统性能。
步骤9.3中,skip_num表示跳过计数值。本申请的实施例中,将已写满状态的当前缓存卷作为执行刷新操作的逻辑缓存卷,在当前缓存卷的状态是未写满状态的情况下,对当前缓存卷的跳过计数值skip_num进行累加操作。在跳过计数值skip_num等于预设最大计数值的情况下,将当前缓存卷推入优先刷新队列,待优先执行刷新操作。步骤9.3中,将cache_device的skip_num清0,可以使当前缓存卷延后进入优先刷新队列,可以起到将未写满状态的当前缓存卷延后刷新的作用。将未写满状态的逻辑缓存卷延后刷新,保护已写满状态的逻辑缓存卷优先刷新,可提高了缓存的刷新效率和系统的数据吞吐量,提升系统性能。
在步骤9.3之后执行步骤9.4,触发刷一次检查flush(刷新)。在一个示例中,可执行图10所示的步骤触发刷一次检查flush。
在一种实施方式中,图1中的步骤S120,将刷新任务队列的队首元素取出之前,上述方法还包括:
在当前挂起的读写任务数小于预设最大挂起任务数的情况下,将刷新优先刷新队列中的逻辑缓存卷加入到当前挂起的读写任务中。
在一种实施方式中,图1中的步骤S120,将刷新任务队列的队首元素取出之前,上述方法还包括:
判断当前挂起的读写任务数是否大于预设最小挂起任务数;
在当前挂起的读写任务数大于预设最小挂起任务数的情况下,转向执行将刷新任务队列的队首元素取出的步骤,以在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在当前挂起的读写任务数小于等于预设最小挂起任务数的情况下,利用最近最少使用算法在刷新任务队列中选择执行刷新操作的逻辑缓存卷。
图10为根据本申请实施例的数据缓存方法的触发检查刷新的流程图。如图10所示,在触发检查刷新的流程中,首先执行步骤10.1,判断当前挂起的读写任务数cur_pending_size是否大于最大挂起任务数max_pending_size。若步骤10.1的判断结果为是,则结束程序。这种情况下由于磁盘通道有限,当前挂起的读写任务不能被处理,等待下一次触发检查刷新时再处理。
若步骤10.1的判断结果为否,则执行步骤10.2,刷新优先刷新队列,增加cur_pending_size。在步骤10.2中,将优先刷新队列中的元素取出,添加到当前挂起的读写任务中,增加了当前挂起的读写任务数cur_pending_size的值,使得优先刷新队列中的元素可以被优先处理。
在步骤10.2之后执行步骤10.3,判断当前挂起的读写任务数cur_pending_size是否大于预设最小挂起任务数in_pending_size。若步骤10.3的判断结果为是,则执行步骤10.4,使用满优先flush策略进行一次flush的cache_device的选择。在步骤10.4中,可转向执行图1中的步骤S120将刷新任务队列的队首元素取出的步骤,以在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷。若步骤10.3的判断结果为否,则执行步骤10.5,使用基于LRU(Least Recently Used,最近最少使用)算法的flush策略进行一次flush的cache_device的选择,在刷新任务队列中选择执行刷新操作的逻辑缓存卷。
通过设置最小挂起任务数和行步骤10.4,限制最小下放IO数量,可完整利用系统资源,提高系统性能。
在步骤10.4或步骤10.5之后执行步骤10.6,判断是否可以得到一个flush的cache_device,也就是判断存在已写满状态的cache_device。如果不存在已写满状态的cache_device,则没有得到一个需要flush的cache_device。若步骤10.6的判断结果为是,则执行步骤10.7,刷新cache_device,同时将cache_device上wait_flush_queue中的request(请求)取出添加到对logical_disks_service的request中,并增加cur_pending_size。其中,cur_pending_size表示所有下放的没有返回的IO数,也就是正在执行刷新操作的cache_device的个数。在步骤10.7中完成了缓存系统与下层存储设备(如SSD)的交互,例如从缓存系统向下层存储设备写入数据,下层存储设备返回写入完毕的结果,并在request中记录了数据改写的存储区域。
在一种实施方式中,在上述步骤10.5和步骤10.5中,在刷新任务队列中选择执行刷新操作的逻辑缓存卷,还包括:
获取读写开关指示的状态,读写开关指示的状态包括在刷新任务队列中当前执行的任务是读任务或写任务,在刷新任务队列中读任务对应的任务队列为读任务队列,在刷新任务队列中写任务对应的任务队列为写任务队列;
确定与读写开关指示的状态对应的任务队列是否为空队列;
在读写开关指示的状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在读写开关指示的状态对应的任务队列是空队列的情况下,确定与读写开关指示的状态的翻转状态对应的任务队列是否为空队列;
在读写开关指示的状态的翻转状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态的翻转状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷。
在一个示例中,上述在刷新任务队列中选择执行刷新操作的逻辑缓存卷的方法可使用如图11所示的流程图实现。
图11为根据本申请实施例的数据缓存方法的读写分时操作的流程图。如图11所示,在读写分时操作中,首先执行步骤11.1,判断读写开关rw_swicth的状态是否为读。若步骤11.1的判断结果为否,则执行步骤11.2,判断写任务队列write_dirtylist是否为空。若步骤11.2的判断结果为否,则执行步骤11.3,选择write_dirtylist作为当前的刷新任务队列dirtylist。然后执行步骤11.4和步骤11.5。步骤11.4是按照策略从dirtylist中获取device,其中策略包括满优先flush策略或基于LRU算法的flush策略。步骤11.5是读写开关rw_swicth的状态计数加1,达到最大值时清空计数读写翻转。读写翻转也就是将读变为写或者将写变为读。
若步骤11.2的判断结果为是,则执行步骤11.6,判断读任务队列read_dirtylist是否为空。若是则程序结束,若否则执行步骤11.7,选择read_dirtylist作为当前的刷新任务队列dirtylist,清空计数读写翻转。然后执行步骤11.4和步骤11.5。
若步骤11.1的判断结果为是,则执行步骤11.8,判断读任务队列read_dirtylist是否为空。若步骤11.8的判断结果为否,则执行步骤11.9,选择read_dirtylist作为当前的刷新任务队列dirtylist。然后执行步骤11.4和步骤11.5。
若步骤11.8的判断结果为是,则执行步骤11.10,判断写任务队列write_dirtylist是否为空。若是则程序结束,若否则执行步骤11.11,选择write_dirtylist作为当前的刷新任务队列dirtylist,清空计数读写翻转。然后执行步骤11.4和步骤11.5。
其中,步骤11.5中的最大值可根据实际应用系统中的读写任务的比例确定。例如在归档的场景下造成的大量写夹杂着少量读时,通过读写分时操作可增加缓存命中率,提高系统性能。在一个归档的场景下的示例中,可设置通过最大值实现每执行10次写操作之后执行1次读操作。通过合理设置最大值提高系统的执行效率。
在一种实施方式中,获取当前缓存卷的状态之后,图1所示的方法还包括:
在所述当前缓存卷的状态是未写满状态的情况下,对当前缓存卷的跳过计数值进行累加操作;
在跳过计数值小于预设最大计数值的情况下,将当前缓存卷推入刷新任务队列的队尾;
在跳过计数值等于预设最大计数值的情况下,将当前缓存卷推入优先刷新队列,优先刷新队列用于记录待优先执行刷新操作的逻辑缓存卷。
在一种实施方式中,将刷新任务队列的队首元素取出之后,图1所示的方法还包括:对预先设置的访问计数进行累加操作;
将刷新任务队列的队首元素取出之前,方法还包括:
在访问计数小于等于刷新任务队列的长度的情况下,转向执行将刷新任务队列的队首元素取出的步骤;
在访问计数大于刷新任务队列的长度的情况下,确定不对刷新任务队列中的逻辑缓存卷执行刷新操作。
在一个示例中,可执行图12所示的步骤实现图1所示的缓存方法。
图12为根据本申请实施例的数据缓存方法的满优先flush策略的流程图。如图12所示,在满优先flush策略中,首先执行步骤12.1,判断访问计数是否大于刷新任务队列的长度。若否则执行步骤12.2,从刷新任务队列的队首取一个cache_device,参见图1中的步骤S120。执行步骤12.2,访问次数加1,即对预先设置的访问计数进行累加操作。接下来执行步骤12.4,判断当前cache_device(dirty_range/read_range)是否为满的。在步骤12.4,可根据dirty_range或read_range确定当前缓存卷的状态,参见图1中的步骤S130。若是则执行步骤12.5,返回当前cache_device在刷新任务队列中选择当前缓存卷作为执行刷新操作的逻辑缓存卷,参见图1中的步骤S140。
若步骤12.4中的判断结果为否,则执行步骤12.6,将当前cache_device的跳过计数值skip_num加1,对当前缓存卷的跳过计数值进行累加操作。然后执行步骤12.7,判断Skip_num是否达到最大计数值。若步骤12.7的判断结果为否,则执行步骤12.8,将当前缓存卷cache_device推入当前刷新任务队列dirtylist队尾。若步骤12.7的判断结果为是,则执行步骤12.9,将当前缓存卷cache_device推入优先刷新队列prior_dirtylist。
若步骤12.1中的判断结果为是,则执行步骤12.10,返回空指针,确定不对刷新任务队列中的逻辑缓存卷执行刷新操作。在步骤12.10中,在遍历整个刷新任务队列之后,没有找到已写满状态的逻辑缓存卷,因此确定不对刷新任务队列中的逻辑缓存卷执行刷新操作。
上述技术方案中的优点或有益效果至少包括:
1)利用连续大块的顺序的数据读写吞吐大于零散的小块数据读写的特性,增大数据的访问的连续性,增加了系统了吞吐量。
2)利用磁盘单独进行读/写操作要比进行读写混合性能更高的特性,将读写的操作划到不同的时间周期中,增加了系统了吞吐量。
3)在特定的归档应用中,为了排除挂起应用对LRU算法的破坏,增加了非满数据单元的独立淘汰队列处理。通过独立淘汰队列将已写满状态的逻辑缓存卷和未写满状态的逻辑缓存卷分开,分别进行处理,以避免恶意的始终写不满的逻辑缓存卷会挤掉已写满状态的逻辑缓存卷。在某些情况下,已写满状态的逻辑缓存卷不宜过早从缓存国被淘汰掉,因此已写满状态的逻辑缓存卷的可能使用的概率较大。
4)在归档应用中实际的读请求较比写请求少的多,传统LRU算法会由于写的请求过多挤掉读请求的缓存。因此本申请实施例中增加了独立的读淘汰队列,可提升系统的处理效率。
图13是根据本申请实施例的数据缓存装置的结构示意图。如图13所示,该装置可以包括:
插入单元100,用于将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中;
取出单元200,用于将刷新任务队列的队首元素取出,并将队首元素作为当前缓存卷;
确定单元300,用于确定当前缓存卷的状态;
选择单元400,用于在当前缓存卷是已写满状态的情况下,在刷新任务队列中选择当前缓存卷作为执行刷新操作的逻辑缓存卷。
在一种实施方式中,上述装置还包括调整单元,调整单元用于:
在当前缓存卷的状态是未写满状态的情况下,对当前缓存卷的跳过计数值进行累加操作;
在跳过计数值小于预设最大计数值的情况下,将当前缓存卷推入刷新任务队列的队尾;
在跳过计数值等于预设最大计数值的情况下,将当前缓存卷推入优先刷新队列,优先刷新队列用于记录待优先执行刷新操作的逻辑缓存卷。
在一种实施方式中,上述装置还包括遍历单元,遍历单元用于:
对预先设置的访问计数进行累加操作;
将刷新任务队列的队首元素取出之前,方法还包括:
在访问计数小于等于刷新任务队列的长度的情况下,转向执行将刷新任务队列的队首元素取出的步骤;
在访问计数大于刷新任务队列的长度的情况下,确定不对刷新任务队列中的逻辑缓存卷执行刷新操作。
在一种实施方式中,上述装置还包括任务控制单元,任务控制单元包括第一控制子单元,第一控制子单元用于:
在当前挂起的读写任务数小于预设最大挂起任务数的情况下,将刷新优先刷新队列中的逻辑缓存卷加入到当前挂起的读写任务中。
在一种实施方式中,任务控制单元还包括第二控制子单元,第二控制子单元包括:
判断子单元,用于判断当前挂起的读写任务数是否大于预设最小挂起任务数;
选择子单元,用于:
在当前挂起的读写任务数大于预设最小挂起任务数的情况下,转向执行将刷新任务队列的队首元素取出的步骤,以在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷;在当前挂起的读写任务数小于等于预设最小挂起任务数的情况下,利用最近最少使用算法在刷新任务队列中选择执行刷新操作的逻辑缓存卷。
在一种实施方式中,选择子单元还用于:
获取读写开关指示的状态,读写开关指示的状态包括在刷新任务队列中当前执行的任务是读任务或写任务,在刷新任务队列中读任务对应的任务队列为读任务队列,在刷新任务队列中写任务对应的任务队列为写任务队列;
确定与读写开关指示的状态对应的任务队列是否为空队列;
在读写开关指示的状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在读写开关指示的状态对应的任务队列是空队列的情况下,确定与读写开关指示的状态的翻转状态对应的任务队列是否为空队列;
在读写开关指示的状态的翻转状态对应的任务队列不是空队列的情况下,选择读写开关指示的状态的翻转状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷。
在一种实施方式中,插入单元还用于:
判断待执行刷新操作的逻辑缓存卷是否在当前的刷新任务队列中;
若待执行刷新操作的逻辑缓存卷在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷移除并插入到当前的刷新任务队列的队尾;若待执行刷新操作的逻辑缓存卷不在当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷插入到当前的刷新任务队列的队尾;
将待执行刷新操作的逻辑缓存卷的跳过计数值进行清零操作。
在一种实施方式中,所述装置还包括数据写入单元,用于:
接收写任务;
获取逻辑缓存卷;
将数据写入逻辑缓存卷并修改写入数据区域变量;
根据写入数据区域变量设置逻辑缓存卷的状态,逻辑缓存卷的状态包括已写满状态或未写满状态;
转向执行将刷新任务队列的队首元素取出的步骤;
释放逻辑缓存卷。
在一种实施方式中,所述装置还包括数据读取单元,用于:
接收读任务;
获取逻辑缓存卷;
判断写入数据区域变量是否包括读任务中指示的数据读取区域;
若写入数据区域变量不包括读任务中指示的数据读取区域,则转向执行将刷新任务队列的队首元素取出的步骤;
若数据区域包括读任务中指示的数据读取区域,则从逻辑缓存卷中读取数据并修改已读数据区域变量;
判断已读数据区域变量是否是逻辑缓存卷的全范围;若否则将逻辑缓存卷移至读任务对应的任务队列的队首;
释放逻辑缓存卷。
本发明实施例各装置中的各模块的功能可以参见上述方法中的对应描述,在此不再赘述。
图14示出根据本发明一实施例的电子设备的结构框图。如图14所示,该电子设备包括:存储器910和处理器920,存储器910内存储有可在处理器920上运行的计算机程序。处理器920执行该计算机程序时实现上述实施例中的数据缓存方法。存储器910和处理器920的数量可以为一个或多个。
该电子设备还包括:
通信接口930,用于与外界设备进行通信,进行数据交互传输。
如果存储器910、处理器920和通信接口930独立实现,则存储器910、处理器920和通信接口930可以通过总线相互连接并完成相互间的通信。该总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral ComponentInterconnect,PCI)总线或扩展工业标准体系结构(Extended Industry StandardArchitecture,EISA)总线等。该总线可以分为地址总线、数据总线、控制总线等。为便于表示,图14中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
可选的,在具体实现上,如果存储器910、处理器920及通信接口930集成在一块芯片上,则存储器910、处理器920及通信接口930可以通过内部接口完成相互间的通信。
本发明实施例提供了一种计算机可读存储介质,其存储有计算机程序,该程序被处理器执行时实现本申请实施例中提供的方法。
本申请实施例还提供了一种芯片,该芯片包括,包括处理器,用于从存储器中调用并运行存储器中存储的指令,使得安装有芯片的通信设备执行本申请实施例提供的方法。
本申请实施例还提供了一种芯片,包括:输入接口、输出接口、处理器和存储器,输入接口、输出接口、处理器以及存储器之间通过内部连接通路相连,处理器用于执行存储器中的代码,当代码被执行时,处理器用于执行申请实施例提供的方法。
应理解的是,上述处理器可以是中央处理器(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(digital signal processing,DSP)、专用集成电路(application specific integrated circuit,ASIC)、现场可编程门阵列(fieldprogrammablegate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者是任何常规的处理器等。值得说明的是,处理器可以是支持进阶精简指令集机器(advanced RISC machines,ARM)架构的处理器。
进一步地,可选的,上述存储器可以包括只读存储器和随机存取存储器,还可以包括非易失性随机存取存储器。该存储器可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以包括只读存储器(read-onlymemory,ROM)、可编程只读存储器(programmable ROM,PROM)、可擦除可编程只读存储器(erasable PROM,EPROM)、电可擦除可编程只读存储器(electrically EPROM,EEPROM)或闪存。易失性存储器可以包括随机存取存储器(random access memory,RAM),其用作外部高速数据缓存。通过示例性但不是限制性说明,许多形式的RAM可用。例如,静态随机存取存储器(static RAM,SRAM)、动态随机存取存储器(dynamic random access memory,DRAM)、同步动态随机存取存储器(synchronous DRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(double data date SDRAM,DDR SDRAM)、增强型同步动态随机存取存储器(enhancedSDRAM,ESDRAM)、同步连接动态随机存取存储器(synchlink DRAM,SLDRAM)和直接内存总线随机存取存储器(direct rambus RAM,DR RAM)。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本申请的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包括于本申请的至少一个实施例或示例中。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或隐含地包括至少一个该特征。在本申请的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分。并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。
应理解的是,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。上述实施例方法的全部或部分步骤是可以通过程序来指令相关的硬件完成,该程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。上述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读存储介质中。该存储介质可以是只读存储器,磁盘或光盘等。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到其各种变化或替换,这些都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。
Claims (11)
1.一种数据缓存方法,其特征在于,包括:
将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中;
将所述刷新任务队列的队首元素取出,并将所述队首元素作为当前缓存卷;
确定所述当前缓存卷的状态;
在所述当前缓存卷的状态是已写满状态的情况下,在所述刷新任务队列中选择所述当前缓存卷作为执行刷新操作的逻辑缓存卷;
将所述刷新任务队列的队首元素取出之后,所述方法还包括:对预先设置的访问计数进行累加操作;
将所述刷新任务队列的队首元素取出之前,所述方法还包括:
在所述访问计数小于等于所述刷新任务队列的长度的情况下,转向执行所述将所述刷新任务队列的队首元素取出的步骤;
在所述访问计数大于所述刷新任务队列的长度的情况下,确定不对所述刷新任务队列中的逻辑缓存卷执行刷新操作。
2.根据权利要求1所述的方法,其特征在于,所述确定所述当前缓存卷的状态之后,所述方法还包括:
在所述当前缓存卷的状态是未写满状态的情况下,对所述当前缓存卷的跳过计数值进行累加操作;
在所述跳过计数值小于预设最大计数值的情况下,将所述当前缓存卷推入所述刷新任务队列的队尾;
在所述跳过计数值等于所述预设最大计数值的情况下,将所述当前缓存卷推入优先刷新队列,所述优先刷新队列用于记录待优先执行刷新操作的逻辑缓存卷。
3.根据权利要求2所述的方法,其特征在于,将所述刷新任务队列的队首元素取出之前,所述方法还包括:
在当前挂起的读写任务数小于预设最大挂起任务数的情况下,将刷新所述优先刷新队列中的逻辑缓存卷加入到当前挂起的读写任务中。
4.根据权利要求1-2中任一项所述的方法,其特征在于,将所述刷新任务队列的队首元素取出之前,所述方法还包括:
判断当前挂起的读写任务数是否大于预设最小挂起任务数;
在当前挂起的读写任务数大于预设最小挂起任务数的情况下,转向执行将所述刷新任务队列的队首元素取出的步骤,以在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在当前挂起的读写任务数小于等于预设最小挂起任务数的情况下,利用最近最少使用算法在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷。
5.根据权利要求4所述的方法,其特征在于,在所述刷新任务队列中选择执行刷新操作的逻辑缓存卷,还包括:
获取读写开关指示的状态,所述读写开关指示的状态包括在所述刷新任务队列中当前执行的任务是读任务或写任务,在所述刷新任务队列中所述读任务对应的任务队列为读任务队列,在所述刷新任务队列中所述写任务对应的任务队列为写任务队列;
确定与所述读写开关指示的状态对应的任务队列是否为空队列;
在所述读写开关指示的状态对应的任务队列不是空队列的情况下,选择所述读写开关指示的状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷;
在所述读写开关指示的状态对应的任务队列是空队列的情况下,确定与所述读写开关指示的状态的翻转状态对应的任务队列是否为空队列;
在所述读写开关指示的状态的翻转状态对应的任务队列不是空队列的情况下,选择所述读写开关指示的状态的翻转状态对应的任务队列作为当前的刷新任务队列,在当前的刷新任务队列中选择执行刷新操作的逻辑缓存卷。
6.根据权利要求5所述的方法,其特征在于,将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中,包括:
判断所述待执行刷新操作的逻辑缓存卷是否在所述当前的刷新任务队列中;
若所述待执行刷新操作的逻辑缓存卷在所述当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷移除并插入到所述当前的刷新任务队列的队尾;若所述待执行刷新操作的逻辑缓存卷不在所述当前的刷新任务队列中,则将述待执行刷新操作的逻辑缓存卷插入到所述当前的刷新任务队列的队尾;
将所述待执行刷新操作的逻辑缓存卷的跳过计数值进行清零操作。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
接收写任务;
获取逻辑缓存卷;
将数据写入所述逻辑缓存卷并修改写入数据区域变量;
根据写入数据区域变量设置所述逻辑缓存卷的状态,所述逻辑缓存卷的状态包括已写满状态或未写满状态;
转向执行将所述刷新任务队列的队首元素取出的步骤;
释放所述逻辑缓存卷。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
接收读任务;
获取逻辑缓存卷;
判断所述写入数据区域变量是否包括所述读任务中指示的数据读取区域;
若所述写入数据区域变量不包括所述读任务中指示的数据读取区域,则转向执行将所述刷新任务队列的队首元素取出的步骤;
若所述数据区域包括所述读任务中指示的数据读取区域,则从所述逻辑缓存卷中读取数据并修改已读数据区域变量;
判断已读数据区域变量是否是所述逻辑缓存卷的全范围;若否则将所述逻辑缓存卷移至所述读任务对应的任务队列的队首;
释放所述逻辑缓存卷。
9.一种数据缓存装置,其特征在于,包括:
插入单元,用于将缓存中的待执行刷新操作的逻辑缓存卷插入到刷新任务队列中;
取出单元,用于将所述刷新任务队列的队首元素取出,并将所述队首元素作为当前缓存卷;
确定单元,用于确定所述当前缓存卷的状态;
选择单元,用于在所述当前缓存卷是已写满状态的情况下,在所述刷新任务队列中选择所述当前缓存卷作为执行刷新操作的逻辑缓存卷;
上述装置还包括遍历单元,遍历单元用于:
对预先设置的访问计数进行累加操作;
将刷新任务队列的队首元素取出之前,方法还包括:
在访问计数小于等于刷新任务队列的长度的情况下,转向执行将刷新任务队列的队首元素取出的步骤;
在访问计数大于刷新任务队列的长度的情况下,确定不对刷新任务队列中的逻辑缓存卷执行刷新操作。
10.一种电子设备,其特征在于,包括处理器和存储器,所述存储器中存储指令,所述指令由处理器加载并执行,以实现如权利要求1至8中任一项所述的方法。
11.一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至8中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911158097.8A CN110990302B (zh) | 2019-11-22 | 2019-11-22 | 数据缓存方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911158097.8A CN110990302B (zh) | 2019-11-22 | 2019-11-22 | 数据缓存方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110990302A CN110990302A (zh) | 2020-04-10 |
CN110990302B true CN110990302B (zh) | 2021-11-02 |
Family
ID=70086026
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911158097.8A Active CN110990302B (zh) | 2019-11-22 | 2019-11-22 | 数据缓存方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110990302B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112463059B (zh) * | 2020-11-30 | 2022-12-27 | 苏州浪潮智能科技有限公司 | 一种写数据处理方法、装置、电子设备及存储介质 |
CN113312391A (zh) * | 2021-06-01 | 2021-08-27 | 上海万物新生环保科技集团有限公司 | 一种缓存异步延时刷新的方法及设备 |
CN113760782A (zh) * | 2021-08-23 | 2021-12-07 | 南京森根科技股份有限公司 | 一种可动态调节的环形缓存系统及其控制方法 |
CN113821173B (zh) * | 2021-09-17 | 2023-12-22 | 济南浪潮数据技术有限公司 | 一种数据存储方法、装置、设备及计算机可读存储介质 |
CN114579269A (zh) * | 2022-02-08 | 2022-06-03 | 阿里巴巴(中国)有限公司 | 任务调度方法及装置 |
CN115733883B (zh) * | 2022-12-27 | 2023-10-03 | 江苏云工场信息技术有限公司 | 一种刷新cdn缓存的方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH05225062A (ja) * | 1992-02-13 | 1993-09-03 | Matsushita Electric Ind Co Ltd | ディスク・キャッシュ装置 |
CN1773470A (zh) * | 2004-11-09 | 2006-05-17 | 富士通株式会社 | 库系统、虚拟库装置、缓存器恢复方法及可机读记录介质 |
CN101093466A (zh) * | 2007-08-10 | 2007-12-26 | 杭州华三通信技术有限公司 | 通过缓存写数据的方法和缓存系统及装置 |
CN108037894A (zh) * | 2017-12-05 | 2018-05-15 | 浙江大华技术股份有限公司 | 一种磁盘空间管理方法及装置 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050268022A1 (en) * | 2004-05-26 | 2005-12-01 | Pelley Perry H | Cache line memory and method therefor |
CN101122888A (zh) * | 2006-08-09 | 2008-02-13 | 国际商业机器公司 | 写入和读取应用数据的方法和系统 |
US9501240B2 (en) * | 2014-02-21 | 2016-11-22 | International Business Machines Corporation | Efficient free-space management of multi-target peer-to-peer remote copy (PPRC) modified sectors bitmap in bind segments |
KR102421149B1 (ko) * | 2018-01-02 | 2022-07-14 | 에스케이하이닉스 주식회사 | 메모리 시스템 및 그것의 동작 방법 |
CN108304272B (zh) * | 2018-01-19 | 2020-12-15 | 深圳神州数码云科数据技术有限公司 | 一种数据io请求的处理方法及装置 |
CN110059797B (zh) * | 2018-10-10 | 2020-03-10 | 中科寒武纪科技股份有限公司 | 一种计算装置及相关产品 |
-
2019
- 2019-11-22 CN CN201911158097.8A patent/CN110990302B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH05225062A (ja) * | 1992-02-13 | 1993-09-03 | Matsushita Electric Ind Co Ltd | ディスク・キャッシュ装置 |
CN1773470A (zh) * | 2004-11-09 | 2006-05-17 | 富士通株式会社 | 库系统、虚拟库装置、缓存器恢复方法及可机读记录介质 |
CN101093466A (zh) * | 2007-08-10 | 2007-12-26 | 杭州华三通信技术有限公司 | 通过缓存写数据的方法和缓存系统及装置 |
CN108037894A (zh) * | 2017-12-05 | 2018-05-15 | 浙江大华技术股份有限公司 | 一种磁盘空间管理方法及装置 |
Non-Patent Citations (2)
Title |
---|
Thermal-aware energy minimization of 3D-stacked L3 cache with error rate limitation;Woojin Yun等;《2011 IEEE International Symposium of Circuits and Systems (ISCAS)》;IEEE;20110705;第1672-1675页 * |
浪潮双控制器存储服务器缓存模块设计与实现;孙冰勇;《中国优秀硕士学位论文全文数据库 (信息科技辑)》;中国学术期刊(光盘版)电子杂志社;20170115(第1期);第I137-20页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110990302A (zh) | 2020-04-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110990302B (zh) | 数据缓存方法、装置、电子设备及存储介质 | |
US10133679B2 (en) | Read cache management method and apparatus based on solid state drive | |
KR100584255B1 (ko) | 플래시 메모리를 위한 포스트방식의 라이트-스루 캐시 | |
EP3252609A1 (en) | Cache data determination method and device | |
KR100577384B1 (ko) | 페이지 정보를 이용한 페이지 대체 방법 | |
KR101372964B1 (ko) | 메모리 페이지 관리 | |
CN108647151A (zh) | 一种全闪系统元数据落盘方法、装置、设备及存储介质 | |
CN107430551B (zh) | 数据缓存方法、存储控制装置、及存储设备 | |
CN105677236B (zh) | 一种存储设备及其存储数据的方法 | |
US9307024B2 (en) | Efficient storage of small random changes to data on disk | |
CN110555001B (zh) | 数据处理方法、装置、终端及介质 | |
CN112799595B (zh) | 数据处理方法、设备及存储介质 | |
KR20140100876A (ko) | 향상된 i/o 성능을 위한 데이터 캐싱의 레이트를 조절하기 위한 방법 | |
CN110147331B (zh) | 缓存数据处理方法、系统及可读存储介质 | |
CN110737388A (zh) | 数据预读方法、客户端、服务器以及文件系统 | |
CN116860170A (zh) | 一种数据处理方法、装置、设备、介质及固态硬盘 | |
US8095711B2 (en) | Method and devices for compressing delta log using flash transactions | |
CN116069261A (zh) | 一种数据处理方法、系统、设备以及存储介质 | |
US10083117B2 (en) | Filtering write request sequences | |
US8732404B2 (en) | Method and apparatus for managing buffer cache to perform page replacement by using reference time information regarding time at which page is referred to | |
US20170262485A1 (en) | Non-transitory computer-readable recording medium, data management device, and data management method | |
CN111459402B (zh) | 磁盘可控缓冲写方法、控制器、混合io调度方法及调度器 | |
KR101179027B1 (ko) | 버퍼의 지역성에 기초한 가비지 컬렉션을 수행하는 낸드 플래시 메모리 시스템 및 방법 | |
US20170075590A1 (en) | Method for providing nonvolatile storage write bandwidth using a caching namespace | |
CN111290974B (zh) | 用于存储设备的缓存淘汰方法与存储设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |