1.本发明涉及计算机数据通信技术领域,尤其涉及一种基于共享内存的多进程间数据通信方法及装置。
背景技术:
2.近年来,随着计算机技术的不断发展,python(计算机编程语言)受gil(全局解释器锁)的限制,主要采用多进程间数据通信方法来提升计算能力。主流的解决方案是通过pipe管道队列来实现多进程间的数据通信。但这种方法存在弊端,在多个进程创建多个pipe线程进行数据通信时,每个pipe线程都会将数据拷贝一遍,带来巨大的性能损耗,且在获取数据时发生阻塞情况,容易导致数据丢失,难以有效保证数据的安全性和可靠性,提高多进程间数据通信效率。
技术实现要素:
3.为了克服现有技术的缺陷,本发明提供一种基于共享内存的多进程间数据通信方法及装置,能够有效保证数据的安全性和可靠性,提高多进程间的数据通信效率。
4.为了解决上述技术问题,第一方面,本发明的实施例提供一种基于共享内存的多进程间数据通信方法,包括;
5.创建共享内存空间,将所述共享内存空间的地址信息传递给各个所述进程,使各个所述进程均可发起对所述共享内存空间的数据读取/写入请求;
6.响应任一所述进程发起的数据读取/写入请求,在当前所述共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态;
7.若当前所述进程锁的状态为可用状态,则在对所述进程锁进行上锁后执行数据读取/写入操作,在结束执行数据读取/写入操作后对所述进程锁进行解锁。
8.进一步地,所述创建共享内存空间,具体为:
9.初始化一块连续的内存空间作为所述共享内存空间,划分所述共享内存空间,并通过标记所述共享内存空间开头位置和结尾位置的索引,将所述共享内存空间抽象为循环队列。
10.进一步地,在所述响应任一所述进程发起的数据读取/写入请求之后,在所述在当前所述共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态之前,还包括:
11.判断所述共享内存空间是否为空,若否,则判定当前所述共享内存空间的数据存储情况满足所述数据读取条件;或者,
12.判断所述共享内存空间是否写满,若否,则当前判定所述共享内存空间的数据存储情况满足所述数据写入条件。
13.进一步地,所述执行数据读取操作,具体为:
14.根据待读取数据的数据长度和所述共享内存空间开头位置的索引,确定所述共享
内存空间第一目标位置的索引;
15.读取所述共享内存空间开头位置至第一目标位置上的数据,并将所述共享内存空间开头位置的索引更新为所述共享内存空间第一目标位置的索引。
16.进一步地,所述执行数据写入操作,具体包括:
17.获取待写入数据的数据长度,在第一可存储数据的数据长度小于所述待写入数据的数据长度时,计算所述待写入数据的数据长度与所述第一可存储数据的数据长度的差值;其中,所述第一可存储数据的数据长度为所述共享内存空间结尾位置至队尾位置上可存储数据的数据长度;
18.在第二可存储数据的数据长度大于所述差值时,根据所述差值和所述共享内存空间队头位置的索引确定所述共享内存空间第二目标位置的索引;其中,所述第二可存储数据的数据长度为所述共享内存空间队头位置至所述共享内存空间开头位置可存储数据的数据长度;
19.根据所述差值将所述待写入数据切分为第一数据和第二数据,在所述共享内存空间结尾位置至队尾位置上写入所述第一数据,在所述共享内存空间队头位置至第二目标位置上写入所述第二数据,并将所述共享内存空间结尾位置的索引更新为所述共享内存空间第二目标位置的索引。
20.进一步地,所述执行数据写入操作,具体还包括:
21.在所述第一可存储数据的数据长度大于所述待写入数据的数据长度时,根据所述待写入数据的数据长度和所述共享内存空间结尾位置的索引,确定所述共享内存空间第三目标位置的索引;
22.在所述共享内存空间结尾位置至第三目标位置上写入所述待写入数据,并将所述共享内存空间结尾位置的索引更新为所述共享内存空间第三目标位置的索引。
23.进一步地,在所述获取待写入数据的数据长度之前,还包括:
24.对目标写入数据进行封装,得到所述待写入数据。
25.进一步地,所述对目标写入数据进行封装,得到所述待写入数据,具体为:
26.获取所述目标写入数据的标识信息和基本信息,并拼接所述目标写入数据、所述标识信息和所述基本信息,得到中间数据;
27.获取所述中间数据的校验信息,并对所述中间数据和所述校验信息进行拼接后封装,得到所述待写入数据。
28.进一步地,所述标识信息包括所述目标写入数据的开头标识和结尾标识,所述基本信息包括封装版本号、所述目标写入数据的数据长度和数据类型,所述校验信息包括根据所述中间数据的数据结构得到的crc校验码。
29.第二方面,本发明一实施例提供一种基于共享内存的多进程间数据通信装置,包括;
30.共享内存空间创建模块,用于创建共享内存空间,将所述共享内存空间的地址信息传递给各个所述进程,使各个所述进程均可发起对所述共享内存空间的数据读取/写入请求;
31.数据读写请求响应模块,用于响应任一所述进程发起的数据读取/写入请求,在当前所述共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态
是否为可用状态;
32.数据读写操作执行模块,用于若当前所述进程锁的状态为可用状态,则在对所述进程锁进行上锁后执行数据读取/写入操作,在结束执行数据读取/写入操作后对所述进程锁进行解锁。
33.本发明的实施例,具有如下有益效果:
34.通过创建共享内存空间,将共享内存空间的地址信息传递给各个进程,使各个进程均可发起对共享内存空间的数据读取/写入请求,响应任一进程发起的数据读取/写入请求,在当前共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态,若当前进程锁的状态为可用状态,则在对进程锁进行上锁后执行数据读取/写入操作,在结束执行数据读取/写入操作后对进程锁进行解锁,实现多进程间数据通信。相比于现有技术,本发明的实施例通过创建共享内存空间,使得多个进程可实时访问共享内存空间,并利用进程锁的上锁解锁机制,在一个进程对共享内存空间执行数据读取/写入操作时避免其他进程对共享内存空间进行数据读取/写入操作,从而能够有效保证数据的安全性和可靠性,提高多进程间的数据通信效率。
35.进一步地,通过将共享内存空间抽象为循环队列,能够重复利用同一共享内存空间执行读写操作,无需多次创建共享内存空间。
36.进一步地,通过对目标写入数据进行额外信息的封装,添加目标写入数据的开头标识和结尾标识、目标写入数据的数据长度和数据类型、中间数据的crc校验码等,能够保证写入共享内存空间的数据可被安全、完整地读取出来。
附图说明
37.图1为本发明第一实施例中的一种基于共享内存的多进程间数据通信方法的流程示意图;
38.图2为本发明第一实施例中示例的对共享内存空间执行数据读取/写入操作的示意图;
39.图3为本发明第一实施例中示例的待写入数据的数据结构示意图;
40.图4为本发明第二实施例中的一种基于共享内存的多进程间数据通信装置的结构示意图。
具体实施方式
41.下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
42.需要说明的是,文中的步骤编号,仅为了方便具体实施例的解释,不作为限定步骤执行先后顺序的作用。本实施例提供的方法可以由相关的终端设备执行,且下文均以处理器作为执行主体为例进行说明。
43.如图1所示,第一实施例提供一种基于共享内存的多进程间数据通信方法,包括步骤s1~s3;
44.s1、创建共享内存空间,将共享内存空间的地址信息传递给各个进程,使各个进程均可发起对共享内存空间的数据读取/写入请求;
45.s2、响应任一进程发起的数据读取/写入请求,在当前共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态;
46.s3、若当前进程锁的状态为可用状态,则在对进程锁进行上锁后执行数据读取/写入操作,在结束执行数据读取/写入操作后对进程锁进行解锁。
47.作为示例性地,在步骤s1中,创建共享内存空间,创建的时候需要保证这块共享内存空间是独属于运行软件可用,不会被其他软件影响,创建后返回共享内存空间的地址信息,将共享内存空间的地址信息,也就是地址id作为进程参数传递给各个进程,使得各个进程均可根据共享内存空间的地址信息,实时访问共享内存空间,发起对共享内存空间的数据读取/写入请求。
48.各个进程也可获取共享内存空间的内存空间大小、可读取数据大小、可写入空间大小等相关信息。
49.在步骤s2中,当接收到任一进程发起的数据读取/写入请求时,响应该进程的数据读取/写入请求,判断当前共享内存空间的数据存储情况是否满足数据读取/写入条件,相当于确认此时是否可从共享内存空间中读取数据,或者是否可在共享内存空间中写入数据,若是,则认为当前共享内存空间的数据存储情况满足数据读取/写入条件,否则认为当前共享内存空间的数据存储情况不满足数据读取/写入条件。
50.在判定当前共享内存空间的数据存储情况不满足数据读取/写入条件时,将该进程的数据读取/写入请求挂起,并实时或定时判断当前共享内存空间的数据存储情况是否满足数据读取/写入条件。
51.在判定当前共享内存空间的数据存储情况满足数据读取/写入条件时,继续判断当前进程锁的状态是否为可用状态,相当于确认此时是否有其他进程对共享内存空间进行数据读取/写入操作,若没有,则认为当前进程锁的状态为可用状态,否则认为进程锁的状态为不可用状态。
52.在判定进程锁的状态为不可用状态时,将该进程的数据读取/写入请求挂起,并实时或定时判断当前进程锁的状态是否为可用状态。
53.在步骤s3中,在判定进程锁的状态为可用状态时,对进程锁进行上锁,在上锁成功后对共享内存空间执行数据读取/写入操作,在结束执行数据读取/写入操作后对进程锁进行解锁,以在该进程对共享内存空间进行数据读取/写入操作时,避免其他进程对共享内存空间进行数据读取/写入操作,在该进程结束执行对共享内存空间的数据读取/写入操作后,使其他进程也可对共享内存空间进行数据读取/写入操作。
54.当多个进程进行竞争时,一旦某个进程先完成上锁操作,其他进程将进入等待流程。
55.本实施例通过创建共享内存空间,使得多个进程可实时访问共享内存空间,并利用进程锁的上锁解锁机制,在一个进程对共享内存空间执行数据读取/写入操作时避免其他进程对共享内存空间进行数据读取/写入操作,从而能够有效保证数据的安全性和可靠性,提高多进程间的数据通信效率。
56.在优选的实施例当中,所述创建共享内存空间,具体为:初始化一块连续的内存空
间作为共享内存空间,划分共享内存空间,并通过标记共享内存空间开头位置和结尾位置的索引,将共享内存空间抽象为循环队列。
57.可以理解的是,队列是一种先进先出(fifo)的数据结构。
58.作为示例性地,初始化一块连续的内存空间作为共享内存空间,根据预设长度划分共享内存空间,相当于将共享内存空间划分为多个长度相同的共享内存子空间,并通过标记共享内存空间开头位置和结尾位置的索引,将共享内存空间抽象为循环队列。
59.本实施例通过将共享内存空间抽象为循环队列,能够重复利用同一共享内存空间执行读写操作,无需多次创建共享内存空间。
60.在优选的实施例当中,在所述响应任一进程发起的数据读取/写入请求之后,在所述在当前共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态之前,还包括:判断共享内存空间是否为空,若否,则判定当前共享内存空间的数据存储情况满足数据读取条件;或者,判断共享内存空间是否写满,若否,则当前判定共享内存空间的数据存储情况满足数据写入条件。
61.在本实施例的一优选实施方式中,根据共享内存空间开头位置和结尾位置的索引,判断共享内存空间是否为空。
62.在本实施例的一优选实施方式中,根据共享内存空间开头位置和结尾位置的索引,以及待写入数据的数据长度,判断共享内存空间是否写满。
63.作为示例性地,共享内存空间开头位置的索引为head(read index),共享内存空间结尾位置的索引为tail(write index),共享内存空间,即循环队列总长度为n。待写入数据的数据长度为write length。
64.当循环队列里面的head==tail的时候,可判定循环队列为空。当循环队列里面的tail与write length的和大于循环队列队尾位置的索引时,通过(tail write length)%n求得溢出循环队列的数据长度,然后计算溢出的数据长度是否大于head位置,以此判断是否循环队列是否已写满。
65.在优选的实施例当中,所述执行数据读取操作,具体为:根据待读取数据的数据长度和共享内存空间开头位置的索引,确定共享内存空间第一目标位置的索引;读取共享内存空间开头位置至第一目标位置上的数据,并将共享内存空间开头位置的索引更新为共享内存空间第一目标位置的索引。
66.在优选的实施例当中,所述执行数据写入操作,具体包括:获取待写入数据的数据长度,在第一可存储数据的数据长度小于待写入数据的数据长度时,计算待写入数据的数据长度与第一可存储数据的数据长度的差值;其中,第一可存储数据的数据长度为共享内存空间结尾位置至队尾位置上可存储数据的数据长度;在第二可存储数据的数据长度大于差值时,根据差值和共享内存空间队头位置的索引确定共享内存空间第二目标位置的索引;其中,第二可存储数据的数据长度为共享内存空间队头位置至共享内存空间开头位置可存储数据的数据长度;根据差值将待写入数据切分为第一数据和第二数据,在共享内存空间结尾位置至队尾位置上写入第一数据,在共享内存空间队头位置至第二目标位置上写入第二数据,并将共享内存空间结尾位置的索引更新为共享内存空间第二目标位置的索引。
67.在优选的实施例当中,所述执行数据写入操作,具体还包括:在第一可存储数据的
数据长度大于待写入数据的数据长度时,根据待写入数据的数据长度和共享内存空间结尾位置的索引,确定共享内存空间第三目标位置的索引;在共享内存空间结尾位置至第三目标位置上写入待写入数据,并将共享内存空间结尾位置的索引更新为共享内存空间第三目标位置的索引。
68.作为示例性地,如图2所示,总字节长度为10的循环队列,head、tail跟length都为“0”,循环队列为空。
69.首先,从“0”开始依次写入3个字节的数据和4个字节的数据,tail索引移到了“6”,length为7。然后,取出第一次写入的3个字节的数据,那么head索引从“0”移到了“3”。接着,写入5个字节的数据,由于tail索引为“6”,6 5>9,此时会溢出共享内存空间队尾位置的索引“9”,需要切分数据来分别存放到队尾跟空闲出来的队头空间。通过(tail write length)%n的计算公式,也就是(6 5)%10求余数,求得切分后的溢出长度为1个字节,此时距离head索引“3”还有足够的空间可写入剩余1个字节的数据。
70.在执行数据写入操作的时候,通过模运算判断共享内存空间是否已到达队尾位置,在到达队尾位置且队头位置具有可存放空间的情况下对数据进行切分,并将剩余的数据存到开头索引位置。同理可用头尾衔接的方式来读取数据。
71.为了在读取的时候能快速完整地取出数据,还对数据的存储结构进行了优化,每存一个数据,保留(4-6)位的头部信息结构,存储数据的数据长度。在读取数据时先取出头部数据,解析出来需要读取的数据长度,然后按开头位置的索引进行取出相应长度的数据进行返回,并更新开头位置的索引,这样的话就相当于将共享内存空间标记为空闲状态。
72.本实施例采用索引标记算法将共享内存空间抽象成循环队列,有利于最大化利用共享内存空间,有效保证数据的安全性和可靠性,提高多进程间的数据通信效率。
73.在优选的实施例当中,在所述获取待写入数据的数据长度之前,还包括:对目标写入数据进行封装,得到待写入数据。
74.在优选的实施例当中,所述对目标写入数据进行封装,得到所述待写入数据,具体为:获取所述目标写入数据的标识信息和基本信息,并拼接所述目标写入数据、所述标识信息和所述基本信息,得到中间数据;获取所述中间数据的校验信息,并对所述中间数据和所述校验信息进行拼接后封装,得到所述待写入数据。
75.在本实施例的一优选实施方式中,标识信息包括目标写入数据的开头标识和结尾标识,基本信息包括封装版本号、目标写入数据的数据长度和数据类型,校验信息包括根据中间数据的数据结构得到的crc校验码。
76.作为示例性地,定义目标写入数据的开头标识和结尾标识,记录封装方法的版本号、目标写入数据的数据长度和数据类型,将这些信息与目标写入数据进行拼接得到中间数据,对中间数据的整个数据结构进行crc校验码计算,并添加到中间数据中,封装得到待写入数据。待写入数据的数据结构如图3所示。
77.本实施例通过对目标写入数据进行额外信息的封装,添加目标写入数据的开头标识和结尾标识、目标写入数据的数据长度和数据类型、中间数据的crc校验码等,能够保证写入共享内存空间的数据可被安全、完整地读取出来。
78.基于与第一实施例相同的发明构思,第二实施例提供如图4所示的一种基于共享内存的多进程间数据通信装置,包括;共享内存空间创建模块21,用于创建共享内存空间,
将共享内存空间的地址信息传递给各个进程,使各个进程均可发起对共享内存空间的数据读取/写入请求;数据读写请求响应模块22,用于响应任一进程发起的数据读取/写入请求,在当前共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态;数据读写操作执行模块23,用于若当前进程锁的状态为可用状态,则在对进程锁进行上锁后执行数据读取/写入操作,在结束执行数据读取/写入操作后对进程锁进行解锁。
79.在优选的实施例当中,共享内存空间创建模块21包括创建单元;创建单元,用于初始化一块连续的内存空间作为共享内存空间,划分共享内存空间,并通过标记共享内存空间开头位置和结尾位置的索引,将共享内存空间抽象为循环队列。
80.在优选的实施例当中,数据读写请求响应模块22,还用于在所述响应任一进程发起的数据读取/写入请求之后,在所述在当前共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态之前,判断共享内存空间是否为空,若否,则判定当前共享内存空间的数据存储情况满足数据读取条件;或者,判断共享内存空间是否写满,若否,则当前判定共享内存空间的数据存储情况满足数据写入条件。
81.在优选的实施例当中,数据读写操作执行模块23包括读取单元;读取单元,用于根据待读取数据的数据长度和共享内存空间开头位置的索引,确定共享内存空间第一目标位置的索引;读取共享内存空间开头位置至第一目标位置上的数据,并将共享内存空间开头位置的索引更新为共享内存空间第一目标位置的索引。
82.在优选的实施例当中,数据读写操作执行模块23包括写入单元;写入单元,用于获取待写入数据的数据长度,在第一可存储数据的数据长度小于待写入数据的数据长度时,计算待写入数据的数据长度与第一可存储数据的数据长度的差值;其中,第一可存储数据的数据长度为共享内存空间结尾位置至队尾位置上可存储数据的数据长度;在第二可存储数据的数据长度大于差值时,根据差值和共享内存空间队头位置的索引确定共享内存空间第二目标位置的索引;其中,第二可存储数据的数据长度为共享内存空间队头位置至共享内存空间开头位置可存储数据的数据长度;根据差值将待写入数据切分为第一数据和第二数据,在共享内存空间结尾位置至队尾位置上写入第一数据,在共享内存空间队头位置至第二目标位置上写入第二数据,并将共享内存空间结尾位置的索引更新为共享内存空间第二目标位置的索引。
83.在优选的实施例当中,写入单元,还用于在第一可存储数据的数据长度大于待写入数据的数据长度时,根据待写入数据的数据长度和共享内存空间结尾位置的索引,确定共享内存空间第三目标位置的索引;在共享内存空间结尾位置至第三目标位置上写入待写入数据,并将共享内存空间结尾位置的索引更新为共享内存空间第三目标位置的索引。
84.在优选的实施例当中,数据读写操作执行模块23包括封装单元;封装单元,用于在所述获取待写入数据的数据长度之前,对目标写入数据进行封装,得到所述待写入数据。
85.在优选的实施例当中,封装单元,具体用于获取目标写入数据的标识信息和基本信息,并拼接目标写入数据、标识信息和基本信息,得到中间数据;获取中间数据的校验信息,并对中间数据和校验信息进行拼接后封装,得到待写入数据。
86.在本实施例的一优选实施方式中,标识信息包括目标写入数据的开头标识和结尾标识,基本信息包括封装版本号、目标写入数据的数据长度和数据类型,校验信息包括根据
中间数据的数据结构得到的crc校验码。
87.综上所述,实施本发明的实施例,具有如下有益效果:
88.通过创建共享内存空间,将共享内存空间的地址信息传递给各个进程,使各个进程均可发起对共享内存空间的数据读取/写入请求,响应任一进程发起的数据读取/写入请求,在当前共享内存空间的数据存储情况满足数据读取/写入条件时,判断当前进程锁的状态是否为可用状态,若当前进程锁的状态为可用状态,则在对进程锁进行上锁后执行数据读取/写入操作,在结束执行数据读取/写入操作后对进程锁进行解锁,实现多进程间数据通信。本发明的实施例通过创建共享内存空间,使得多个进程可实时访问共享内存空间,并利用进程锁的上锁解锁机制,在一个进程对共享内存空间执行数据读取/写入操作时避免其他进程对共享内存空间进行数据读取/写入操作,从而能够有效保证数据的安全性和可靠性,提高多进程间的数据通信效率。
89.进一步地,通过将共享内存空间抽象为循环队列,能够重复利用同一共享内存空间执行读写操作,无需多次创建共享内存空间。
90.进一步地,通过对目标写入数据进行额外信息的封装,添加目标写入数据的开头标识和结尾标识、目标写入数据的数据长度和数据类型、中间数据的crc校验码等,能够保证写入共享内存空间的数据可被安全、完整地读取出来。
91.以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。
92.本领域普通技术人员可以理解实现上述实施例中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-only memory,rom)或随机存储记忆体(random access memory,ram)等。
转载请注明原文地址:https://tc.8miu.com/read-170.html