基于无锁环形共享内存的数据写入、读取、通信方法与流程

文档序号:30064122发布日期:2022-05-18 00:27阅读:276来源:国知局
基于无锁环形共享内存的数据写入、读取、通信方法与流程

1.本发明涉及网络虚拟化技术的共生虚拟机的通信技术领域,具体涉及一种基于无锁环形共享内存的数据写入、读取、通信方法。


背景技术:

2.在程序中(例如,通信程序),经常使用无锁环形缓冲区作为数据结构来存放通信中发送和接收的数据。无锁环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。经典的无锁环形缓冲区设置为固定大小,并设置了一个头指针(front指针)指示写者位置,一个尾指针(back指针)指示读者位置。写者写入数据时,必须保证back《read+buffer_size;读者读取数据时,必须保证read《back。
3.但经典的无锁环形缓冲区只支持一个写者和一个读者同步读写,导致其无法支持多核技术,为了解决这一技术问题,专利cn106790599a提出了一种基于多核无锁环形缓冲区的共生虚拟机通信方法,支持接收方高效并发读取,缓冲区读写并发性好,共生虚拟机通信效率高、能够充分利用处理的多核处理性能的优点。
4.但专利cn106790599a仍存在以下技术问题:写者受读者依赖,当读者不及时导致剩余空间不足时,会导致写数据失败,从而引起数据丢失或者写数据不及时。


技术实现要素:

5.有鉴于此,有必要提供一种基于无锁环形共享内存的数据写入、读取、通信方法,用以解决现有技术中存在的由于写者受读者依赖,当读者不及时导致剩余空间不足时,会导致写数据失败,从而引起数据丢失或者写数据不及时的技术问题。
6.为了解决上述技术问题,本发明提供了一种基于无锁环形共享内存的数据写入方法,包括:
7.步骤一、获取无锁环形共享内存中缓冲区的缓冲容量以及当前写指针地址;
8.步骤二、获取待写入数据以及所述待写入数据的数据长度;
9.步骤三、基于所述当前写指针地址以及所述缓冲容量将所述待写入数据写入至所述缓冲区;
10.步骤四、基于所述待写入数据将所述当前写指针地址进行偏移,获得偏移写指针地址,将所述偏移写指针地址作为所述当前写指针地址,返回至所述步骤二。
11.在一些可能的实现方式中,所述步骤三包括:
12.判断所述当前写指针地址与所述待写入数据的数据长度之和是否小于或等于所述缓冲容量;
13.若所述当前写指针地址与所述待写入数据的数据长度之和小于或等于所述缓冲容量,则将所述待写入数据写入至所述缓冲区中起始位置为所述当前写指针地址的区域;
14.若所述当前写指针地址与所述待写入数据的数据长度之和大于所述缓冲容量,则将所述待写入数据划分为数据长度为capacity-writec的第一待写入子数据和数据长度为
datalen
w-(capacity-writec)第二待写入子数据,将所述第一待写入子数据写入至所述缓冲区中起始位置为当前写指针地址,结束位置为所述缓冲区尾部地址的区域,将所述第二待写入数据写入至起始位置为所述缓冲区头部地址的区域,且将无锁环形共享内存标记已满。
15.其中,capacity为所述缓冲容量;writerc为所述当前写指针地址;datalenw为所述待写入数据的待写入数据的数据长度。
16.在一些可能的实现方式中,所述基于所述待写入数据将所述当前写指针地址进行偏移,获得偏移写指针地址,包括:
17.当所述当前写指针地址与所述待写入数据的数据长度之和小于或等于所述缓冲容量时,所述偏移写指针地址为:
18.writeo=writec+datalenw19.当所述当前写指针地址与所述待写入数据的数据长度之和大于所述缓冲容量时,所述偏移写指针地址为:
20.writeo=datalen
w-(capacity-writec)
21.式中,writero为所述偏移写指针地址;writerc为所述当前写指针地址;datalenw为所述待写入数据的待写入数据的数据长度;capacity为所述缓冲容量。
22.另一方面,本发明还提供了一种基于无锁环形共享内存的数据读取方法,包括:
23.步骤四、获取当前读指针地址、当前写指针地址、待读取数据的数据长度以及缓冲区的缓冲容量;
24.步骤五、判断所述当前读指针地址与所述待读取数据的数据长度之和是否小于或等于当前写指针地址;
25.步骤六、若所述当前读指针地址与所述待读取数据的数据长度之和小于或等于当前写指针地址,则从所述缓冲区中起始位置为当前读指针地址的区域读取所述待读取数据;
26.步骤七、若所述当前读指针地址与所述待读取数据的数据长度之和大于当前写指针地址,则判断所述当前读指针地址是否小于或等于所述当前写指针地址,以及无锁环形共享内存是否存满数据;
27.步骤八、若所述当前读指针地址大于所述当前写指针地址,且所述无锁环形共享内存存满数据,则将所述待读取数据划分为第一待读取子数据和第二待读取子数据,并从所述缓冲区中起始位置为当前读指针地址的区域读取第一待读取子数据,从所述缓冲区中起始位置为所述缓冲区头部的区域读取第二待读取子数据;
28.步骤九、基于所述待读取数据对所述当前读指针地址进行偏移,获得偏移读指针地址,将所述偏移读指针地址作为所述当前读指针地址,返回至所述步骤四。
29.在一些可能的实现方式中,在所述步骤六之前,包括:
30.步骤十、基于所述当前读指针地址、所述当前写指针地址以及所述待读取数据的数据长度判断将数据写入所述缓存区与读取所述缓存区中的数据的第一时间间隔是否大于阈值时间间隔;
31.步骤十一、若所述第一时间间隔小于或等于所述阈值时间间隔,则进行所述步骤六;若所述第一时间间隔大于所述阈值时间间隔,则进行步骤十二;
32.步骤十二、重置所述当前读指针地址,并将所述当前读指针地址相对当前写指针地址偏移所述待读取数据的数据长度;
33.步骤十三、判断所述当前写指针地址是否大于所述待读取数据的数据长度;若所述当前写指针地址大于所述待读取数据的数据长度,则进行所述步骤六;
34.步骤十四、若所述当前写指针地址小于或等于所述待读取数据的数据长度,则判断所述无锁环形共享内存是否存满,若所述无锁环形共享内存存满,则将所述待读取数据划分为第三待读取子数据和第四待读取子数据,并从所述缓冲区中的目标起始地址的区域读取所述第三待读取子数据,从所述缓冲区中起始位置为所述缓冲区头部地址的区域读取所述第四待读取子数据。
35.在一些可能的实现方式中,在所述步骤八之前,还包括:
36.步骤十五、基于所述当前读指针地址、所述当前写指针地址、所述缓冲容量以及所述待读取数据的数据长度判断将数据写入所述缓存区与读取所述缓存区中的数据的第二时间间隔是否大于阈值时间间隔;
37.步骤十六、若所述第二时间间隔小于或等于所述阈值时间间隔,则进行步骤八;
38.步骤十七、若所述第二时间间隔大于所述阈值时间间隔,则进行步骤十二。在一些可能的实现方式中,所述第一待读取子数据的长度为:
39.l1'=capacity-readerc40.所述第二待读取子数据的长度为:
41.l2'=datalen
r-(capacity-readerc)
42.所述第三待读取子数据的长度为:
43.l3'=datalen
r-writerc44.所述第四待读取子数据的长度为:
45.l4'=writerc46.所述目标起始地址为:
47.r=capacity-(datalen
r-writerc)
48.式中,l1'为所述第一待读取子数据;l2'为所述第二待读取子数据;l3'为所述第三待读取子数据;l4'为所述第四待读取子数据;r为所述目标起始地址;capacity为所述缓冲容量;datalenr为所述待读取数据的数据长度;readerc为所述当前读指针地址;capacity为所述缓冲容量。
49.在一些可能的实现方式中,所述基于所述待读取数据对所述当前读指针地址进行偏移,获得偏移读指针地址,包括:
50.当所述当前读指针地址与所述待读取数据的数据长度之和小于或等于当前写指针地址,且所述第一时间间隔小于或等于所述阈值时间间隔;或,当所述当前写指针地址大于所述待读取数据的数据长度时,所述偏移读指针地址为:
51.readero=readerc+datalenr52.当所述当前写指针地址小于所述待读取数据的数据长度,且所述无锁环形共享内存存满数据时,所述偏移读指针地址为:
53.readero=writec54.当所述当前读指针地址大于所述当前写指针地址,所述无锁环形共享内存存满数
据,且所述第二时间间隔小于或等于所述阈值时间间隔时,所述偏移读指针地址为:
55.readero=datalen
r-(capacity-readerc)
56.式中,readero为所述偏移读指针地址;readerc为所述当前读指针地址;writerc为所述当前写指针地址。
57.在一些可能的实现方式中,所述获取当前读指针地址,包括:
58.初始化所述读指针,获得初始读指针地址,并将所述初始读指针偏移指定长度,获得指针偏移地址;
59.判断所述初始读指针地址和所述指针偏移地址的差值是否小于0;
60.若所述初始读指针地址和所述指针偏移地址的差值小于0,则判断所述无锁环形共享内存是否存满,若所述无锁共享内存存满,则所述当前读指针地址为:readerc=capacity+(write
c-offset);若所述无锁共享内存未存满,则所述当前读指针地址为所述缓冲区的头部地址;
61.若所述当前读指针地址和所述指针偏移地址的差值大于或等于0,则所述当前读指针地址为:readerc=write
c-offset;
62.其中,readerc为所述当前读指针地址;capacity为所述缓冲容量;writerc为所述当前写指针地址;offset为所述指定偏移长度。
63.另一方面,本发明还提供了一种基于无锁环形共享内存的通信方法,包括:
64.通过基于无锁环形共享内存的数据写入方法将数据写入无锁环形共享内存的缓冲区;
65.通过基于无锁环形共享内存的数据读取方法将数据从所述无锁环形共享内存的缓冲区中读取;
66.其中,所述基于无锁环形共享内存的数据写入方法为上述基于无锁环形共享内存的数据写入方法任意一种可能的实现方式所述的基于无锁环形共享内存的数据写入方法,所述基于无锁环形共享内存的数据读取方法为上述基于无锁环形共享内存的数据读取方法任意一种可能的实现方式中所述的基于无锁环形共享内存的数据读取方法。
67.采用上述实施例的有益效果是:本发明提供的基于无锁环形共享内存的数据写入方法,通过设置根据当前写指针地址即可将待写入数据写入至缓冲区,而无需进行与读指针相关的逻辑判断,即:写者不受读者依赖,从而可避免待写入数据丢失或写入不及时,确保了待写入数据的及时性和完整性。
附图说明
68.为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
69.图1为本发明提供的基于无锁环形共享内存的数据写入方法的一个实施例流程示意图;
70.图2为本发明提供的基于无锁环形共享内存的数据写入方法的一个整体实施例示意图;
71.图3为本发明图1中的s103的一个实施例流程示意图;
72.图4为本发明提供的基于无锁环形共享内存的数据读取方法的一个实施例流程示意图;
73.图5为本发明提供的基于无锁环形共享内存的数据读取方法的一个整体实施例示意图;
74.图6为本发明提供的在s403前对待读取数据进行延时性判断的一个实施例流程示意图;
75.图7为本发明提供的在s405前对待读取数据进行延时性判断的一个实施例流程示意图;
76.图8为本发明图4中s401的一个实施例流程示意图;
77.图9为本发明提供的基于无锁环形共享内存的通信方法的一个实施例流程示意图。
具体实施方式
78.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
79.在本技术实施例的描述中,除非另有说明,“多个”的含义是两个或两个以上。
80.附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器系统和/或微控制器系统中实现这些功能实体。
81.在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本发明的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
82.本发明提供了一种基于无锁环形共享内存的数据写入、读取、通信方法,以下分别进行说明。
83.图1为本发明提供的基于无锁环形共享内存的数据写入方法的一个实施例流程示意图,图2为本发明提供的基于无锁环形共享内存的数据写入方法的一个整体实施例示意图,如图1和图2所示,基于无锁环形共享内存的数据写入方法包括:
84.s101、获取无锁环形共享内存中缓冲区的缓冲容量capacity以及当前写指针地址writerc;
85.s102、获取待写入数据以及待写入数据的数据长度datalenw;
86.s103、基于当前写指针地址以及缓冲容量将待写入数据写入至缓冲区;
87.s104、基于待写入数据将当前写指针地址进行偏移,获得偏移写指针地址writero,将偏移写指针地址作为当前写指针地址,返回至步骤s102。
88.与现有技术相比,本发明实施例提供的基于无锁环形共享内存的数据写入方法,
通过设置根据当前写指针地址即可将待写入数据写入至缓冲区,而无需在写数据时进行与读指针相关的逻辑判断,即:写者不受读者依赖,从而可避免待写入数据丢失或写入不及时,确保了待写入数据的及时性和完整性。
89.应当理解的是:在步骤s101之前应当申请包括一缓冲区的无锁环形共享内存。
90.还应当理解的是:待写入数据不局限于波形数据,可以是任意一种数据。
91.在本发明的一些实施例中,如图2和图3所示,步骤s103包括:
92.s301、判断当前写指针地址与待写入数据的数据长度之和是否小于或等于缓冲容量;
93.s302、若当前写指针地址与待写入数据的数据长度之和小于或等于缓冲容量,则将待写入数据写入至缓冲区中起始位置为当前写指针地址的区域;
94.s303、若当前写指针地址与待写入数据的数据长度之和大于缓冲容量,则将待写入数据划分为第一待写入子数据和第二待写入子数据,将第一待写入子数据写入至缓冲区中起始位置为当前写指针地址,结束位置为缓冲区尾部地址的区域,将第二待写入数据写入至起始位置为缓冲区头部地址的区域,且将无锁环形共享内存标记已满。
95.具体地:第一待写入子数据的数据长度为:
96.l1=capacity-writec97.第二待写入子数据的长度为:
98.l2=datalen
w-(capacity-writec)
99.式中,l1为第一待写入子数据;l2为第二待写入子数据;capacity为缓冲容量;writerc为当前写指针地址;datalenw为待写入数据的待写入数据的数据长度。
100.在本发明的一些实施例中,步骤s104中的基于待写入数据将当前写指针地址进行偏移,获得偏移写指针地址,包括:
101.当当前写指针地址与待写入数据的数据长度之和小于或等于缓冲容量时,偏移写指针地址为:
102.writeo=writec+datalenw103.当当前写指针地址与待写入数据的数据长度之和大于缓冲容量时,偏移写指针地址为:
104.writeo=datalen
w-(capacity-writec)
105.式中,writero为偏移写指针地址。
106.现有技术中的基于无锁环形共享内存的数据读取方法,当多读者访问时,对单个读者而言,无法实现从缓冲区读取连续的数据。
107.为了解决现有技术中的基于无锁环形共享内存的数据读取方法存在的多个读者中的各读者无法从缓冲区读取连续的数据的技术问题,本发明实施例还提供了一种基于无锁环形共享内存的数据读取方法,图4为本发明提供的基于无锁环形共享内存的数据读取方法的一个实施例流程示意图,图5为本发明提供的基于无锁环形共享内存的数据读取方法的一个整体实施例示意图,如图4和图5所示,基于无锁环形共享内存的数据读取方法包括:
108.s401、获取当前读指针地址、当前写指针地址、待读取数据的数据长度以及缓冲区的缓冲容量;
109.s402、判断当前读指针地址与待读取数据的数据长度之和是否小于或等于当前写指针地址;
110.s403、若当前读指针地址与待读取数据的数据长度之和小于或等于当前写指针地址,则从缓冲区中起始位置为当前读指针地址的区域读取待读取数据;
111.s404、若当前读指针地址与待读取数据的数据长度之和大于当前写指针地址,则判断当前读指针地址是否小于或等于当前写指针地址,以及无锁环形共享内存是否存满数据;
112.s405、若当前读指针地址大于当前写指针地址,且无锁环形共享内存存满数据,则将待读取数据划分为第一待读取子数据和第二待读取子数据,并从缓冲区中起始位置为当前读指针地址的区域读取第一待读取子数据,从缓冲区中起始位置为缓冲区头部的区域读取第二待读取子数据;
113.s406、基于待读取数据对当前读指针地址进行偏移,获得偏移读指针地址,将偏移读指针地址作为当前读指针地址,返回至步骤s401。
114.本发明实施例提供的基于无锁环形共享内存的数据读取方法,设置每个读者都拥有各自的当前读者地址,互不干扰,实现单个读者可以从任意合力位置开始读取连续的待读取数据而不影响其他读者,实现多读者无锁读取连续数据的技术效果。
115.应当理解的是:当多个读者读取缓冲区内的待读取数据时,多读者可以是多线程、多进程、多cpu等,在此不做具体限定。
116.还应当理解的是:待读取数据不局限于波形数据,可以是任意一种数据。
117.进一步地,在实际应用中会因为cpu紧张、网络卡顿等特殊情况导致读取数据的异常延时,而有些应用场景需要获取非常及时的实时数据,如医生需要在设备端或中央服务站观察病人实时的心电、呼吸、血氧等波形数据,从而及时做出应急措施,为了确保读取出的数据的及时性,在本发明的一些实施例中,如图5和图6所示,在步骤s403之前,还包括:
118.s601、基于当前读指针地址、当前写指针地址以及待读取数据的数据长度判断将数据写入缓存区与读取缓存区中的数据的第一时间间隔是否大于阈值时间间隔;
119.s602、若第一时间间隔小于或等于阈值时间间隔,则进行步骤s403;若第一时间间隔大于阈值时间间隔,则进行步骤s603;
120.s603、重置当前读指针地址,并将当前读指针地址相对当前写指针地址偏移所述待读取数据的数据长度;
121.s604、判断当前写指针地址是否大于待读取数据的数据长度;若当前写指针地址大于待读取数据的数据长度,则进行步骤s403;
122.s605、若当前写指针地址小于或等于待读取数据的数据长度,则判断无锁环形共享内存是否存满,若无锁环形共享内存存满,则将待读取数据划分为第三待读取子数据和第四待读取子数据,并从缓冲区中的目标起始地址的区域读取第三待读取子数据,从缓冲区中起始位置为缓冲区头部地址的区域读取第四待读取子数据。
123.本发明实施例在读取数据时,对读取的数据进行延时性和合法性判断,确保读取数据的及时性。
124.在本发明的一些实施例中,如图5和图7所示,在步骤s405之前,还包括:
125.s701、基于当前读指针地址、当前写指针地址、缓冲容量以及待读取数据的数据长
度判断将数据写入缓存区与读取缓存区中的数据的第二时间间隔是否大于阈值时间间隔;
126.s702、若第二时间间隔小于或等于阈值时间间隔,则进行步骤s405;
127.s703、若第二时间间隔大于阈值时间间隔,则进行步骤s603。
128.本发明实施例通过在当当前读指针地址与待读取数据的数据长度之和大于当前写指针地址时,也对读取数据的及时性进行判断,可确保整个数据读取过程中的及时性。
129.需要说明的是:阈值时间间隔应当根据实际需求进行调整。
130.具体地:第一待读取子数据的长度为:
131.l1'=capacity-readerc132.第二待读取子数据的长度为:
133.l2'=datalen
r-(capacity-readerc)
134.第三待读取子数据的长度为:
135.l3'=datalen
r-writerc136.第四待读取子数据的长度为:
137.l4'=writerc138.目标起始地址为:
139.r=capacity-(datalen
r-writerc)
140.式中,l1'为第一待读取子数据;l2'为第二待读取子数据;l3'为第三待读取子数据;l4'为第四待读取子数据;r为目标起始地址;capacity为缓冲容量;datalenr为待读取数据的数据长度;readerc为当前读指针地址;capacity为缓冲容量。
141.在本发明的一些实施例中,如图5所示,步骤s406中的基于待读取数据对当前读指针地址进行偏移,获得偏移读指针地址,包括:
142.当当前读指针地址与待读取数据的数据长度之和小于或等于当前写指针地址,且第一时间间隔小于或等于阈值时间间隔;或,当当前写指针地址大于待读取数据的数据长度时,偏移读指针地址为:
143.readero=readerc+datalenr144.当当前写指针地址小于待读取数据的数据长度,且无锁环形共享内存存满数据时,偏移读指针地址为:
145.readero=writec146.当当前读指针地址大于当前写指针地址,无锁环形共享内存存满数据,且第二时间间隔小于或等于阈值时间间隔时,偏移读指针地址为:
147.readero=datalen
r-(capacity-readerc)
148.式中,readero为偏移读指针地址;readerc为当前读指针地址;writerc为当前写指针地址。
149.在本发明的一些实施例中,如图5和图8所示,步骤s401中的获取当前读指针地址,包括:
150.s801、初始化读指针,获得初始读指针地址,并将初始读指针偏移指定长度,获得指针偏移地址;
151.s802、判断初始读指针地址和指针偏移地址的差值是否小于0;
152.s803、若初始读指针地址和指针偏移地址的差值小于0,则判断无锁环形共享内存
是否存满,若无锁共享内存存满,则当前读指针地址为:readerc=capacity+(write
c-offset);若无锁共享内存未存满,则当前读指针地址为缓冲区的头部地址;
153.s804、若当前读指针地址和指针偏移地址的差值大于或等于0,则当前读指针地址为:readerc=write
c-offset;
154.其中,readerc为当前读指针地址;capacity为缓冲容量;writerc为当前写指针地址;offset为指定偏移长度。
155.另一方面,本发明实施例还提供了一种基于无锁环形共享内存的通信方法,如图9所示,基于无锁环形共享内存的通信方法包括:
156.s901、通过基于无锁环形共享内存的数据写入方法将数据写入无锁环形共享内存的缓冲区;
157.s902、通过基于无锁环形共享内存的数据读取方法将数据从无锁环形共享内存的缓冲区中读取;
158.其中,基于无锁环形共享内存的数据写入方法为上述基于无锁环形共享内存的数据写入方法实施例中的任意一种基于无锁环形共享内存的数据写入方法,基于无锁环形共享内存的数据读取方法为上述基于无锁环形共享内存的数据读取方法实施例中的任意一种基于无锁环形共享内存的数据读取方法。
159.本发明实施例提供的基于无锁环形共享内存的数据写入、读取、通信方法,当写者写数据时,不做与读指针相关的逻辑判断,只拷贝数据移动写指针,从而确保写数据的及时性和完整性;当读者读数据时,检查读指针与写指针的相对距离即可读取的有效数据长度,进行读数据的合法性及延时性判断,实现读数据的及时性,最终实现读写的实时性。进一步地,单个读者可以从任意合理位置开始读取连续数据而不影响其他读者,实现真正多读者无锁读取效果。
160.本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,计算机程序可存储于计算机可读存储介质中。其中,计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。
161.以上对本发明所提供的基于无锁环形共享内存的数据写入、读取、通信方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1