一种数据缓存方法和电子设备与流程

文档序号:28592539发布日期:2022-01-22 09:07阅读:112来源:国知局
一种数据缓存方法和电子设备与流程

1.本公开涉及通信技术领域,尤其涉及一种数据缓存方法和电子设备。


背景技术:

2.同一软件系统内部的不同软件功能模块间传递数据时,需要使用数据缓存模块或是消息队列。数据缓存模块不仅能做到缓存数据的作用,而且对于异步数据缓存,能使两个模块之间几乎互不影响,能达到高效的解耦和隔离。
3.目前常用的数据缓存是长度固定且逻辑上首尾相连的ringbuffer,底层一般用数组或是链表数据结构来实现。这样的实现方式存在数组长度不能动态扩展,或使用链表时申请的内存块存储容量较小,需要频繁的申请和释放内存块的问题,导致数据存储性能较低。


技术实现要素:

4.有鉴于此,本发明的主要目的在于提供一种数据缓存方法和电子设备,通过本发明的方法和电子设备,使得数据缓存的性能得到提高。
5.为达到上述目的,本发明的技术方案是这样实现的:
6.一种数据缓存方法,应用于电子设备,所述方法包括:
7.基于n个内存块建立环形链表,基于所述环形链表执行针对内存块的写入和/或读取数据的处理;其中,n为大于等于2的整数;所述环形链表中包含的n个内存块的存储容量大于所述电子设备中其他内存块的存储容量;
8.其中,基于所述环形链表执行写入和/或读取数据的处理包括以下至少之一:
9.在写入数据时,若所述环形链表对应的所述内存块已写满,则从空闲列表中选取空闲内存块作为环形链表中的新增内存块,在所述新增内存块中写入数据;
10.在读取数据时,从所述环形链表对应的至少一个已写满的所述内存块中取出第一内存块,并从所述第一内存块中读取数据。
11.在上述方案中,所述方法还包括:写入数据时,判断写指针指向的第二内存块是否已写满;若未写满,则在所述第二内存块中写入数据;其中,所述写指针用于指向内存块。
12.在上述方案中,所述方法还包括:针对所述环形链表设置一个互斥锁;其中,所述互斥锁,用于为线程提供从所述环形链表中取出已写满的内存块的权限。
13.在上述方案中,所述从所述环形链表对应的至少一个已写满的所述内存块中取出第一内存块,包括:
14.当读指针指向的所述第一内存块被写满时,控制第一线程获取针对所述环形链表设置的所述互斥锁;其中,所述读指针用于指向内存块;所述第一线程为多个线程中之一;
15.通过所述第一线程从所述环形链表中取出读指针指向的第一内存块对应的地址信息,删除所述环形链表包含的所述第一内存块所对应的地址信息。
16.在上述方案中,所述从所述第一内存块中读取数据,包括:
17.将所述第一线程获取的针对所述环形链表的所述互斥锁释放,并基于所述第一内存块对应的地址信息读取所述第一内存块中的数据。
18.在上述方案中,所述方法还包括:当所述第一线程完成读取所述第一内存块后,判断所述环形链表中包含的空内存块的比例是否大于等于第一阈值;
19.若大于等于所述第一阈值,则将所述第一内存块所对应的地址信息添加到所述空闲列表;否则,将所述第一内存块所对应的地址信息插入到所述环形链表。
20.在上述方案中,所述方法还包括:若内存块中已写入的数据的大小与所述内存块的最大存储容量相等,则确定所述内存块为已写满的内存块;或者,
21.若内存块中已写入的数据大小小于所述内存块的最大存储容量,并且所述内存块未写入新的数据的时长超过第一预设时长,则将所述内存块作为已写满的内存块。
22.一种电子设备,所述电子设备包括:链表生成单元,链表处理单元;
23.所述链表生成单元,用于基于n个内存块建立环形链表;其中,n为大于等于2的整数;所述环形链表中包含的n个内存块的存储容量大于其他内存块的存储容量;所述链表处理单元,包括写单元和读单元;用于基于所述环形链表执行写入和/或读取数据的处理至少之一:其中,
24.所述写单元,用于在写入数据时,若所述环形链表对应的所述内存块已写满,则从空闲列表中选取空闲内存块作为环形链表中的新增内存块,在所述新增内存块中写入数据;
25.所述读单元,用于在读取数据时,从所述环形链表对应的至少一个已写满的所述内存块中取出第一内存块,并从所述第一内存块中读取数据。
26.在上述方案中,所述写单元,还用于写入数据时,判断写指针指向的第二内存块是否已写满;若未写满,则在所述第二内存块中写入数据;其中,所述写指针用于指向内存块。
27.在上述方案中,所述读单元,还用于针对所述环形链表设置一个互斥锁;其中,所述互斥锁,用于为线程提供从所述环形链表中取出已写满的内存块的权限。
28.在上述方案中,所述读单元,还用于当读指针指向的所述第一内存块被写满时,控制第一线程获取针对所述环形链表设置的所述互斥锁;其中,所述读指针用于指向内存块;所述第一线程为多个线程中之一;通过所述第一线程从所述环形链表中取出读指针指向的第一内存块对应的地址信息,删除所述环形链表包含的所述第一内存块所对应的地址信息。
29.在上述方案中,所述读单元,还用于将所述第一线程获取的针对所述环形链表的所述互斥锁释放,并基于所述第一内存块对应的地址信息读取所述第一内存块中的数据。
30.在上述方案中,所述读单元,还用于当所述第一线程完成读取所述第一内存块后,判断所述环形链表中包含的空内存块的比例是否大于等于第一阈值;若大于等于所述第一阈值,则将所述第一内存块所对应的地址信息添加到所述空闲列表;否则,将所述第一内存块所对应的地址信息插入到所述环形链表。
31.在上述方案中,所述电子设备还包括判定单元;
32.所述判定单元,用于若内存块中已写入的数据的大小与所述内存块的最大存储容量相等,则确定所述内存块为已写满的内存块;或者,若内存块中已写入的数据大小小于所述内存块的最大存储容量,并且所述内存块未写入新的数据的时长超过第一预设时长,则
将所述内存块作为已写满的内存块。
33.本发明实施例提供的技术方案可以包括以下有益效果:
34.本发明实施例基于n个内存块建立环形链表,且,环形链表中的内存块的存储容量比电子设备中其他的内存块的存储容量要大,保证了能在一个内存块中写入更多的数据。在写入数据时,如果环形链表中所有内存块都已写满,则从空闲列表的内存块中选择一个新增内存块添加入环形链表,并在该新增内存块中写入数据;如此,通过对环形链表所对应的内存块的动态增加,实现对环形链表的动态扩展,避免了数组形式的数据缓存方法在数据量突增时,由于不能动态增加数组长度,而导致数据丢失。在读取数据时,从环形链表中将写满的第一内存块取出,基于环形链表中包含的内存块的存储容量大于电子设备中其他内存块的存储容量,使得向所述内存块中写入较大量数据后,才需要将所述内存块从环形链表中取出,避免了在内存块存储容量很小、很容易将该小内存块写满的情况下,需要频繁的释放小内存块空间导致的性能消耗。此外,结合上述两个特征,能实现环形链表所对应内存块的动态增减,提高了数据缓存的性能。
35.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本发明。
附图说明
36.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。
37.图1是本发明实施例提供的一种数据缓存方法示意图;
38.图2是本发明实施例提供的由多个内存块组成的环形链表结构示意图;
39.图3a是本发明实施例提供的从空闲链表中取出空的内存块并插入到环形链表的结构示意图一;
40.图3b是本发明实施例提供的从空闲链表中取出空的内存块并插入到环形链表的结构示意图二;
41.图4a是本发明实施例提供的从环形链表中取出一个已写满的内存块的结构示意图一;
42.图4b是本发明实施例提供的从环形链表中取出一个已写满的内存块的结构示意图二;
43.图5a是本发明实施例提供的将已读取过的内存块回收到空闲链表的结构示意图一;
44.图5b是本发明实施例提供的将已读取过的内存块回收到空闲链表的结构示意图二;
45.图6a是本发明实施例提供的将已读取过的内存块插入到环形链表的结构示意图一;
46.图6b是本发明实施例提供的将已读取过的内存块插入到环形链表的结构示意图二;
47.图7a是本发明实施例提供的将超过第一预设时长还没有写入下一次数据的已写入部分数据的内存块设置为已写满状态的结构示意图一;
48.图7b是本发明实施例提供的将超过第一预设时长还没有写入下一次数据的已写入部分数据的内存块设置为已写满状态的结构示意图二;
49.图8为本发明实施例提供的一种电子设备结构框图。
具体实施方式
50.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
51.相关技术中,关于数据缓存方法在使用数组或链表的数据结构来实现时采用的方法为:
52.用数组的实现方式。首先申请一个固定大小的数组。然后分别设置两个指针,head和tail。head指向下一次读的位置,tail指向的是下一次写的位置。生产者每生产一个数据就往tail指向的位置拷贝,然后改变tail指向下一个写位置;消费者每消费一条消息就把head移动到下一个位置,通过指针的移动,可以实现数据在数组中的环形存取。当head==tail时,说明buffer为空,当head==(tail+1)%buffersize则说明buffer满了,这种方式的ringbuffer总容量固定,且要求每条消息的长度是固定长度,即要求每条消息的长度等于一个数组元素的长度。
53.使用链表的实现方式。同样设置head和tail指针,生产者每产生一条数据,首先需要在堆上申请一块内存,把消息拷贝进内存,然后再把指向该内存的指针插入到链表的tail位置,然后重新设置tail的值;消费者消费数据时从链表的head位置摘一条消息出来,消费完毕后再释放该链表节点指向的堆内存。
54.此外,上述两种方式在采用多生产者、多消费者线程读数据和写数据时,由于读写每一条消息都需要加锁,导致读写性能严重下降,同样无法满足多线程并发条件下高性能读写数据的要求。
55.针对上述问题,本发明实施例提供一种数据缓存方法,如图1所示,图1为本发明实施例提供的一种数据缓存方法示意图。
56.s101、基于n个内存块建立环形链表,基于所述环形链表执行针对内存块的写入和/或读取数据的处理;其中,n为大于等于2的整数;所述环形链表中包含的n个内存块的存储容量大于所述电子设备中其他内存块的存储容量。
57.建立环形链表,环形链表的各链表节点存储的指针均指向从多个堆上申请的内存块,本发明实施例中申请的内存块的存储容量均大于未被申请的内存块,本发明实施例中申请的内存块的存储容量均大于等于1m。选取存储容量比较大的内存块,使得每一个内存块能够存储较多的数据,或者,能够实现对同一个内存块进行多次小容量数据的写入,直到写入的数据量的大小达到内存块的存储容量。以此保证在单次被写入的数据量比较少时,能够多次向同一个内存块写入数据,从而避免频繁申请内存空间,导致不必要的性能消耗。
58.在本发明实施例中,基于5个内存块建立环形链表,即此处n=5。每一个内存块均有full和free两个状态,当内存块被写满时,该内存块为full状态,而当内存块没被写满时,该内存块为free状态。针对所述环形链表,设置一个读指针pread和一个写指针pwrite,
初始状态下,读指针pread和写指针pwrite均指向同一个空的内存块,如图2所示。
59.如图2所示,图2为本发明实施例提供的由多个内存块组成的环形链表结构示意图。在建立该环形链表时,没有缓存数据,环形链表所对应的每一个内存块均为空。同时,再建立一个空闲链表,该空闲链表中每一个节点的地址也都指向空的内存块。本实施例中,设置空闲列表中空的内存块个数为3个。其中,环形链表对应的内存块不同于空闲链表所对应的内存块。
60.所述基于所述环形链表执行写入数据和/或读取数据的处理,如图1所示,包括以下至少之一:
61.s102a、在写入数据时,若所述环形链表对应的所述内存块已写满,则从空闲列表中选取空闲内存块作为环形链表中的新增内存块,在所述新增内存块中写入数据。
62.如图3a所示,当向环形链表对应的内存块中写数据的速度很快或者从环形链表对应的内存块中读数据的速度很慢时,会出现环形链表对应的所有内存块都被写满的情况,使得待写入的数据没有内存块写入。这时,从空闲链表中申请一个内存块添加到环形链表中,即在环形链表中新增一个链表节点,并将该链表节点的地址指向空闲链表中空的内存块,同时,将空闲链表中指向该内存块的地址删除,使得所述空的内存块作为环形链表的新增内存块。此外,再将环形链表中的写指针指向所述新增内存块,并将待写入的数据写入所述新增内存块中,如图3b所示。为防止内存爆掉,这里为环形链表设置最大内存块数,当达到最大内存块数后,就不再插入新的内存块,这种情况下,针对新写入的数据,一律丢弃。其中,图3a和图3b分别为本发明实施例提供的从空闲链表中取出空的内存块并插入到环形链表的结构示意图一和二。
63.通过这种当环形链表中的内存块全部写满时,从空闲链表中获取空闲内存块的方式,能够实现对环形链表长度的动态扩展,很大程度上避免了数组形式的数据缓存方法在数据量突增时,由于不能动态增加数组长度,而导致的数据丢失。如图1所示,s102b、在读取数据时,从所述环形链表对应的至少一个已写满的所述内存块中取出第一内存块,并从所述第一内存块中读取数据。
64.由于本实施例中内存块都选择1m以上的大存储容量内存块,一般情况下,要等待环形链表中的内存块被写满时才能将所述内存块从环形链表中取出,从而避免了以往使用小存储容量的内存块作为链表对应的节点时,写入少量数据后就要释放该小存储容量内存块,导致频繁释放内存块的问题,造成不必要的性能消耗。本实施例中,当所述环形链表中存在至少一个已写满的所述内存块,则从中将第一内存块取出。将已写满的第一内存块取出的过程可以参照图4a和4b,其中,图4a和4b分别为从环形链表中取出一个已写满的内存块的结构示意图一和二。
65.所示数据缓存方法还包括:写入数据时,判断写指针指向的第二内存块是否已写满;若未写满,则在所述第二内存块中写入数据;其中,所述写指针用于指向内存块。
66.在本实施例中,执行写数据操作的线程为生产者producer,该生产者producer可以为多个,如图2所示。在写入数据时,判断写指针pwrite当前指向的第二内存块是否已写满;如果未写满,则在所述第二内存块中写入数据。
67.此外,针对每一个内存块还设置了写指针偏移量write_index,初始值为write_index=0,用于指示当前能够写数据的位置。示例性的,如第一次向第二内存块写入10个字
节的数据,那么,第一次写完数据后,write_index=10,意味着,第二次向该第二内存块写数据时,从第二内存块write_index=10所指向的第11个字节开始写入数据。
68.本发明实施例中,每一次向所述内存块写入的数据长度均可以不同,示例性的如需要写入的数据都以tlv的格式写入第二内存块中,从而达到了存放变长消息数据的目的,提高了数据存储的灵活性。当生产者producer将写指针pwrite指向的内存块写满时,所述内存块的状态设置为full,所述写指针pwrite指向下一个内存块,如图4a和4b示出的,其中,所述下一个内存块为:顺着如图4a所示的环形链表结构中的箭头方向指向的、与所述第一内存块相邻的内存块。
69.多个生产者producer可以依次执行写数据的操作,示例性的,在初始化时设置了两个生产者:第一生产者producer1和第二生产者producer2,由着两个生产者依次对内存块执行写数据操作。在向第二内存块写数据时,先由第一生产者producer1执行写操作,producer1写完此次数据后,再由第二生产者producer2执行向所述第二内存块写数据的操作,然后再由第一生产者producer1继续向其中写数据,以此类推,直到将第二内存块写满;也可以是,当第一生产者producer1写入的数据很大,大小超过第二内存块的存储容量大小,以至于将第二内存块写满后还需要向下一个内存块写数据,在所述下一个内存块中完成写操作后,第二生产者producer2直接对所述下一个内存块执行写数据的操作。在实际应用中,多个生产者producer在向内存块中写入数据的方式包括但不限于上述两种方式。
70.所述数据缓存方法还包括:针对所述环形链表设置一个互斥锁;其中,所述互斥锁,用于为线程提供从所述环形链表中取出已写满的内存块的权限。
71.本发明实施例中,针对所述环形链表设置了一个互斥锁mutex,当有内存块被写满时,线程在获得该互斥锁mutex后,拥有将所述内存块从环形链表中取出来的权限。
72.所述从所述环形链表对应的至少一个已写满的所述内存块中取出第一内存块,包括:当读指针指向的所述第一内存块被写满时,控制第一线程获取针对所述环形链表设置的所述互斥锁;其中,所述读指针用于指向内存块;所述第一线程为多个线程中之一;
73.通过所述第一线程从所述环形链表中取出读指针指向的第一内存块对应的地址信息,删除所述环形链表包含的所述第一内存块所对应的地址信息。
74.当读指针指向的所述第一内存块被写满时,第一线程获得针对所述环形链表设置的互斥锁mutex,然后,第一线程将所述读指针pread指向下一个内存块,并将所述第一内存块从环形链表中取出,所述下一个内存块为顺着环形链表中箭头方向与所述第一内存块相邻的内存块,如图4b。本实施例中,“取出”的意思是,将所述第一内存块对应的地址信息从环形链表中取出,并删除所述环形链表中包含的所述第一内存块所对应的地址信息,使得环形链表中不包括指向该被取出的内存块的地址。
75.本发明实施例中,执行读数据操作的第一线程为消费者consumer,该消费者consumer有多个,具体个数与初始化时的设置有关;其中的任意一个消费者在获得互斥锁的情况下都能够将被读指针指向的、状态为full的内存块从环形链表中取出。
76.此外,针对每一个内存块还设置了读指针偏移量read_index,初始值为read_index=0,用于指示当前能够从read_index指示的位置开始读内存块中已有的数据,刚刚将内存块从环形链表中取出时,read_index=0,如图4b所示;而读取了一部分数据的内存块中read_index不为0,而是实际读取的位置,如图5a所示。
77.所述从所述第一内存块中读取数据,包括:将所述第一线程获取的针对所述环形链表的所述互斥锁释放,并基于所述第一内存块对应的地址信息读取所述第一内存块中的数据。
78.当所述第一线程将所述第一内存块从环形链表中取出后,释放所述互斥锁,使得第一线程在没有互斥锁的情况下,基于第一内存块对应的地址信息确定所述第一内存块,并读取所述第一内存块中的数据。
79.多个消费者consumer可以依次将读指针指向的、且已经写满的内存块从环形链表中取出,示例性的,如图4a所示,第一消费者consumer1在所述读指针pread指向的第一内存块被写满时,获得互斥锁mutex,并将所述读指针pread指向下一个内存块,然后将所述第一内存块从所述环形链表中取出。取出后,第一消费者consumer1再释放所述互斥锁mutex,使得第一消费者consumer1在没有所述互斥锁mutex的情况下读取第一内存块中的数据。当所述读指针pread指向的下一个内存块被写满,而第一消费者consumer1没有将第一内存块读取完时,由第二消费者consumer2获得所述互斥锁,并将读指针pread顺着图4a中箭头的方向指向再下一个内存块,同时,将所述下一个内存块取出,然后,第二消费者consumer2释放所述互斥锁mutex,并在没有互斥锁的情况下读取所述下一个内存块中存储的数据。若第一消费者consumer1和第二消费者consumer2均没有读取完对应内存块中的数据,而此时又有一个新的内存块被写满,那么:若在初始化时设置了至少三个消费者,则由第三消费者consumer3开始对所述新的内存块进行数据读取;若在初始化时只设置了两个消费者,则需要等待第一消费者consumer1和第二消费者consumer2其中之一读取完之前的内存块以后再来读取所述新的内存块。
80.可以理解的是,释放互斥锁,降低了生产者与消费者之间对互斥锁的竞争关系,从而也提高了数据缓存的性能。
81.所述数据缓存方法还包括:
82.当所述第一线程完成读取所述第一内存块后,判断所述环形链表中包含的空内存块的比例是否大于等于第一阈值;
83.若大于等于所述第一阈值,则将所述第一内存块所对应的地址信息添加到所述空闲列表;否则,将所述第一内存块所对应的地址信息插入到所述环形链表。
84.当之前从环形链表中取出的第一内存块在被消费者读取完后,消费者将所述第一内存块的状态设置为free状态,并初始化该第一内存块的数据,该初始化的方式包括但不限于设置所述第一内存块的写指针偏移量write_index=0,以及读指针偏移量read_index=0。此时,消费者判断当前环形链表中空的内存块个数占所述环形链表中所有内存块总数的比例值与预设的第一阈值的大小关系,当判断所述比例值大于等于第一阈值时,如图5a所示,消费者将被取出的第一内存块回收到空闲列表中,如图5b所示,即将被取出的第一内存块对应的地址信息添加到所述空闲列表;当判断所述比例值小于第一阈值时,如图6a所示,消费者获取互斥锁,然后将被取出的第一内存块重新插入环形链表中,如图6b所示,即将被取出的第一内存块对应的地址信息添加到所述环形链表中,并从环形链表中取出一个被读指针pread指向的、状态为full的内存块,然后释放互斥锁。
85.在实际应用中,能够引起环形链表中空的内存块的个数与环形链表中总的内存块个数比值变动的因素包括但不限于生产者写数据与消费者读取数据的速度不同,因此,第
一阈值可根据实际情况进行设置,以保证数据缓存的性能。
86.其中,图5a和5b为本发明实施例提供的将已读取过的内存块回收到空闲链表的结构示意图一和二;图6a和6b为本发明实施例提供的将已读取过的内存块插入到环形链表的结构示意图一和二。
87.在消费者读取了被取出的内存块中数据后,判断现有的环形链表中空的内存块与环形链表中总的内存块个数的比例关系,并据此决定将被取出的内存块回收到空闲链表或者重新插入到环形链表中的方式,能根据实际情况实现对环形链表对应的内存块个数的动态增减,同时,将内存块回收到空闲链表或从空闲链表对应的内存块中申请空的内存块,能够实现内存块的重复利用,提高了数据缓存的性能。
88.所述方法还包括:若内存块中已写入的数据的大小与所述内存块的最大存储容量相等,则确定所述内存块为已写满的内存块;或者,
89.若内存块中已写入的数据大小小于所述内存块的最大存储容量,并且所述内存块未写入新的数据的时长超过第一预设时长,则将所述内存块作为已写满的内存块。
90.在本发明实施例中,主要通过两种情况确定内存块为写满状态。
91.第一种:每次向同一个内存块写入数据的时间间隔不超过第一预设时长,当向所述内存块写入数据的大小与所述内存块的最大存储容量相等时,判定所述内存块已写满,设置所述内存块的状态为full。
92.第二种:若存在一个内存块,其中已经写了部分数据,且这部分数据的大小小于所述内存块的最大存储容量,在超过第一预设时长没有写入新的数据,则不再向所述内存块写入新的数据,并设置所述内存块的状态为full。示例性的,如果一个内存块的存储容量为1m,当向其中写了100k的数据后,隔了2秒都没有进行下一次写数据的操作,则为了保证写入的数据能够及时被读取,消费者在获取互斥锁的情况下,强制将所述内存块的状态设置为full,并且将写指针pwrite和读指针pread指向下一个节点,同时,消费者将所述内存块从环形链表中取出,然后释放互斥锁,具体如图7a和7b所示。当生产者写数据的速度远小于消费者读取数据的速度时,会出现消费者一直等待生产者写数据的情况,若超过第一预设时长后,生产者还是没有写入新的数据,则消费者强制设置所述内存块的状态为full状态。通过这样的方式保证写入的数据能够被及时读取,从而提高数据缓存方法的性能。其中,图7a和7b为本发明实施例提供的将超过第一预设时长还没有写入下一次数据的已写入部分数据的内存块设置为已写满状态的结构示意图一和二。
93.通过本发明实施例,能够实现环形链表的动态扩展,降低释放环形链表所对应的内存块的频率,进一步降低对系统性能的损耗,从而提升数据缓存的性能。
94.本发明实施例提供一种电子设备,如图8所示,图8为本发明实施例提供的电子设备的结构框图。
95.图8所示的电子设备100中包括链表生成单元10,链表处理单元20;
96.所述链表生成单元10,用于基于n个内存块建立环形链表;其中,n为大于等于2的整数;所述环形链表中包含的n个内存块的存储容量大于其他内存块的存储容量;
97.所述链表处理单元20,包括写单元21和读单元22;用于基于所述环形链表执行写入和/或读取数据的处理至少之一:其中,
98.所述写单元21,用于在写入数据时,若所述环形链表对应的所述内存块已写满,则
从空闲列表中选取空闲内存块作为环形链表中的新增内存块,在所述新增内存块中写入数据;
99.所述读单元22,用于在读取数据时,从所述环形链表对应的至少一个已写满的所述内存块中取出第一内存块,并从所述第一内存块中读取数据。
100.所述写单元21,还用于在写入数据时,判断写指针指向的第二内存块是否已写满;若未写满,则在所述第二内存块中写入数据;其中,所述写指针用于指向内存块。
101.所述读单元22,还用于针对所述环形链表设置一个互斥锁;其中,所述互斥锁,用于为线程提供从所述环形链表中取出已写满的内存块的权限。
102.所述读单元22,还用于当读指针指向的所述第一内存块被写满时,控制第一线程获取针对所述环形链表设置的所述互斥锁;其中,所述读指针用于指向内存块;所述第一线程为多个线程中之一;通过所述第一线程从所述环形链表中取出读指针指向的第一内存块对应的地址信息,删除所述环形链表包含的所述第一内存块所对应的地址信息。
103.所述读单元22,还用于将所述第一线程获取的针对所述环形链表的所述互斥锁释放,并基于所述第一内存块对应的地址信息读取所述第一内存块中的数据。
104.所述读单元22,还用于当所述第一线程完成读取所述第一内存块后,判断所述环形链表中包含的空内存块的比例是否大于等于第一阈值;若大于等于所述第一阈值,则将所述第一内存块所对应的地址信息添加到所述空闲列表;否则,将所述第一内存块所对应的地址信息插入到所述环形链表。
105.所述电子设备还包括判定单元30;
106.所述判定单元30,用于若内存块中已写入的数据的大小与所述内存块的最大存储容量相等,则确定所述内存块为已写满的内存块;或者,若内存块中已写入的数据大小小于所述内存块的最大存储容量,并且所述内存块未写入新的数据的时长超过第一预设时长,则将所述内存块作为已写满的内存块。
107.本发明实施例通过链表生成单元10建立环形链表,且,环形链表中的内存块的存储容量比电子设备中其他的内存块的存储容量要大,保证了能在一个内存块中写入更多的数据;写单元21实现在写入数据时,若环形链表中所有内存块都写满,则从空闲链表中获取一个新增内存块插入到环形链表中,实现环形链表对应的内存块的动态增加,避免了在写数据时由于数据量突增,而用于存储数据的内存块不够而导致的数据丢失;而基于环形链表申请的内存块的存储容量大于未被申请的内存块的存储容量,则通过读单元22将已写满的内存块从环形链表中取出时,能保证所述被取出的内存块中的数据量较大,避免了当内存块容量小时,频繁地将已写满的内存块取出时造成的性能损耗。如此,提高了电子设备数据缓存的性能。
108.本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本发明旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由所附的权利要求指出。
109.应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1