[go: up one dir, main page]

CN118860697B - 一种进程通信方法、装置及电子设备 - Google Patents

一种进程通信方法、装置及电子设备 Download PDF

Info

Publication number
CN118860697B
CN118860697B CN202411328761.XA CN202411328761A CN118860697B CN 118860697 B CN118860697 B CN 118860697B CN 202411328761 A CN202411328761 A CN 202411328761A CN 118860697 B CN118860697 B CN 118860697B
Authority
CN
China
Prior art keywords
shared memory
variable
array
lock
access
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
Application number
CN202411328761.XA
Other languages
English (en)
Other versions
CN118860697A (zh
Inventor
刘长鑫
杜佳伟
潘朝松
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Suzhou Lianxun Instrument Co ltd
Original Assignee
Suzhou Lianxun Instrument Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Suzhou Lianxun Instrument Co ltd filed Critical Suzhou Lianxun Instrument Co ltd
Priority to CN202411328761.XA priority Critical patent/CN118860697B/zh
Publication of CN118860697A publication Critical patent/CN118860697A/zh
Application granted granted Critical
Publication of CN118860697B publication Critical patent/CN118860697B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/524Deadlock detection or avoidance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multi Processors (AREA)

Abstract

本申请提供的一种进程通信方法、装置及电子设备,活动进程根据已分配共享内存的当前访问状态,获取对已分配共享内存的访问资格;从已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;从数组成员变量中确定活动进程对应的数据位,并将数据位存储的数值设置为表征活动进程所作访问对应锁状态的数值,来为目标共享内存上锁;其中,进程锁数组变量的数组成员变量分别用于存储各已分配共享内存的访问进程的锁状态;进程锁数组变量为原子变量且设置于共享内存核心区;已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;共享内存核心区和共享内存用户区均设置于用户空间。缩短了通信时间,提高了通信效率。

Description

一种进程通信方法、装置及电子设备
技术领域
本申请涉及计算机技术领域,尤其涉及一种进程通信方法、装置及电子设备。
背景技术
在仪器仪表的使用场景中,经常会存在多个客户端的需求,即需要一个客户端(作为控制端)进行对仪器的控制,而另一个或多个客户端(作为监控端)仅同步对当前仪器的配置以及信息。但是往往连接仪器的链路只有一条,因此只能尝试通过进程间通信的方式将控制端的内存数据同步到监控端。
目前基础的多进程通信方法主要包括:TCP、UDP、管道、共享内存、信号、信号量、消息队列等。考虑到通信效率,在以上几种进程间通信的方法中,仅共享内存适用。目前的共享内存接口主要包括POSIX共享内存、Windows共享内存、进一步封装的Boost共享内存以及Nginx的共享内存模块。
POSIX共享内存适用于Linux开发,而Windows共享内存适用于Windows环境开发,Boost的共享内存在两者基础上进行封装,从而能够支持多平台。以上几种方案都为最基础的函数实现,在后续使用中都要做更多的业务方法实现。Nginx与以上几种相比,在实现了更高性能的进程锁条件下,同时实现了基于共享内存的事件收发,但是仍然未能满足要求。主要体现在对进程锁的限制。具体地,为了避免数据竞争和不一致性,不可避免的需要用到锁,但是基础的共享内存不支持进程锁;而Boost封装的共享内存的进程读写锁实际上还是采用了信号量,上锁与解锁耗时额外开销要接近毫秒(ms)级别;而Nginx的进程锁不支持读写锁类型。
发明内容
本申请实施例提供了一种进程通信方法、装置及电子设备,用以解决现有的共享内存通信方法通信效率低的问题。
基于上述问题,第一方面,提供一种进程通信方法,包括:
活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格;
从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;
从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问;
其中,所述进程锁数组变量的数组成员变量分别用于存储所述各已分配共享内存的访问进程的锁状态;所述进程锁数组变量为原子变量且设置于所述共享内存核心区;所述已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;所述共享内存核心区和所述共享内存用户区均设置于用户空间。
结合第一方面,在一种可能的实施方式中,活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格,包括:依次遍历内存访问状态数组变量的各数组成员;在确定任一数组成员对应存储的数值表征对应访问资格未被占用的情况下,将该数值修改为表征对应访问资格被占用;在修改成功的情况下,确定所述活动进程获得对所述已分配共享内存的访问资格;在修改不成功的情况下,继续遍历所述内存访问状态数组变量的数组成员;其中,所述内存访问状态数组变量用于存储对所述已分配共享内存的访问资格的分配情况;所述内存访问状态数组变量为原子变量且设置于所述共享内存核心区;所述内存访问状态数组变量的数组成员数量表征允许并行访问所述已分配共享内存的进程的最大数量。
结合第一方面,在一种可能的实施方式中,在所述活动进程获得对所述已分配共享内存的访问资格之后,还包括:将数值被修改为表征对应访问资格被占用的数组成员在所述内存访问状态数组变量中的序号,确定为所述活动进程的标识号。
结合第一方面,在一种可能的实施方式中,所述活动进程包括写进程;所述写进程获取到所述访问资格之后,还包括:获取对所述目标共享内存执行写入操作的权限,包括:从读写权限数组变量中获取所述目标共享内存对应成员存储的第一进程号;确定所述第一进程号是否为所述写进程的第二进程号;若是,则确定获取到对所述目标共享内存执行写入操作的权限;若否,则将所述第一进程号替换为所述第二进程号;在将所述第一进程号替换为所述第二进程号不成功的情况下,返回获取所述目标共享内存对应成员存储的第一进程号的步骤;其中,所述读写权限数组变量用于存储对对应共享内存具有写入权限的进程的进程号;所述读写权限数组变量为原子变量且设置于所述共享内存核心区;所述读写权限数组变量的数组成员数量表征能够申请的共享内存的最大数量。
结合第一方面,在一种可能的实施方式中,所述活动进程包括写进程;在为所述目标共享内存上锁之前,还包括:读取所述进程锁数组变量中,所述目标共享内存对应的数组成员变量的当前值;并根据所述当前值确定不存在进程正在读取所述目标共享内存;其中,所述进程锁数组变量的成员数量表征允许分配共享内存的最大数量;每个共享内存支持的并行访问该共享内存的最大进程数量根据所述活动进程运行所在操作系统支持的最大位数,以及表征多个锁状态需要的数据位数确定。
结合第一方面,在一种可能的实施方式中,采用如下方式确定当前是否存在进程正在读取所述目标共享内存:将所述数组成员变量的当前值与预设掩码执行按位相与操作;所述预设掩码通过将进程锁数组变量的数组成员变量中每个数据位的值设置为读锁的数值得到;在相与结果为零的情况下,确定不存在进程正在读取所述目标共享内存。
结合第一方面,在一种可能的实施方式中,从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量,包括:从所述进程锁数组变量中,确定以为所述目标共享内存分配的标识序号作为数组成员序号的数组成员变量;所述活动进程包括写进程;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问,包括:根据为所述活动进程分配的标识号及表征锁状态数据位的位数,确定所述活动进程对应数据位在所述数组成员变量中的偏移量;根据所述偏移量确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为写锁的数值,来为所述目标共享内存上写锁,并将共享数据写入所述目标共享内存;和/或
所述活动进程包括读进程;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问,包括:根据为所述活动进程分配的标识号及表征锁状态数据位的位数,确定所述活动进程对应数据位在所述数组成员变量中的偏移量;根据所述偏移量确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为读锁的数值,来为所述目标共享内存上读锁,并对所述目标共享内存进行读取。
结合第一方面,在一种可能的实施方式中,所述活动进程包括读进程;所述读进程包括多个线程;从所述已分配共享内存对应的进程锁数组变量中,确定所述目标共享内存对应的数组成员变量,包括:在所述多个线程中首个线程需要进行读操作的情况下,从所述进程锁数组变量中,确定所述目标共享内存对应的数组成员变量;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问,包括:从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为读锁的数值,来为所述目标共享内存上读锁,并对所述目标共享内存进行读取;
所述方法还包括:确定读锁计数数组变量中,为所述读进程进行读锁计数的计数数组成员,并在所述计数数组成员记录单位数值;在所述多个线程中非首个线程需要进行读操作的情况下,在所述计数数组成员按照所述单位数值对读取所述目标共享内存的线程数量进行累计;在所述多个线程中任一线程完成读取之后,将所述计数数组成员的计数减掉单位数值;在所述计数数组成员的计数减为零的情况下,将所述进程锁数组变量中对应数据位存储的数值设置表征锁状态为未上锁的数值;其中,所述读锁计数数组变量表征对对应共享内存具有访问资格的各进程当前访问该对应共享内存的线程的数量;所述读锁计数数组变量的成员数量表征允许分配共享内存的最大数量。
结合第一方面,在一种可能的实施方式中,所述方法还包括:按照预设时间间隔对修改成功的成员所存储的数值进行自增计数;采用如下方式对非活动进程进行清理:依次遍历所述内存访问状态数组变量的各成员,在每次遍历中执行如下操作:确定各成员存储的数值与上次遍历相比是否相同;若相同,则累计对应成员被判相同的次数;确定累计的次数是否达到预设次数;若是,则将对应成员存储的数值修改为表征对应访问资格未被占用;在修改成功的情况下,确定对应成员存储数值表征的目标进程;将所述目标进程在所述进程锁数组变量中对应的锁状态设置为未上锁;在所示目标进程为写进程的情况下,将所述目标进程在读写权限数组变量中对应存储的进程号清除。
结合第一方面,在一种可能的实施方式中,所述活动进程包括写进程;所述写进程采用如下方式将共享数据写入目标共享内存:确定所述共享数据在所述目标共享内存中的写入偏移量;按照所述写入偏移量将所述共享数据写入所述目标共享内存,并将当前写入偏移量更新;按照写入共享数据的单位数量,为写索引变量赋值;其中,所述写入偏移量、写入数据大小、以及写索引存储在所述共享内存用户区;
所述活动进程包括读进程;所述读进程采用如下方式读取目标共享内存:获取当前写索引变量的值以及读索引变量的值;在所述写索引变量的值和所述读索引变量的值不一致,且所述读索引变量有效的情况下,按照所述写入偏移量及所述写索引变量表征的单位数据量读取所述共享数据;并对所述读索引变量的数值进行更新。
结合第一方面,在一种可能的实施方式中,所述活动进程包括作为写进程的控制端进程,以及作为读进程的多个监控端进程。
第二方面,提供一种进程通信装置,包括:
访问资格获取模块,用于活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格;
上锁模块,用于从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问;
其中,所述进程锁数组变量的数组成员变量分别用于存储所述各已分配共享内存的访问进程的锁状态;所述进程锁数组变量为原子变量且设置于所述共享内存核心区;所述已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;所述共享内存核心区和所述共享内存用户区均设置于用户空间。
第三方面,提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行如第一方面,或者结合第一方面的任一种可能的实施方式所述的进程通信方法的步骤。
第四方面,提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如第一方面,或者结合第一方面的任一种可能的实施方式所述的进程通信方法的步骤。
本申请实施例的有益效果包括:
本申请实施例提供的一种进程通信方法、装置及电子设备。本申请实施例提供的进程通信方法,为共享内存的访问设置了用于上锁的进程锁数组变量,并将进程锁数组变量设置于共享内存核心区,将共享内存设置于共享内存用户区,由于共享内存核心区和所述共享内存用户区均设置于用户空间,不但实现了区域功能划分,还使得活动进程能够不通过与系统内核的交互,即可在用户空间通过进程锁数组变量对进程锁进行设置,与相关技术中共享内存不支持进程锁,或者支持的进程锁实质采用信号量相比,缩短了通信时间,提高了通信效率;并且本申请实施例将进程锁数组变量设置为原子变量,使得活动进程对进程锁数组变量的操作为原子操作,进一步提高了上锁操作的执行效率和安全性。
附图说明
图1为本申请实施例提供的一种进程通信方法的流程图之一;
图2为本申请实施例提供的共享内存区域划分示意图;
图3为本申请实施例提供的一种进程通信方法的流程图之二;
图4为本申请实施例提供的内存访问状态数组变量使用示意图;
图5为本申请实施例提供的一种进程通信方法的流程图之三;
图6为本申请实施例提供的读写权限数组变量示意图;
图7为本申请实施例提供的进程锁数组变量示意图之一;
图8为本申请实施例提供的进程锁数组变量示意图之二;
图9为本申请实施例提供的多个线程访问共享内存的示意图;
图10为本申请实施例提供的一种进程通信方法的流程图之四;
图11为本申请实施例提供的一种进程通信装置结构示意图之一;
图12为本申请实施例提供的一种进程通信装置结构示意图之二;
图13为本申请实施例提供的一种电子设备结构示意图。
具体实施方式
本申请实施例提供了一种进程通信方法、装置及电子设备,以下结合说明书附图对本申请的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本申请,并不用于限定本申请。并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
本申请实施例提供一种进程通信方法,如图1所示,包括:
S101、活动进程根据已分配共享内存的当前访问状态,获取对已分配共享内存的访问资格;
S102、从已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;
S103、从数组成员变量中确定活动进程对应的数据位,并将该数据位存储的数值设置为表征活动进程所作访问对应锁状态的数值,来为目标共享内存上锁,并对目标共享内存进行访问;
其中,进程锁数组变量的数组成员变量分别用于存储各已分配共享内存的访问进程的锁状态;进程锁数组变量为原子变量且设置于共享内存核心区;已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;共享内存核心区和共享内存用户区均设置于用户空间。
本申请实施例中,可以由用户对共享内存进行申请,采用相关技术进行共享内存的创建,本申请实施例在共享内存的使用中,可以将共享内存划分为两种类型:共享内存的核心区和共享内存的用户区。共享内存的核心区主要用于内存管理,包括共享内存资源的分配和回收,进程锁的管理回收、共享内存用户区的访问权限管理等。共享内存的用户区主要用于用户实现数据传输或消息队列。用户使用时无法直接访问共享内存核心区,但可以为用户提供应用程序编程接口(API,Application Programming Interface)对共享内存核心区的相关变量进行操作,以避免用户误操作导致内存管理异常。实施时,可以通过不同的地址空间对共享内存的核心区和用户区进行划分,也可以通过设置不同访问权限对共享内存的核心区和用户区进行划分,这里并不限制。
进一步地,本申请实施例中将共享内存的核心区和共享内存的用户区均设置于用户空间。通常操作系统为了提高稳定性和安全性,会设置内核空间和用户空间,内核空间是操作系统的核心,用户空间是应用程序的运行环境。如前述,相关技术中共享内存的进程读写锁实际上还是采用了信号量,而信号量的使用需要应用程序对内核空间进行访问,这就比对用户空间进行访问流程更复杂,耗时更多,造成通信效率低下。因此,本申请实施例在用户空间设置共享内存的核心区和共享内存的用户区,既实现了共享内存区域的功能划分,在对共享内存上锁时又避免了对内核空间的访问,提高了进程间的通信效率。
另外,本申请实施例中,可以为已分配共享内存对应设置进程锁数组变量,每个共享内存对应其中的一个数组成员变量,以对对应共享内存的进程锁进行存储。进程锁数组变量实施时可以设置为数组的数据类型(例如:整型数组,则数组成员变量为整型,这里并不限制),数组成员变量的数量可以根据允许分配共享内存的最大数量进行设置,这样每个数组成员变量可以存储访问对应共享内存的进程设置的进程锁状态数值,即通过数组成员变量的数据位存储访问进程的锁状态数值。活动进程通过进程锁数组变量中对应数组成员变量为目标共享内存上锁时,只需对该数组成员变量进行读取,确定该数组成员变量中活动进程对应的数据位,并为该数据位设置表征锁状态的数值即完成上锁操作。可见,进程锁数组变量为原子变量,活动进程对进程锁数组变量的操作属于原子操作(读取数组变量并对成员赋值),进一步提高了上锁操作的执行效率和安全性。
实施时,可以在分配目标共享内存时为该目标共享内存分配一个标识序号,并且将进程锁数组变量中数组成员序号与标识序号相同的数组成员变量分配给目标共享内存,来存储访问该目标共享内存的进程为该目标共享内存上锁的锁状态数值,即将步骤S102实施为:从进程锁数组变量中,确定以为目标共享内存分配的标识序号作为数组成员序号的数组成员变量;或者,在分配共享内存时直接确定当前进程锁数组变量中尚未对应有共享内存的数组成员变量,与该分配的共享内存对应,并记录该对应关系,则步骤S102可以实施为:根据分配目标共享内存时建立的目标共享内存与进程锁数组变量中数组成员变量之间的对应关系,确定目标共享内存对应的数组成员变量。
进一步地,在对进程锁数组变量进行读写操作之前,还需要获得对共享内存用户区进行访问的访问资格。本申请实施例提供的进程通信方法,旨在实现多进程并行对共享内存用户区的高效访问,为了便于管理,需要首先根据当前已分配共享内存的访问状态,对已分配共享内存的访问资格进行限制。已分配共享内存的当前访问状态可以通过当前访问进程数量、已分配共享内存数量与当前访问进程数量比例等进行评估,这里并不限制。
图2为本申请实施例提供的共享内存区域划分示意图。如图2所示,将共享内存划分为共享内存核心区201和共享内存用户区202。用户在需要时可以向共享内存核心区201进行共享内存的申请,图2中以申请了N片共享内存为例。进程1至进程N可以对共享内存用户区202的共享内存执行读写操作,对共享内存核心区执行预设原子操作(例如:通过进程锁数组变量为待访问共享内存上锁等)。另外,共享内存的数量上限可以根据实际情况进行设置(例如:32块),这里并不限制。
以Win10 X64&&Ubuntu 64的开发环境,采用基础API:boost::interprocess实施本申请为例,boost提供了共享内存一些基础接口,例如:共享内存创建、共享内存变量创建、删除共享内存等。另外,boost也提供共享内存原子操作,可以在共享内存中申请一个原子变量,该原子变量可以在多进程的情况下安全的被共享和操作,而无需额外的进程锁或信号量,可以有效的减少多进程下的数据竞争与死锁问题,并且能够进一步提升函数执行速度。
在本申请提供的又一实施例中,如图3所示,上述步骤S101“活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格”,可实施为如下步骤:
S301、依次遍历内存访问状态数组变量的各数组成员;
S302、判断是否存在任一数组成员对应存储的数值表征对应访问资格未被占用;若存在,进入步骤S303;若不存在,进入步骤S301;
S303、在确定任一数组成员对应存储的数值表征对应访问资格未被占用的情况下,将该数值修改为表征对应访问资格被占用;
S304、判断是否修改成功;若修改成功,进入步骤S305;若修改不成功,进入步骤S306;
S305、在修改成功的情况下,确定活动进程获得对所述已分配共享内存的访问资格;本流程结束。
S306、在修改不成功的情况下,继续遍历内存访问状态数组变量的数组成员。
其中,内存访问状态数组变量用于存储对已分配共享内存的访问资格的分配情况;内存访问状态数组变量为原子变量且设置于共享内存核心区;内存访问状态数组变量的数组成员数量表征允许并行访问已分配共享内存的进程的最大数量。
本申请实施例中,共享内存核心区采用了原子变量为各进程对已分配共享内存的访问进行管理。主要包括上述的用于对进程锁进行管理的进程锁数组变量、用于对访问资格进行管理的内存访问状态数组变量、以及后面要介绍的用于对写入权限进行管理的读写权限数组变量。
内存访问状态数组变量主要用于存储对已分配共享内存的访问资格的分配情况。活动进程在访问任一共享内存之前均需要首先获取对已分配共享内存的访问资格。实施时,可以依次遍历内存访问状态数组变量的各数组成员,若存在任一数组成员对应存储的值(例如:数值0)表征对应访问资格未被占用,则可以将该值修改为表征对应访问资格已被占用的值(例如:数值1)。由于可能存在多个活动进程同时对访问资格进行抢占,而对内存访问状态数组变量的操作又是原子操作,可能存在数值修改不成功的情况。在修改不成功的情况下,活动进程需要继续遍历内存访问状态数组变量的数组成员,在遍历剩余数组成员之后仍未获得访问资格的情况下,还可以回到步骤S301循环遍历内存访问状态数组变量的数组成员,直到找到表征对应访问资格未被占用的数组成员,并成功将其值修改。上述步骤S302和S303为原子操作。
内存访问状态数组变量的数组成员数量可以表征允许并行访问已分配共享内存的进程的最大数量。获得访问资格的进程可以访问指定共享内存,也可以访问已分配所有共享内存,可以根据实际需要进行设置。为了便于管理,实现高效的并行访问,可以通过对内存访问状态数组变量的数组成员数量的设置来限制并行访问已分配共享内存的进程数量。
在本申请提供的又一实施例中,在上述步骤S305执行之后,即在活动进程获得对已分配共享内存的访问资格之后,还可以包括如下步骤:
将数值被修改为表征对应访问资格被占用的数组成员,在内存访问状态数组变量中的序号,确定为活动进程的标识号。
本申请实施例中,为了便于对获得共享内存访问资格的进程进行管理,可以将活动进程获取到访问资格时在内存访问状态数组变量中对应数组成员的序号确定为活动进程的标识号。本步骤的执行主体可以为活动进程也可以为共享内存核心区的管理进程,这里并不限制。
在本申请提供的又一实施例中,在上述步骤S305执行之后,即在活动进程获得对已分配共享内存的访问资格之后,还可以包括如下步骤:
按照预设时间间隔对修改成功的成员所存储的数值进行自增计数。
本申请实施例中,内存访问状态数组变量还可以表征当前访问共享内存的活动状态。在活动进程获取到访问资格,并将对应数组成员的值修改为表征对应访问资格被占用的数值(例如:数值1)之后,为了表示活动进程后续的活动状态,可以使得活动进程按照预设时间间隔对修改成功的成员所存储的数值进行自增计数。例如,每间隔1s自增单位数量(如数值1),那么通过检查各数组成员存储数值的自增情况,即可知晓对应活动进程的活动状态。
图4为本申请实施例提供的内存访问状态数组变量使用示意图。如图4所示,假设内存访问状态数组变量的类型设置为原子变量(atomic)32位整型(int32)数组,包括32个数组成员(数组成员序号从0至31)。进程A(进程号(PID,Process Identification)为1456)通过序号为0的数组成员获得访问资格,则将序号0作为标识号分配给进程A。进程B(进程号PID为1578)通过序号为1的数组成员获得访问资格,则将序号1作为标识号分配给进程B。同理,进程C(进程号PID为1264)通过序号为2的数组成员获得访问资格,则将序号2作为标识号分配给进程C。以数值0表征未占用访问资格为例,进程A、进程B、和进程C分别对应的数组成员值0、0、0表征正在为进程分配标识号,数组成员值23、43、和87分别表征使用共享内存的进程的活动状态,第6-31个数组成员0表征尚未分配的数组成员。图4中实线箭头表征为进程分配当前可用的标识号资源,虚线箭头表征数组成员存储值周期性自增。
在本申请提供的又一实施例中,活动进程包括写进程;则在写进程执行完上述步骤S305,获取到所述访问资格之后,还可以执行如下步骤:
获取对目标共享内存执行写入操作的权限;
如图5所示,步骤“获取对目标共享内存执行写入操作的权限”又可以实施为如下步骤:
S501、从读写权限数组变量中获取目标共享内存对应成员存储的第一进程号;
S502、确定第一进程号是否为写进程的第二进程号;若是,则进入步骤S503;若否,则进入步骤S504;
S503、确定获取到对目标共享内存执行写入操作的权限;本流程结束;
S504、将第一进程号替换为第二进程号;
S505、判断是否替换成功;若成功,则进入步骤S503;若未成功,则进入步骤S501。
其中,读写权限数组变量用于存储对对应共享内存具有写入权限的进程的进程号;读写权限数组变量为原子变量且设置于共享内存核心区;读写权限数组变量的数组成员数量表征能够申请的共享内存的最大数量。
本申请实施例中,对于写进程来说在获取到访问资格之后,还需要获取写入操作的权限,才能够通过进程锁数组变量上写锁。因此,本申请实施例为了对共享内存的读写权限进行管理,设置了读写权限数组变量。读写权限数组变量表示当前对共享内存拥有写入权限的进程,即读写权限数组变量的数组成员可以分别对应一块共享内存,并存储对对应共享内存具有写入操作权限的进程号。在实际使用中,可能存在一个进程拥有多个共享内存的写入权限(即多个数组成员存储了同一个进程的进程号),而有的进程只拥有多个进程的读取权限。
图6为本申请实施例提供的读写权限数组变量示意图,如图6所示,以最多允许申请32块共享内存为例,数组序号0-31分别标识32块内存,进程A对第0块、第1块共享内存具有写入权限,则对应数组成员(数组成员序号分别为0和1)处存储有进程A的进程号PID(1345);进程B对第2块共享内存具有写入权限,则对应数组成员(数组成员序号为2)处存储有进程B的PID(576);进程C对第3块共享内存具有写入权限,则对应数组成员(数组成员序号为3)处存储有进程C的PID(345);数组成员存储数值0的表征对应共享内存上无进程获取到写入权限。
进一步地,当一个进程需要获取一块共享内存的写入权限时,那么需要将该共享内存在读写权限数组变量对应数组成员中存储的进程号修改为自身的进程号,即执行上述S501~S505的步骤。读写权限数组变量为原子变量,如果存在多个进程获取写入权限时,那么根据原子操作特性,只能存在一个进程能够将原先存储的进程号修改为当前自身进程号。即上述步骤S501、S502和S504为原子操作。在修改不成功的情况下,需要重复执行获取第一进程号的步骤,直到成功替换第一进程号。
实施时,为了便于实现可以在分配共享内存时即为共享内存分配一个标识序号,并且使读写权限数组变量中数组序号与标识序号相同的数组成员,存储该共享内存对应的具有写入权限的进程号。另外,读写权限数组变量的数组成员数量表征能够申请的共享内存的最大数量(例如:32块)。
在本申请提供的又一实施例中,活动进程包括写进程;则在为目标共享内存上锁之前,还可以执行如下步骤:
步骤一、读取进程锁数组变量中,目标共享内存对应的数组成员变量的当前值;并
步骤二、根据该当前值确定不存在进程正在读取目标共享内存;
其中,进程锁数组变量的成员数量表征允许分配共享内存的最大数量;每个共享内存支持的并行访问该共享内存的最大进程数量根据活动进程运行所在操作系统支持的最大位数,以及表征多个锁状态需要的数据位数确定。
本申请实施例中,对于写进程来说,在上写锁之前,需要确保当前不存在正在读取目标共享内存的进程,如果其他进程正在读取目标共享内存,而写进程修改目标共享内存的内容,会导致读进程读取错误。由于为已分配共享内存分配有进程锁数组变量,而进程锁数组变量的数组成员变量用来表征对应共享内存的锁状态,即存储有表征进程所作访问对应锁状态的数值,例如:读锁、写锁,并且不同锁状态对应数值不同。因此,可以通过读取进程锁数组变量对应数组成员变量的当前值,确定访问目标共享内存的各进程的锁状态,即通过该当前值确定是否不存在进程正在读取目标共享内存。
另外,进程锁数组变量的成员数量表征允许分配共享内存的最大数量,而每个共享内存支持的并行访问该共享内存的最大进程数量可以根据活动进程运行所在操作系统支持的最大位数,以及表征多个锁状态需要的数据位数确定。以进程锁为读写锁,需要3种锁状态为例,锁状态的表示需要2个数据位(bit),假设0表示未上锁(对应二进制00),1表示读锁(对应二进制01),2表示写锁(对应二进制10)。根据操作系统支持的最大位数,原子变量最大的类型为uint64_t,而一个原子变量对应一个共享内存,则最多能支持32个进程对同一块共享进行读写访问操作。
图7为本申请实施例提供的进程锁数组变量示意图。如图7所示,以操作系统支持的最大位数为64位,锁状态的表示需要2个bit为例,则最多支持32个进程并行访问。图7所示的实施方式中,以共享内存的申请数量最大为32块为例,则进程锁数组变量包含32个uint64_t原子变量类型的数组成员变量(数组序号0-31)每个数组成员变量64位,每两位存储一个锁状态数值,则可以为对应共享内存存储32个进程的进程锁状态。
在本申请提供的又一实施例中,可以采用如下步骤确定当前是否存在进程正在读取目标共享内存:
步骤一、将上述数组成员变量的当前值与预设掩码执行按位相与操作;预设掩码通过将进程锁数组变量的数组成员变量中每个数据位的值设置为读锁的数值得到;
步骤二、在相与结果为零的情况下,确定不存在进程正在读取目标共享内存。
本申请实施例中,为了便于确定是否有进程正在读取目标共享内存,可以设置预设掩码。该预设掩码可以基于进程锁数组变量的数组成员变量进行设置,将每个数据位的值设置为读锁的数值得到。以进程锁数组变量的数组成员变量为64位,读锁数值取1为例(对应二进制01),可以将掩码设置为:0x5555555555555555(16个十进制5对应32个二进制01),即32个进程的进程锁全部设置为读锁。这样,在相与结果为0的情况下,说明不存在对目标共享内存设置了读锁的进程;而在相与结果不为0的情况下,说明存在进程正在对目标共享内存进行读取,需要等待读取完成后再上写锁。
在本申请提供的又一实施例中,则上述步骤S102“从已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量”,可以实施为如下步骤:
从进程锁数组变量中,确定以为目标共享内存分配的标识序号作为数组成员序号的数组成员;或者
根据分配目标共享内存时建立的目标共享内存与进程锁数组变量中数组成员变量之间的对应关系,确定目标共享内存对应的数组成员变量;
活动进程包括写进程;相应地,上述步骤S103“从数组成员变量中确定活动进程对应的数据位,并将该数据位存储的数值设置为表征活动进程所作访问对应锁状态的数值,来为目标共享内存上锁,并对目标共享内存进行访问”,可以实施为如下步骤:
步骤1、根据为活动进程分配的标识号及表征锁状态数据位的位数,确定活动进程对应数据位在数组成员变量中的偏移量;
步骤2、根据该偏移量确定活动进程对应的数据位,并将该数据位存储的数值设置为表征锁状态为写锁的数值,来为目标共享内存上写锁,并将共享数据写入目标共享内存。
申请活动进程包括读进程;相应地,上述步骤S103“从数组成员变量中确定活动进程对应的数据位,并将该数据位存储的数值设置为表征活动进程所作访问对应锁状态的数值,来为目标共享内存上锁,并对目标共享内存进行访问”,可以实施为如下步骤:
步骤1、根据为活动进程分配的标识号及表征锁状态数据位的位数,确定活动进程对应数据位在数组成员变量中的偏移量;
步骤2、根据该偏移量确定活动进程对应的数据位,并将该数据位存储的数值设置为表征锁状态为读锁的数值,来为目标共享内存上读锁,并对目标共享内存进行读取。
本申请实施例中,为了便于从进程锁数组变量中对目标共享内存对应的数组成员变量进行查找,可以在分配目标共享内存时为该目标共享内存分配一个标识序号,并且将进程锁数组变量中数组成员序号与标识序号相同的数组成员变量分配给目标共享内存,来存储访问该目标共享内存的进程为该目标共享内存上锁的锁状态数值。这样,根据目标共享内存的标识序号实现了进程锁数组变量中数组成员变量的定位。或者,在分配目标共享内存时确定当前进程锁数组变量中尚未对应有共享内存的数组成员变量,与该分配的共享内存对应,并记录该对应关系,以便后续根据对应关系查找共享内存对应的数组成员变量。
进一步地,需要从数组成员变量中确定活动进程对应的数据位。为了便于从数组成员变量中对活动进程对应数据位的查找,可以基于活动进程的标识号(活动进程获取到访问资格后为活动进程分配)确定活动进程对应数据位在数组成员变量中的偏移量。由于数组成员变量中存储了访问目标共享内存的多个进程的锁状态,而每个进程存储锁状态使用的数据位的位数是固定的,则可以以数据位的位数为单位,以进程的标识号为偏移次数,按照每次便宜单位位数,进行该偏移次数的偏移,即得到进程对应数据位在数组成员变量中的位置。这样根据进程的标识号即可快速确定出在目标共享内存对应数组成员变量中对应的数据位,在数据位中存储表征上写锁的数值即完成写锁的设置,存储表征上读锁的数值即完成读锁的设置。
进一步地,由于系统支持最大位数的限制(例如:64位)以及表征锁状态需要的数据位数(例如:2位)的限制,对于同一块共享内存来说并行访问该共享内存的进程数量基本是可以确定的(例如:64÷2=32)。那么对于内存访问状态数组变量来说,其数组成员变量的数据位数限制了允许并行访问已分配共享内存的进程的最大数量,该最大数量与此处的并行访问该共享内存的进程数量基本是一致的(例如:32个)。
图8为本申请实施例提供的进程锁数组变量示意图。如图8所示,为第一块共享内存(标识序号为0)对应的进程锁数组变量中数组序号为0的数组成员变量,继续以操作系统支持的最大位数为64位,锁的状态表示需要2个数据位(bit)为例,对于标识号为0的进程A,其在数组成员变量中的偏移量为以2bit为单位偏移0次位置处的数据位,即bit0和bit1处,进程A如果需要对第一块共享内存执行写操作,可以在bit0和bit1处存储对应的锁状态值;对于标识号为1的进程B,其在数组成员变量中的偏移量为以2bit为单位偏移1次位置处的数据位,即bit2和bit3处,进程B如果需要对第一块共享内存执行写操作,可以在bit2和bit3处存储对应的锁状态值;对于标识号为2的进程C,其在数组成员变量中的偏移量为以2bit为单位偏移2次位置处的数据位,即bit4和bit5处,进程C如果需要对第一块共享内存执行写操作,可以在bit4和bit5处存储对应的锁状态值;后面同理,这里不再赘述。
在本申请提供的又一实施例中,活动进程包括读进程;读进程包括多个线程;
则上述步骤S102“从已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量”,可以实施为如下步骤一:
步骤一、在多个线程中首个线程需要进行读操作的情况下,从进程锁数组变量中,确定目标共享内存对应的数组成员变量;
上述步骤S103“从数组成员变量中确定活动进程对应的数据位,并将该数据位存储的数值设置为表征活动进程所作访问对应锁状态的数值,来为目标共享内存上锁,并对目标共享内存进行访问”,可以实施为如下步骤二;
步骤二、从数组成员变量中确定活动进程对应的数据位,并将上述数据位存储的数值设置为表征锁状态为读锁的数值,来为目标共享内存上读锁,并对目标共享内存进行读取;
所述方法还可以包括如下步骤:
步骤三、确定读锁计数数组变量中,为读进程进行读锁计数的计数数组成员,并在该计数数组成员记录单位数值;
步骤四、在多个线程中非首个线程需要进行读操作的情况下,在上述计数数组成员按照单位数值对读取目标共享内存的线程数量进行累计;
步骤五、在多个线程中任一线程完成读取之后,将上述计数数组成员的计数减掉单位数值;
步骤六、在上述计数数组成员的计数减为零的情况下,将进程锁数组变量中对应数据位存储的数值设置表征锁状态为未上锁的数值;
其中,读锁计数数组变量表征对对应共享内存具有访问资格的各进程当前访问该对应共享内存的线程的数量;读锁计数数组变量的成员数量表征允许分配共享内存的最大数量。
本申请实施例中,由于进程可以包括多个线程,进程获取到共享内存的访问资格后可以启动线程进行访问,并且多个线程可能访问同一块共享内存,这就需要多个线程都给共享内存上读锁,但是该多个线程使用的是同一个进程的访问资格,并且表征读锁的锁状态数值无法体现上读锁的数量,如果某线程完成数据读取,将读锁的锁状态数值清零,其他还在进行数据读取的线程就无法使外界知晓还存在线程正在读取数据,一旦有写进程写入数据将会导致其他线程读取数据的错误。
为了解决这一问题,本申请实施例提供了读锁计数数组变量,可以为已分配共享内存设置读锁计数数组变量,读锁计数数组变量可以表征对各共享内存具有访问资格的各进程当前访问共享内存的线程的数量,那么,读锁计数数组变量的成员数量可以表征允许分配共享内存的最大数量(例如:前例中的32个),每个计数数组成员可以为访问对应共享内存的线程数量进行计数。
实施时,在进程的首个线程需要进行读操作的情况下,可以对进程锁数组变量的对应数组成员变量的对应数据位写入上读锁数值,后续非首个线程需要对同一共享内存进行读取的情况下不需要再次对该数据位赋值,而是在读锁计数数组变量对应计数数组成员进行累计计数,同理,当任一线程完成读取操作,可以在读锁计数数组变量对应计数数组成员减掉单位数值(例如:1),在读锁计数数组变量对应计数数组成员计数减为零的情况下,说明所有线程均完成读取,可以将进程锁数组变量中对应数据位存储的数值设置表征锁状态为未上锁的数值。
图9为本申请实施例提供的多个线程访问共享内存的示意图。如图9所示,为一块共享内存(标识序号为0)对应的进程锁数组变量中数组序号为0的数组成员变量,继续以操作系统支持的最大位数为64位,锁状态的表示需要2个bit为例,标识号为0的进程1的多个线程(线程A~线程C)正在对该共享内存进行读取,则在进程锁数组变量的对应数组成员变量(即序号为0的数组成员)对应数据位(即bit0和bit1)存储读锁(以读锁值是1为例),而在读锁计数数组变量中对应计数数组成员(即序号为0的数组成员)对正在进行读操作的线程进行计数,对于进程1来说,有三个线程正在执行读操作,因此计数数组成员数值为3。另外,线程D需要进行写操作,只有等待A-C三个线程完成读操作之后才能进行。
本申请提供的又一实施例中,如图10所示,还包括对非活动进程进行清理的步骤:
S1001、依次遍历内存访问状态数组变量的各成员,在每次遍历中执行如下操作:
S1002、确定各成员存储的数值与上次遍历相比是否相同;若相同,则进入步骤S1003;若不同进入步骤S1001;
S1003、累计对应成员被判相同的次数;并确定累计的次数是否达到预设次数;若是,则进入步骤S1004;若否,进入步骤S1001;
S1004、将对应成员存储的数值修改为表征对应访问资格未被占用;
S1005、在修改成功的情况下,确定对应成员存储数值表征的目标进程;并将目标进程在进程锁数组变量中对应的锁状态设置为未上锁;
S1006、在目标进程为写进程的情况下,将目标进程在读写权限数组变量中对应存储的进程号清除。
本申请实施例中,正常情况下,进程完成了读写操作应该自行将对应资源释放,例如:进程完成了写操作应该将上的写锁清除等,为了避免进程异常终止导致无法释放对应资源,本申请实施例中提供了对非活动进程进行清理的方式。如上述,进程获取到访问资格之后,会按照预设时间间隔对修改成功的成员所存储的数值进行自增计数,表征进程还处于活动状态,通过对这个自增计数的检测可以确定进程的活动状态,也就是说,如果自增计数正常进行,说明进程处于活动状态,而如果进程的自增计数停止,可以说明进程处于非活动状态或者异常终止了,这时就需要通过本流程对非活动进程占用的资源进行清理。实施时,可以在进程获取到访问资格之后,在后台启动线程(该线程可以由共享内存核心区管理)以预设时段为周期(例如:100ms)对内存访问状态数组变量的各成员进行遍历,检测是否存在进程在预设次数(例如:20次)均为执行自增操作,如果存在,则将与该进程对应在内存访问状态数组变量、进程锁数组变量、读写权限数组变量(在目标进程为写进程的情况下),中的数值清除。
另外,在将对应成员存储的数值修改为表征对应访问资格未被占用不成功的情况下,可能已经存在进程在释放资源,可以返回执行步骤S1001。其中,步骤S1002、S1004、S1005均为原子操作。
在本申请提供的又一实施例中,活动进程包括写进程;写进程采用如下方式将共享数据写入目标共享内存:
步骤一、确定共享数据在目标共享内存中的写入偏移量;
步骤二、按照写入偏移量将共享数据写入目标共享内存,并将当前写入偏移量更新;
步骤三、按照写入共享数据的单位数量,为写索引变量赋值;
其中,写入偏移量、写入数据大小、以及写索引存储在所述共享内存用户区;
活动进程包括读进程;读进程采用如下方式读取目标共享内存:
步骤一、获取当前写索引变量的值以及读索引变量的值;
步骤二、在写索引变量的值和读索引变量的值不一致,且读索引变量有效的情况下,按照写入偏移量及写索引变量表征的单位数据量读取共享数据;
步骤三、对读索引变量的数值进行更新。
本申请实施例中,在使用用户共享内存时,可以通过无锁消息队列进行数据收发(这里的无锁指的是不使用相关技术提供的锁)。在多进程访问共享内存的一种实施方式中,存在一个写进程与多个读进程;即一个写进程进行数据同步,将数据填入共享内存中,而其他读进程从共享内存中进行数据读取。
无锁消息队列的成员主要包括:写入偏移量、单位数据大小(例如:以帧为单位,当前帧大小)、单位数据量(帧数)、数据类型(帧类型)、写索引变量、读索引变量等。需要说明的是,读索引变量可以设置为读进程的私有变量,而写索引变量需要所有读进程参照进行数据读取,所以可以设置为全局变量。写进程向共享内存写入数据后,可以将写索引变量修改为与写入的单位数据量(如:帧数)对应的数值,由于写索引变量是全局变量,各读进程能够获取到写索引变量更新的数值,将写索引变量的数值与自身读索引变量的数值进行比对,又由于写入偏移量、写入数据大小也均存储在共享内存用户区,在写索引变量的数值与自身读索引变量的数值不一致,且读索引变量有效的情况下,可以进行共享数据的读取,并对读索引数值进行更新,以表示完成了新共享数据的获取。另外,上述步骤中写进程对写索引变量的写入,以及读进程对写索引变量的获取均为原子操作。
需要说明的是,若读索引变量数值无效,将写索引变量数值赋值给读索引变量即可。另外,对于读进程如何获知写进程写入数据的共享内存,实施时可以在调用读进程时进行告知,这里不再赘述。
本申请提供的又一实施例中,在仪器仪表的使用场景中,活动进程包括作为写进程的控制端进程,以及作为读进程的多个监控端进程。即一个控制端进程进行数据同步,将数据填入共享内存中,而其他监控端进程从共享内存中进行数据读取。
基于同一申请构思,本申请实施例还提供了一种进程通信装置,由于这些装置所解决问题的原理与前述进程通信方法相似,因此该装置的实施可以参见前述方法的实施,重复之处不再赘述。
本申请实施例提供一种进程通信装置,如图11所示,包括如下模块:
访问资格获取模块1101,用于活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格;
上锁模块1102,用于从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问;
其中,所述进程锁数组变量的数组成员变量分别用于存储所述各已分配共享内存的访问进程的锁状态;所述进程锁数组变量为原子变量且设置于所述共享内存核心区;所述已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;所述共享内存核心区和所述共享内存用户区均设置于用户空间。
在本申请提供的又一实施例中,访问资格获取模块1101,用于依次遍历内存访问状态数组变量的各数组成员;在确定任一数组成员对应存储的数值表征对应访问资格未被占用的情况下,将该数值修改为表征对应访问资格被占用;在修改成功的情况下,确定所述活动进程获得对所述已分配共享内存的访问资格;在修改不成功的情况下,继续遍历所述内存访问状态数组变量的数组成员;其中,所述内存访问状态数组变量用于存储对所述已分配共享内存的访问资格的分配情况;所述内存访问状态数组变量为原子变量且设置于所述共享内存核心区;所述内存访问状态数组变量的数组成员数量表征允许并行访问所述已分配共享内存的进程的最大数量。
在本申请提供的又一实施例中,访问资格获取模块1101,还用于在所述活动进程获得对所述已分配共享内存的访问资格之后,将数值被修改为表征对应访问资格被占用的数组成员在所述内存访问状态数组变量中的序号,确定为所述活动进程的标识号。
在本申请提供的又一实施例中,如图12所示,所述活动进程包括写进程;所述装置还包括:写入权限获取模块1103;
写入权限获取模块1103,用于所述写进程获取到所述访问资格之后,获取对所述目标共享内存执行写入操作的权限;
写入权限获取模块1103,用于从读写权限数组变量中获取所述目标共享内存对应成员存储的第一进程号;确定所述第一进程号是否为所述写进程的第二进程号;若是,则确定获取到对所述目标共享内存执行写入操作的权限;若否,则将所述第一进程号替换为所述第二进程号;在将所述第一进程号替换为所述第二进程号不成功的情况下,返回获取所述目标共享内存对应成员存储的第一进程号的步骤;其中,所述读写权限数组变量用于存储对对应共享内存具有写入权限的进程的进程号;所述读写权限数组变量为原子变量且设置于所述共享内存核心区;所述读写权限数组变量的数组成员数量表征能够申请的共享内存的最大数量。
在本申请提供的又一实施例中,所述活动进程包括写进程;上锁模块1102,还用于在为所述目标共享内存上锁之前,读取所述进程锁数组变量中,所述目标共享内存对应的数组成员变量的当前值;并根据所述当前值确定不存在进程正在读取所述目标共享内存;其中,所述进程锁数组变量的成员数量表征允许分配共享内存的最大数量;每个共享内存支持的并行访问该共享内存的最大进程数量根据所述活动进程运行所在操作系统支持的最大位数,以及表征多个锁状态需要的数据位数确定。
在本申请提供的又一实施例中,上锁模块1102,用于采用如下方式确定当前是否存在进程正在读取所述目标共享内存:将所述数组成员变量的当前值与预设掩码执行按位相与操作;所述预设掩码通过将进程锁数组变量的数组成员变量中每个数据位的值设置为读锁的数值得到;在相与结果为零的情况下,确定不存在进程正在读取所述目标共享内存。
在本申请提供的又一实施例中,上锁模块1102,用于从所述进程锁数组变量中,确定以为所述目标共享内存分配的标识序号作为数组成员序号的数组成员变量;
所述活动进程包括写进程;上锁模块1102,用于根据为所述活动进程分配的标识号及表征锁状态数据位的位数,确定所述活动进程对应数据位在所述数组成员变量中的偏移量;根据所述偏移量确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为写锁的数值,来为所述目标共享内存上写锁,并将共享数据写入所述目标共享内存;和/或
所述活动进程包括读进程;上锁模块1102,用于根据为所述活动进程分配的标识号及表征锁状态数据位的位数,确定所述活动进程对应数据位在所述数组成员变量中的偏移量;根据所述偏移量确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为读锁的数值,来为所述目标共享内存上读锁,并对所述目标共享内存进行读取。
在本申请提供的又一实施例中,所述活动进程包括读进程;所述读进程包括多个线程;上锁模块1102,用于在所述多个线程中首个线程需要进行读操作的情况下,从所述进程锁数组变量中,确定所述目标共享内存对应的数组成员变量;以及从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为读锁的数值,来为所述目标共享内存上读锁,并对所述目标共享内存进行读取;
上锁模块1102,还用于确定读锁计数数组变量中,为所述读进程进行读锁计数的计数数组成员,并在所述计数数组成员记录单位数值;在所述多个线程中非首个线程需要进行读操作的情况下,在所述计数数组成员按照所述单位数值对读取所述目标共享内存的线程数量进行累计;在所述多个线程中任一线程完成读取之后,将所述计数数组成员的计数减掉单位数值;在所述计数数组成员的计数减为零的情况下,将所述进程锁数组变量中对应数据位存储的数值设置表征锁状态为未上锁的数值;其中,所述读锁计数数组变量表征对对应共享内存具有访问资格的各进程当前访问该对应共享内存的线程的数量;所述读锁计数数组变量的成员数量表征允许分配共享内存的最大数量。
在本申请提供的又一实施例中,访问资格获取模块1101,还用于按照预设时间间隔对修改成功的成员所存储的数值进行自增计数;以及
本申请提供的又一实施例中,采用如下方式对非活动进程进行清理:依次遍历所述内存访问状态数组变量的各成员,在每次遍历中执行如下操作:确定各成员存储的数值与上次遍历相比是否相同;若相同,则累计对应成员被判相同的次数;确定累计的次数是否达到预设次数;若是,则将对应成员存储的数值修改为表征对应访问资格未被占用;在修改成功的情况下,确定对应成员存储数值表征的目标进程;将所述目标进程在所述进程锁数组变量中对应的锁状态设置为未上锁;在所示目标进程为写进程的情况下,将所述目标进程在读写权限数组变量中对应存储的进程号清除。
本申请提供的又一实施例中,还包括:写入模块1104和读取模块1105;写入模块1104,用于采用如下方式将共享数据写入目标共享内存:确定所述共享数据在所述目标共享内存中的写入偏移量;按照所述写入偏移量将所述共享数据写入所述目标共享内存,并将当前写入偏移量更新;按照写入共享数据的单位数量,为写索引变量赋值;其中,所述写入偏移量、写入数据大小、以及写索引存储在所述共享内存用户区;
读取模块1105,用于采用如下方式读取目标共享内存:获取当前写索引变量的值以及读索引变量的值;在所述写索引变量的值和所述读索引变量的值不一致,且所述读索引变量有效的情况下,按照所述写入偏移量及所述写索引变量表征的单位数据量读取所述共享数据;并对所述读索引变量的数值进行更新。
本申请提供的又一实施例中,所述活动进程包括作为写进程的控制端进程,以及作为读进程的多个监控端进程。
基于同一技术构思,本申请实施例还提供了一种电子设备。参照图13所示,为本申请实施例提供的电子设备1300的结构示意图,包括处理器1301、存储器1302、和总线1303。其中,存储器1302用于存储执行指令,包括内存13021和外部存储器13022;这里的内存13021也称内存储器,用于暂时存放处理器1301中的运算数据,以及与硬盘等外部存储器13022交换的数据,处理器1301通过内存13021与外部存储器13022进行数据交换,当电子设备1300运行时,处理器1301与存储器1302之间通过总线1303通信,使得处理器1301在执行以下指令:
活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格;
从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;
从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问;
其中,所述进程锁数组变量的数组成员变量分别用于存储所述各已分配共享内存的访问进程的锁状态;所述进程锁数组变量为原子变量且设置于所述共享内存核心区;所述已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;所述共享内存核心区和所述共享内存用户区均设置于用户空间。
本申请实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的进程通信方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本申请实施例可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本申请实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本申请所必须的。
本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (14)

1.一种进程通信方法,其特征在于,包括:
活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格;
从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;
从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问;
其中,所述进程锁数组变量的数组成员变量分别用于存储所述各已分配共享内存的访问进程的锁状态;所述进程锁数组变量为原子变量且设置于共享内存核心区;所述已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;所述共享内存核心区和所述共享内存用户区均设置于用户空间;
所述从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量,包括:
从所述进程锁数组变量中,确定以为所述目标共享内存分配的标识序号作为数组成员序号的数组成员变量;或者
根据分配所述目标共享内存时建立的所述目标共享内存与所述进程锁数组变量中数组成员变量之间的对应关系,确定所述目标共享内存对应的数组成员变量。
2.如权利要求1所述的方法,其特征在于,活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格,包括:
依次遍历内存访问状态数组变量的各数组成员;
在确定任一数组成员对应存储的数值表征对应访问资格未被占用的情况下,将该数值修改为表征对应访问资格被占用;
在修改成功的情况下,确定所述活动进程获得对所述已分配共享内存的访问资格;
在修改不成功的情况下,继续遍历所述内存访问状态数组变量的数组成员;
其中,所述内存访问状态数组变量用于存储对所述已分配共享内存的访问资格的分配情况;所述内存访问状态数组变量为原子变量且设置于所述共享内存核心区;所述内存访问状态数组变量的数组成员数量表征允许并行访问所述已分配共享内存的进程的最大数量。
3.如权利要求2所述的方法,其特征在于,在所述活动进程获得对所述已分配共享内存的访问资格之后,还包括:
将数值被修改为表征对应访问资格被占用的数组成员在所述内存访问状态数组变量中的序号,确定为所述活动进程的标识号。
4.如权利要求1所述的方法,其特征在于,所述活动进程包括写进程;所述写进程获取到所述访问资格之后,还包括:
获取对所述目标共享内存执行写入操作的权限,包括:
从读写权限数组变量中获取所述目标共享内存对应成员存储的第一进程号;
确定所述第一进程号是否为所述写进程的第二进程号;若是,则确定获取到对所述目标共享内存执行写入操作的权限;若否,则将所述第一进程号替换为所述第二进程号;在将所述第一进程号替换为所述第二进程号不成功的情况下,返回获取所述目标共享内存对应成员存储的第一进程号的步骤;
其中,所述读写权限数组变量用于存储对对应共享内存具有写入权限的进程的进程号;所述读写权限数组变量为原子变量且设置于所述共享内存核心区;所述读写权限数组变量的数组成员数量表征能够申请的共享内存的最大数量。
5.如权利要求1所述的方法,其特征在于,所述活动进程包括写进程;在为所述目标共享内存上锁之前,还包括:
读取所述进程锁数组变量中,所述目标共享内存对应的数组成员变量的当前值;并
根据所述当前值确定不存在进程正在读取所述目标共享内存;
其中,所述进程锁数组变量的成员数量表征允许分配共享内存的最大数量;每个共享内存支持的并行访问该共享内存的最大进程数量根据所述活动进程运行所在操作系统支持的最大位数,以及表征多个锁状态需要的数据位数确定。
6.如权利要求5所述的方法,其特征在于,采用如下方式确定当前是否存在进程正在读取所述目标共享内存:
将所述数组成员变量的当前值与预设掩码执行按位相与操作;所述预设掩码通过将进程锁数组变量的数组成员变量中每个数据位的值设置为读锁的数值得到;
在相与结果为零的情况下,确定不存在进程正在读取所述目标共享内存。
7.如权利要求3所述的方法,其特征在于,所述活动进程包括写进程;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问,包括:
根据为所述活动进程分配的标识号及表征锁状态数据位的位数,确定所述活动进程对应数据位在所述数组成员变量中的偏移量;
根据所述偏移量确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为写锁的数值,来为所述目标共享内存上写锁,并将共享数据写入所述目标共享内存;和/或
所述活动进程包括读进程;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问,包括:
根据为所述活动进程分配的标识号及表征锁状态数据位的位数,确定所述活动进程对应数据位在所述数组成员变量中的偏移量;
根据所述偏移量确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为读锁的数值,来为所述目标共享内存上读锁,并对所述目标共享内存进行读取。
8.如权利要求1所述的方法,其特征在于,所述活动进程包括读进程;所述读进程包括多个线程;
从所述已分配共享内存对应的进程锁数组变量中,确定所述目标共享内存对应的数组成员变量,包括:
在所述多个线程中首个线程需要进行读操作的情况下,从所述进程锁数组变量中,确定所述目标共享内存对应的数组成员变量;
从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问,包括:
从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征锁状态为读锁的数值,来为所述目标共享内存上读锁,并对所述目标共享内存进行读取;
所述方法还包括:
确定读锁计数数组变量中,为所述读进程进行读锁计数的计数数组成员,并在所述计数数组成员记录单位数值;
在所述多个线程中非首个线程需要进行读操作的情况下,在所述计数数组成员按照所述单位数值对读取所述目标共享内存的线程数量进行累计;
在所述多个线程中任一线程完成读取之后,将所述计数数组成员的计数减掉单位数值;
在所述计数数组成员的计数减为零的情况下,将所述进程锁数组变量中对应数据位存储的数值设置表征锁状态为未上锁的数值;
其中,所述读锁计数数组变量表征对对应共享内存具有访问资格的各进程当前访问该对应共享内存的线程的数量;所述读锁计数数组变量的成员数量表征允许分配共享内存的最大数量。
9.如权利要求2所述的方法,其特征在于,所述方法还包括:
按照预设时间间隔对修改成功的成员所存储的数值进行自增计数;
采用如下方式对非活动进程进行清理:
依次遍历所述内存访问状态数组变量的各成员,在每次遍历中执行如下操作:
确定各成员存储的数值与上次遍历相比是否相同;
若相同,则累计对应成员被判相同的次数;
确定累计的次数是否达到预设次数;若是,则将对应成员存储的数值修改为表征对应访问资格未被占用;在修改成功的情况下,确定对应成员存储数值表征的目标进程;将所述目标进程在所述进程锁数组变量中对应的锁状态设置为未上锁;在所示目标进程为写进程的情况下,将所述目标进程在读写权限数组变量中对应存储的进程号清除。
10.如权利要求1所述的方法,其特征在于,所述活动进程包括写进程;所述写进程采用如下方式将共享数据写入目标共享内存:
确定所述共享数据在所述目标共享内存中的写入偏移量;
按照所述写入偏移量将所述共享数据写入所述目标共享内存,并将当前写入偏移量更新;
按照写入共享数据的单位数量,为写索引变量赋值;
其中,所述写入偏移量、写入数据大小、以及写索引存储在所述共享内存用户区;
所述活动进程包括读进程;所述读进程采用如下方式读取目标共享内存:
获取当前写索引变量的值以及读索引变量的值;
在所述写索引变量的值和所述读索引变量的值不一致,且所述读索引变量有效的情况下,按照所述写入偏移量及所述写索引变量表征的单位数据量读取所述共享数据;并对所述读索引变量的数值进行更新。
11.如权利要求1所述的方法,其特征在于,所述活动进程包括作为写进程的控制端进程,以及作为读进程的多个监控端进程。
12.一种进程通信装置,其特征在于,包括:
访问资格获取模块,用于活动进程根据已分配共享内存的当前访问状态,获取对所述已分配共享内存的访问资格;
上锁模块,用于从所述已分配共享内存对应的进程锁数组变量中,确定目标共享内存对应的数组成员变量;从所述数组成员变量中确定所述活动进程对应的数据位,并将所述数据位存储的数值设置为表征所述活动进程所作访问对应锁状态的数值,来为所述目标共享内存上锁,并对所述目标共享内存进行访问;
其中,所述进程锁数组变量的数组成员变量分别用于存储所述各已分配共享内存的访问进程的锁状态;所述进程锁数组变量为原子变量且设置于共享内存核心区;所述已分配共享内存预先由共享内存核心区分配,并设置于共享内存用户区;所述共享内存核心区和所述共享内存用户区均设置于用户空间;
所述上锁模块,用于从所述进程锁数组变量中,确定以为所述目标共享内存分配的标识序号作为数组成员序号的数组成员变量;或者根据分配所述目标共享内存时建立的所述目标共享内存与所述进程锁数组变量中数组成员变量之间的对应关系,确定所述目标共享内存对应的数组成员变量。
13.一种电子设备,其特征在于,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行如权利要求1至11任一所述的进程通信方法的步骤。
14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如权利要求1至11任意一项所述的进程通信方法的步骤。
CN202411328761.XA 2024-09-24 2024-09-24 一种进程通信方法、装置及电子设备 Active CN118860697B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202411328761.XA CN118860697B (zh) 2024-09-24 2024-09-24 一种进程通信方法、装置及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202411328761.XA CN118860697B (zh) 2024-09-24 2024-09-24 一种进程通信方法、装置及电子设备

Publications (2)

Publication Number Publication Date
CN118860697A CN118860697A (zh) 2024-10-29
CN118860697B true CN118860697B (zh) 2025-01-21

Family

ID=93161320

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202411328761.XA Active CN118860697B (zh) 2024-09-24 2024-09-24 一种进程通信方法、装置及电子设备

Country Status (1)

Country Link
CN (1) CN118860697B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1740978A (zh) * 2004-08-23 2006-03-01 华为技术有限公司 实现共享内存数据库的方法及内存数据库系统
CN115756876A (zh) * 2022-11-21 2023-03-07 上海零念科技有限公司 多系统环境下进程访问共享内存方法及装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111796948B (zh) * 2020-07-02 2021-11-26 长视科技股份有限公司 一种共享内存访问方法、装置、计算机设备和存储介质
CN117667430A (zh) * 2022-08-31 2024-03-08 华为技术有限公司 持锁进程检测方法及相关设备

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1740978A (zh) * 2004-08-23 2006-03-01 华为技术有限公司 实现共享内存数据库的方法及内存数据库系统
CN115756876A (zh) * 2022-11-21 2023-03-07 上海零念科技有限公司 多系统环境下进程访问共享内存方法及装置

Also Published As

Publication number Publication date
CN118860697A (zh) 2024-10-29

Similar Documents

Publication Publication Date Title
US7484048B2 (en) Conditional message delivery to holder of locks relating to a distributed locking manager
WO2011148553A1 (ja) 情報処理装置および情報処理方法
US10929201B2 (en) Method and system for implementing generation locks
US20140351547A1 (en) Linked list for lock-free memory allocation
US20110145243A1 (en) Sharing of Data Across Disjoint Clusters
US11449241B2 (en) Customizable lock management for distributed resources
EP3295293B1 (en) Thread safe lock-free concurrent write operations for use with multi-threaded in-line logging
CN111797172B (zh) 数据迁移方法、装置、设备、分布式系统及存储介质
US8458396B2 (en) Sharing resources within a robotic media library amongst a plurality of connected servers
US5432929A (en) Storage subsystem having a modifiable key-lock
US6076126A (en) Software locking mechanism for locking shared resources in a data processing system
CN110968563A (zh) 一种数据存储方法、元数据服务器及客户端
CN118860697B (zh) 一种进程通信方法、装置及电子设备
CN105718589B (zh) 访问文件的方法和装置
US20240320194A1 (en) Lock management method, apparatus, and system
AU2011229395B2 (en) Dual mode reader writer lock
US8719478B2 (en) Deadlock prevention
US10515066B2 (en) Atomic updates of versioned data structures
JP5553685B2 (ja) 情報処理装置および情報処理方法
CN112181617B (zh) 一种基于特定索引结构的高效调度算法
CN114510459A (zh) 一种基于Redis缓存系统的分布式锁管理的方法及系统
CN117857614B (zh) 一种针对多核场景下网络数据流的session处理系统
CN118885284B (zh) 基于key-value数据库的分布式队列锁执行方法
JP2011248469A (ja) 情報処理装置および情報処理方法
JPH04127261A (ja) マルチプロセッサシステム

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