CN104424030B - 多进程操作共享内存的方法和装置 - Google Patents

多进程操作共享内存的方法和装置 Download PDF

Info

Publication number
CN104424030B
CN104424030B CN201310370343.2A CN201310370343A CN104424030B CN 104424030 B CN104424030 B CN 104424030B CN 201310370343 A CN201310370343 A CN 201310370343A CN 104424030 B CN104424030 B CN 104424030B
Authority
CN
China
Prior art keywords
data
data area
shared memory
node
linked list
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
CN201310370343.2A
Other languages
English (en)
Other versions
CN104424030A (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201310370343.2A priority Critical patent/CN104424030B/zh
Publication of CN104424030A publication Critical patent/CN104424030A/zh
Application granted granted Critical
Publication of CN104424030B publication Critical patent/CN104424030B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供了一种多进程操作共享内存的方法,所述方法包括:当第一进程需修改第一共享内存中的数据时,将所述第一共享内存中的数据复制到预分配的与所述第一共享内存大小相等的第二共享内存中;所述第一进程修改所述第二共享内存中的数据;第二共享内存中的数据修改完毕后,将存储的当前数据区的地址由第一共享内存的地址修改为第二共享内存的地址。该方法能够使得共享内存的读操作和写操作并发执行,从而提高了设备的处理效率。此外,还提供了一种多进程操作共享内存的装置以及另一种多进程操作共享内存的方法和装置。

Description

多进程操作共享内存的方法和装置
技术领域
本发明涉及计算机技术领域,特别是涉及一种多进程操作共享内存的方法和装置。
背景技术
共享内存是指可被更多的进程所共享的内存,其被描述成内存一个区域(段)的映射。进程是应用程序的运行实例,是应用程序的一次动态执行。多进程操作共享内存是指实现读取共享内存中的数据或者写入数据至共享内存中,多进程可通过共享内存实现进程间的通信。
传统技术中,多进程操作共享内存为保持内存数据的准确,需要使用资源锁,即:进程在读取共享内存中的数据或者写入数据至共享内存中之前,都需要先获取到共享内存的资源锁,只有获取到资源锁的进程才能对共享内存进行读操作或写操作,而不能获取到资源锁的进程则会阻塞。
然而,发明人发现现有技术中至少存在以下技术问题:
由于无法获取资源锁时将会阻塞进程,当一个进程在对共享内存进行读操作时(该进程获取到资源锁),则其他所有进程无法对共享内存进行读操作或写操作,当一个进程对共享内存进行写操作时,其他所有进程也无法对共享内存进行读操作或写操作,这必然会影响设备的处理效率。特别是在单进程写多进程读(即读操作大大多于写操作的次数)的应用场景中,这种串行的处理方式使得设备的处理效率较低,从而影响了设备的处理性能。
发明内容
基于此,有必要针对传统技术中处理效率低的技术问题,提供一种多进程操作共享内存的方法和装置。
一种多进程操作共享内存的方法,所述方法包括:
当第一进程需修改第一共享内存中的数据时,将所述第一共享内存中的数据复制到预分配的与所述第一共享内存大小相等的第二共享内存中;
所述第一进程修改所述第二共享内存中的数据;
第二共享内存中的数据修改完毕后,将存储的当前数据区的地址由第一共享内存的地址修改为第二共享内存的地址。
一种多进程操作共享内存的装置,所述装置包括:
数据复制模块,用于当第一进程需修改第一共享内存中的数据时,将所述第一共享内存中的数据复制到预分配的与所述第一共享内存大小相等的第二共享内存中;
数据修改模块,用于通过第一进程修改所述第二共享内存中的数据;
地址修改模块,用于在第二共享内存中的数据修改完毕后,将存储的当前数据区的地址由第一共享内存的地址修改为第二共享内存的地址。
上述多进程操作共享内存的方法和装置,由于在第一进程要修改第一共享内存中的数据时,将第一共享内存中的数据复制到了预分配的与第一共享内存大小相等的第二共享内存中,使得第一进程的数据写入可在第二共享内存中进行。这样,在第一进程的写操作执行过程中,第二进程仍可以读取到修改前的数据,因而读取数据的进程不会被阻塞。由于没有为共享内存设置资源锁,进程无需竞争资源就能够对共享内存实现读操作和写操作,且读操作的进程不会因为有进程在执行写操作而阻塞,而写操作的进程也不会因为有进程在执行读操作而阻塞,因此能够提高设备的处理效率,从而提高设备的处理性能。
一种多进程操作共享内存的方法,所述方法包括:
当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入空闲可用的第二数据区;
数据写入完成后,判断第二进程的读取操作是否结束,若是,则将所述链表设置为不可读状态,否则等待,直到所述第二进程的读取操作结束;
将所述第二数据区***所述链表中,使所述第一节点对应所述第二数据区;
将所述链表设置为可读状态。
一种多进程操作共享内存的装置,所述装置包括:
数据写入模块,用于当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入与所述第一数据区大小相等且空闲可用的第二数据区;
读操作判断模块,用于所述数据写入模块数据写入完成后,判断第二进程的读取操作是否结束;
状态设置模块,用于当所述第二进程的读取操作结束时,将所述链表设置为不可读状态,否则等待,直到所述第二进程的读取操作结束,再将所述链表设置为不可读状态;
链表更新模块,用于将所述第二数据区***所述链表中,使所述第一节点对应所述第二数据区;
所述状态设置模块还用于在所述链表更新模块将第二数据区***所述链表中之后,将所述链表设置为可读状态。
上述多进程操作共享内存的方法和装置,当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入空闲可用的第二数据区中,由于第一进程的写操作可以在第二数据区中执行,不会影响第二进程的读取操作,使得共享内存的写操作和读操作可以同步执行,读取数据的进程不会因为第一进程的写操作而阻塞。由于没有为共享内存设置资源锁,进程无需竞争资源就能够对共享内存实现读操作和写操作,且读操作的进程不会因为有进程在执行写操作而阻塞,而写操作的进程也不会因为有进程在执行读操作而阻塞,实现了读写操作的并发执行,从而提高了设备的处理效率。
附图说明
图1为一个实施例中多进程操作共享内存的方法的流程示意图;
图2为分配共享内存的示意图;
图3为采用指针指向当前数据区的示意图;
图4为更改指向当前数据区的指针的示意图;
图5为一个实施例中多进程操作共享内存的装置的结构框图;
图6为又一个实施例中多进程操作共享内存的装置的结构框图;
图7为再一个实施例中多进程操作共享内存的装置的结构框图;
图8为另一个实施例中多进程操作共享内存的方法的流程示意图;
图9为一个实施例中用于管理共享内存的链表的示意图;
图10为另一个实施例中用于管理共享内存的链表的示意图;
图11为一个实施例中多进程操作共享内存的装置的结构框图;
图12为再一个实施例中多进程操作共享内存的装置的结构框图;
图13为另一个实施例中多进程操作共享内存的方法的流程示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,在一个实施例中,提供了一种多进程操作共享内存的方法,包括:
步骤102,当第一进程需修改第一共享内存中的数据时,将第一共享内存中的数据复制到预分配的与第一共享内存大小相等的第二共享内存中。
第一共享内存和第二共享内存是预先分配的大小相等的共享内存。本实施例中,当需要某一大小的共享内存时,则分配两倍大小的共享内存,其中一半共享内存为第一共享内存,另一半共享内存则为第二共享内存。
在一个实施例中,在步骤102之前,还包括:当需第一大小的共享内存时,分配第一大小的第一共享内存和与第一共享内存大小相等的第二共享内存;创建第三共享内存,在第三共享内存中存储第一共享内存的地址、第二共享内存的地址和当前数据区的地址;该当前数据区的地址为第一共享内存的地址。
如图2所示,当需要大小为X的共享内存A时,则分配2*X大小的共享内存A和B。本发明实施例中的第一共享内存可为这两个共享内存中的任意一个,则第二共享内存为另一个,即第一共享内存和第二共享内存是相对的概念。在分配好共享内存后,可将数据写入其中任意一个共享内存中,本实施例中,以第一共享内存为当前数据区的共享内存进行举例说明,当第一进程需修改当前数据区中的数据时,则开始执行步骤102。
第三共享内存用于管理第一共享内存和第二共享内存。进一步的,在第三共享内存中可存储三个指针,这三个指针分别指向第一共享内存的地址、第二共享内存的地址和当前数据区的地址。其中第一共享内存的地址可为第一共享内存的起始位置,第二共享内存的地址可为第二共享内存的起始位置。本实施例由于当前数据区为第一共享内存,则当前数据区的地址为第一共享内存的起始位置。
具体的,在步骤102中,当第一进程需修改当前数据区中的数据(也就是第一共享内存中的数据)时,获取第三共享内存中存储的第一共享内存的地址和第二共享内存的地址;根据获取的第一共享内存的地址读取第一共享内存中的数据,根据获取的第二共享内存的地址将读取的第一共享内存中的数据写入第二共享内存中。
步骤104,第一进程修改第二共享内存中的数据。
当第一进程需修改第一共享内存中的数据时,由于将第一共享内存中的数据复制到了第二共享内存中,第一进程可对第二共享内存中的数据进行修改。比如,第一共享内存中有3个数据,需要修改第2个数据,将这3个数据复制到了第二共享内存中后,第一进程可直接对第二共享内存中的第2个数据进行修改,将需修改的信息写入第二共享内存中的第2个数据中。
步骤106,第二共享内存中的数据修改完毕后,将存储的当前数据区的地址由第一共享内存的地址修改为第二共享内存的地址。
在一个实施例中,在第二共享内存中的数据修改完毕之前,还包括:第二进程获取存储的当前数据区的地址为第一共享内存的地址,根据第一共享内存的地址读取第一共享内存中的数据。
第二进程与第一进程也是相对的概念,第二进程为与第一进程不同的需读取当前数据区中的数据的一个或多个进程。本实施例中,当第二进程需读取当前数据区中的数据时,可先从第三共享内存中获取当前数据区的地址,如上所述,当前数据区的地址为第一共享内存的地址,则第二进程获取到的当前数据区的地址为第一共享内存的地址,根据该地址即可读取到第一共享内存中的数据。这样,在第二共享内存中的数据修改完毕之前,第二进程读取的仍然是第一共享内存中的数据(即修改前的旧数据)。
进一步的,在步骤106之后,还包括:第二进程获取存储的当前数据区的地址为第二共享内存的地址,根据第二共享内存的地址读取第二共享内存中的数据。
本实施例中,第一进程在修改完第二共享内存中的数据后,可将第三共享内存中存储的当前数据区的地址修改为第二共享内存的地址。如图3和图4所示,第一共享内存为共享内存A,第二共享内存为共享内存B,在共享内存B中的数据修改完毕前,第三共享内存中存储的指向当前数据区的指针指向共享内存A(参见图3),在共享内存B中的数据修改完毕后,则第三共享内存中存储的指向当前数据区的指针指向共享内存B(参见图4),使得当前数据区的地址变更为新数据所在地址。进一步的,在修改第三共享内存中指向当前数据区的指针时,可为该指针添加保护,以防止修改指针时导致程序出现问题。
之后,当第二进程需读取当前数据区中的数据时,可先从第三共享内存中获取当前数据区的地址,由于此时第三共享内存中的当前数据区的地址已修改为第二共享内存的地址,因此第二进程根据获取到的当前数据区的地址即可读取到第二共享内存中的数据。这样,在第二共享内存中的数据修改完毕之后,第二进程读取到的是第二共享内存中的数据(即修改后的新数据)。
如图5所示,在一个实施例中,还提供了一种多进程操作共享内存的装置,包括:
数据复制模块502,用于当第一进程需修改第一共享内存中的数据时,将第一共享内存中的数据复制到预分配的与第一共享内存大小相等的第二共享内存中。
数据修改模块504,用于通过第一进程修改第二共享内存中的数据。
地址修改模块506,用于在第二共享内存中的数据修改完毕后,将存储的当前数据区的地址由第一共享内存的地址修改为第二共享内存的地址。
第一共享内存和第二共享内存是预先分配的大小相等的共享内存。当需要某一大小的共享内存时,则预先分配两倍大小的共享内存,其中一半共享内存为第一共享内存,另一半共享内存则为第二共享内存。本实施例以当前数据区为第一共享内存进行举例说明。
在一个实施例中,如图6所示,在图5所示实施例的基础上,多进程操作共享内存的装置,还包括:
内存分配模块501,用于当需第一大小的共享内存时,分配第一大小的第一共享内存和与第一共享内存大小相等的第二共享内存。
第三共享内存创建模块503,用于创建第三共享内存,在第三共享内存中存储第一共享内存的地址、第二共享内存的地址和当前数据区的地址;该当前数据区的地址为第一共享内存的地址。
本实施例中,第三共享内存用于管理第一共享内存和第二共享内存。进一步的,在第三共享内存中可存储三个指针,这三个指针分别指向第一共享内存的地址、第二共享内存的地址和当前数据区的地址。其中第一共享内存的地址可为第一共享内存的起始位置,第二共享内存的地址可为第二共享内存的起始位置。本实施例由于当前数据区为第一共享内存,则当前数据区的地址为第一共享内存的起始位置。
进一步的,在一个实施例中,数据复制模块502用于获取第三共享内存中存储的第一共享内存的地址和第二共享内存的地址;根据获取的第一共享内存的地址读取第一共享内存中的数据,根据获取的第二共享内存的地址将读取的第一共享内存中的数据写入第二共享内存中。
当第一进程需修改第一共享内存中的数据时,由于数据复制模块502将第一共享内存中的数据复制到了第二共享内存中,则数据修改模块504可通过第一进程可对第二共享内存中的数据进行修改。
进一步的,在一个实施例中,如图7所示,在图6所示实施例的基础上,多进程操作共享内存的装置,还包括:
数据读取模块508,用于在第二共享内存中的数据修改完毕前,通过第二进程获取存储的当前数据区的地址为第一共享内存的地址,根据第一共享内存的地址读取第一共享内存中的数据;以及用于在第二共享内存中的数据修改完毕后,通过第二进程获取存储的当前数据区的地址为第二共享内存的地址,根据第二共享内存的地址读取第二共享内存中的数据。
第二进程为与第一进程不同的需读取当前数据区中的数据的一个或多个进程。本实施例中,当第二进程需读取当前数据区中的数据时,数据读取模块508可先从第三共享内存中获取当前数据区的地址,如上所述,当前数据区的地址为第一共享内存的地址,则数据读取模块508通过第二进程获取到的当前数据区的地址为第一共享内存的地址,根据该地址即可读取到第一共享内存中的数据。这样,在第二共享内存中的数据修改完毕之前,第二进程读取的仍然是第一共享内存中的数据(即修改前的旧数据)。
进一步的,地址修改模块506在数据修改模块504通过第一进程修改完第二共享内存中的数据后,可用于将第三共享内存中存储的当前数据区的地址修改为第二共享内存的地址,使得当前数据区的地址变更为新数据所在地址。
当第二进程需读取当前数据区中的数据时,数据读取模块508可用于先从第三共享内存中获取当前数据区的地址,由于此时第三共享内存中的当前数据区的地址已修改为第二共享内存的地址,因此数据读取模块508通过第二进程根据获取到的当前数据区的地址即可读取到第二共享内存中的数据。这样,在第二共享内存中的数据修改完毕之后,第二进程读取到的是第二共享内存中的数据(即修改后的新数据)。
上述多进程操作共享内存的方法和装置,由于在第一进程要修改第一共享内存中的数据时,将第一共享内存中的数据复制到了预分配的与第一共享内存大小相等的第二共享内存中,使得第一进程的数据写入可在第二共享内存中进行。这样,在第一进程的写操作执行过程中,第二进程仍可以读取到修改前的数据,因而读取数据的进程不会被阻塞。而在第二共享内存中的数据修改完毕后,将存储的当前数据区的地址由第一共享内存的地址修改为第二共享内存的地址,使得数据写入完成后,读取数据的进程能够读取到新的数据。因此,上述多进程操作共享内存的方法和装置能够提高设备的处理效率,从而提高设备的处理性能。另外,由于没有为共享内存设置资源锁,进程无需竞争资源就能够对共享内存实现读操作或写操作,且读操作的进程不会因为有进程在执行写操作而阻塞,而写操作的进程也不会因为有进程在执行读操作而阻塞,实现了读写操作的并发执行。
如图8所示,在一个实施例中,提供了另一种多进程操作共享内存的方法,包括:
步骤802,当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入空闲可用的第二数据区。
步骤804,数据写入完成后,判断第二进程的读取操作是否结束,若是,则进入步骤806,否则等待,返回步骤804,直到第二进程的读取操作结束。
步骤806,将链表设置为不可读状态。
步骤808,将第二数据区***链表中,使第一节点对应第二数据区。
步骤810,将链表设置为可读状态。
本实施例中,通过链表来管理共享内存,链表中的每个节点对应共享内存中的一个数据区,节点对应的数据区组成共享内存。图9示出了一个包含3个节点的链表的示意图,链表由表头和对应数据区的多个节点组成,每个节点包含前向指针(prev)和后向指针(next),其中,前向指针指向前一个节点对应的数据区的起始位置,后向指针指向后一个节点对应的数据区的起始位置。以图9中的节点2举例说明,节点2的前向指针指向节点1对应的数据区1的起始位置,节点2的后向指针则指向节点3对应的数据区3的起始位置,根据节点2中的前向指针和后向指针即可得到数据区1的地址和数据区2的地址。
本实施例中,第一节点为第一进程需要修改的数据区对应的节点,当第一进程需修改链表中的第一节点对应的第一数据区中的数据时,则开辟一块新的空闲可用的第二数据区。优选的,第二数据区与第一数据区大小相等。第一进程则将修改的数据写入到第二数据区中。当数据写入完成后,判断第二进程的读取操作是否结束,如果结束,则将链表设置为不可读状态。具体的,可为共享内存设置一个标志位,表示当前共享内存不可读,这样,进程将无法对共享内存进行读操作或写操作。进一步的,在将链表设置为不可读状态后,可将第二数据区***链表中,使得第一节点对应第二数据区。
如图9所示,当第一进程需要修改节点2对应的数据区2中的数据时,将修改的数据写入第二数据区中,并在数据写入完成后且第二进程的读取操作结束后,将链表设置为不可读,修改节点1和节点3的指针信息,使得节点1的后向指针指向第二数据区的起始位置,节点3的前向指针指向第二数据区的起始位置,这样,则将第二数据区加入到了链表中,节点2对应第二数据区。
在链表中的节点信息更新完后,再将链表设置为可读状态。在一个实施例中,当链表为可读状态时,第二进程根据链表中的节点的指针信息获取节点对应的数据区中的地址,根据获取的地址读取节点对应的数据区中的数据。本实施例中,第二进程为与第一进程不同的需读取当前数据区中的数据的一个或多个进程。在链表为可读状态时,则第二进程根据链表读取到共享内存中的数据。
在一个实施例中,多进程操作共享内存的方法还包括:当第二进程在读取节点对应的数据区中的数据时,对节点对应的引用计数进行递增;当第二进程对节点对应的数据区中的数据读取完毕后,对节点对应的引用计数进行递减。本实施例中,每个节点还包含对应的引用计数,在有进程读取该节点对应的数据区中的数据时,则引用计数递增,在读取完毕后,则引用计数递增。如图10所示,可在节点中存储该引用计数。
进一步的,在一个实施例中,判断第二进程的读取操作是否结束,包括:判断节点对应的引用计数是否为预设的递减后的数值,若是,则判定第二进程对该节点对应的数据区的读取操作结束,否则,判定第二进程对该节点对应的数据区的读取操作没有结束。
优选的,可设置每个节点对应的引用计数的初始值为0,当有进程读取该节点对应的数据区中的数据时,则引用计数加1,当读取完毕后,则引用计数减1。这样,判断节点对应的引用计数是否为0,如果为0,则判定第二进程对该节点对应的数据区的读取操作结束,否则,没有结束。
在一个实施例中,可在将第二数据区***链表中,使第二节点对应第二数据区之后,释放第一数据区的内存空间。由于第二数据区***链表且链表恢复可读状态后,进程根据链表则能够读取到第二数据区中的数据(即新的数据),而第一数据区的内存空间可释放掉,这样,能够节省内存资源,提供更多的空闲可用的内存空间。
如图11所示,在一个实施例中,还提供了另一种多进程操作共享内存的装置,包括:
数据写入模块1102,用于当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入与第一数据区大小相等且空闲可用的第二数据区。
读操作判断模块1104,用于数据写入模块数据写入完成后,判断第二进程的读取操作是否结束。
状态设置模块1106,用于当第二进程的读取操作结束时,将链表设置为不可读状态,否则等待,直到第二进程的读取操作结束,再将链表设置为不可读状态。
链表更新模块1108,用于将第二数据区***链表中,使第一节点对应第二数据区。
本实施例中,状态设置模块1106还用于在链表更新模块将第二数据区***链表中之后,将链表设置为可读状态。
本实施例中,通过链表来管理共享内存,链表中的每个节点对应共享内存中的一个数据区,节点对应的数据区组成共享内存。第一节点为第一进程需要修改的数据区对应的节点,当第一进程需修改链表中的第一节点对应的第一数据区中的数据时,数据写入模块1102则用于开辟一块新的空闲可用的第二数据区。优选的,数据写入模块1102所开辟的第二数据区与第一数据区大小相等。通过第一进程则将修改的数据写入到第二数据区中。
读操作判断模块1104用于当数据写入模块1102的数据写入完成后,判断第二进程的读取操作是否结束,如果结束,则状态设置模块1106将链表设置为不可读状态。具体的,状态设置模块1106可用于为共享内存设置一个标志位,表示当前共享内存不可读,这样,进程将无法对共享内存进行读操作或写操作。进一步的,在将链表设置为不可读状态后,链表更新模块1108可将第二数据区***链表中,使得第一节点对应第二数据区。状态设置模块1106在链表中的节点信息更新完后,再将链表设置为可读状态。
在一个实施例中,如图12所示,多进程操作共享内存的装置,还包括:
数据读取模块1107,用于在链表为可读状态时,通过第二进程根据链表中的节点的指针信息获取节点对应的数据区中的地址,根据获取的地址读取节点对应的数据区中的数据。
内存释放模块1109,用于在链表更新模块1108将第二数据区***链表中之后,释放第一数据区的内存空间。
在一个实施例中,如图13所示,多进程操作共享内存的装置,还包括:
引用计数模块1110,用于当第二进程在读取节点对应的数据区中的数据时,对节点对应的引用计数进行递增;当第二进程对节点对应的数据区中的数据读取完毕后,对节点对应的引用计数进行递减。
进一步的,读操作判断模块1104用于判断节点对应的引用计数是否为预设的递减后的数值,若是,则判定第二进程对该节点对应的数据区的读取操作结束,否则,判定第二进程对该节点对应的数据区的读取操作没有结束。
优选的,引用计数模块1110可用于设置每个节点对应的引用计数的初始值为0,当有进程读取该节点对应的数据区中的数据时,则引用计数加1,当读取完毕后,则引用计数减1。这样,读操作判断模块1104用于判断节点对应的引用计数是否为0,如果为0,则判定第二进程对该节点对应的数据区的读取操作结束,否则,没有结束。
上述多进程操作共享内存的方法和装置,当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入空闲可用的第二数据区中,由于第一进程的写操作可以在第二数据区中执行,不会影响第二进程的读取操作,使得共享内存的写操作和读操作可以同步执行,读取数据的进程不会因为第一进程的写操作而阻塞。由于没有为共享内存设置资源锁,进程无需竞争资源就能够对共享内存实现读操作和写操作,且读操作的进程不会因为有进程在执行写操作而阻塞,而写操作的进程也不会因为有进程在执行读操作而阻塞,实现了读写操作的并发执行,从而提高了设备的处理效率。
在第一进程的数据写入完成且第二进程的读取操作结束后,再将链表设置为不可读状态,并将第二数据区***链表中,使得仅仅是在更新链表的时候对共享内存的读操作和写操作不可执行,而在链表的更新过程中将链表设置为不可读状态能够防止由于链表的更新而导致数据读取错误。而在将第二数据区***链表之后,再将链表设置为可读状态,使得共享内存的读操作和写操作恢复可执行,且进程再读取共享内存时能够读取到新的数据。由于在有进程需修改共享内存中的数据时,只需要开辟与第一节点对应的第一数据区大小相等的第二数据区,而非开辟整块共享内存,因此能够节省内存资源。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,如本发明实施例中,该程序存储于终端的存储介质中,并被该终端中的至少一个处理器执行,以实现包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

Claims (8)

1.一种多进程操作共享内存的方法,所述方法包括:
当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入空闲可用的第二数据区;
数据写入完成后,判断第二进程的读取操作是否结束,若是,则将所述链表设置为不可读状态,否则等待,直到所述第二进程的读取操作结束;
将所述第二数据区***所述链表中,使所述第一节点对应所述第二数据区;
将所述链表设置为可读状态;
当所述第二进程在读取节点对应的数据区中的数据时,对所述节点对应的引用计数进行递增;
当所述第二进程对节点对应的数据区中的数据读取完毕后,对所述节点对应的引用计数进行递减。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述链表为可读状态时,第二进程根据所述链表中的节点的指针信息获取节点对应的数据区中的地址,根据所述获取的地址读取节点对应的数据区中的数据。
3.根据权利要求1所述的方法,其特征在于,所述判断第二进程的读取操作是否结束,包括:
判断节点对应的引用计数是否为预设的递减后的数值,若是,则判定第二进程对所述节点对应的数据区的读取操作结束,否则,判定第二进程对所述节点对应的数据区的读取操作没有结束。
4.根据权利要求1所述的方法,其特征在于,在所述将第二数据区***所述链表中,使所述第一节点对应所述第二数据区之后,还包括:
释放所述第一数据区的内存空间。
5.一种多进程操作共享内存的装置,其特征在于,所述装置包括:
数据写入模块,用于当第一进程需修改链表中的第一节点所对应的第一数据区中的数据时,将数据写入与所述第一数据区大小相等且空闲可用的第二数据区;
读操作判断模块,用于所述数据写入模块数据写入完成后,判断第二进程的读取操作是否结束;
状态设置模块,用于当所述第二进程的读取操作结束时,将所述链表设置为不可读状态,否则等待,直到所述第二进程的读取操作结束,再将所述链表设置为不可读状态;
链表更新模块,用于将所述第二数据区***所述链表中,使所述第一节点对应所述第二数据区;
所述状态设置模块还用于在所述链表更新模块将第二数据区***所述链表中之后,将所述链表设置为可读状态;
引用计数模块,用于当第二进程在读取节点对应的数据区中的数据时,对所述节点对应的引用计数进行递增;当第二进程对节点对应的数据区中的数据读取完毕后,对所述节点对应的引用计数进行递减。
6.根据权利要求5所述的装置,其特征在于,所述装置还包括:
数据读取模块,用于在所述链表为可读状态时,通过第二进程根据所述链表中的节点的指针信息获取节点对应的数据区中的地址,根据所述获取的地址读取节点对应的数据区中的数据。
7.根据权利要求5所述的装置,其特征在于,所述读操作判断模块用于判断节点对应的引用计数是否为预设的递减后的数值,若是,则判定第二进程对所述节点对应的数据区的读取操作结束,否则,判定第二进程对所述节点对应的数据区的读取操作没有结束。
8.根据权利要求5所述的装置,其特征在于,所述装置还包括:
内存释放模块,用于在所述链表更新模块将第二数据区***所述链表中之后,释放所述第一数据区的内存空间。
CN201310370343.2A 2013-08-22 2013-08-22 多进程操作共享内存的方法和装置 Active CN104424030B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310370343.2A CN104424030B (zh) 2013-08-22 2013-08-22 多进程操作共享内存的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310370343.2A CN104424030B (zh) 2013-08-22 2013-08-22 多进程操作共享内存的方法和装置

Publications (2)

Publication Number Publication Date
CN104424030A CN104424030A (zh) 2015-03-18
CN104424030B true CN104424030B (zh) 2020-01-14

Family

ID=52973095

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310370343.2A Active CN104424030B (zh) 2013-08-22 2013-08-22 多进程操作共享内存的方法和装置

Country Status (1)

Country Link
CN (1) CN104424030B (zh)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107704325B (zh) * 2016-08-08 2021-08-27 北京百度网讯科技有限公司 用于进程间传输消息的方法和装置
CN106776145B (zh) * 2016-12-29 2020-04-03 上海爱数信息技术股份有限公司 数据库备份性能的控制方法、***及服务器
CN106980551A (zh) * 2017-03-24 2017-07-25 山东浪潮商用***有限公司 一种进程通信方法及装置
CN109298935B (zh) * 2018-09-06 2023-02-03 华泰证券股份有限公司 一种多进程单写多读无锁共享内存的方法及应用
CN110020328A (zh) * 2019-04-16 2019-07-16 北京字节跳动网络技术有限公司 在线表格的数据处理方法、装置、电子设备及存储介质
CN110442462B (zh) 2019-07-16 2020-07-28 阿里巴巴集团控股有限公司 Tee***中的多线程数据传输方法和装置
CN110399235B (zh) 2019-07-16 2020-07-28 阿里巴巴集团控股有限公司 Tee***中的多线程数据传输方法和装置
US10699015B1 (en) 2020-01-10 2020-06-30 Alibaba Group Holding Limited Method and apparatus for data transmission in a tee system
CN111162947B (zh) * 2019-12-30 2022-08-12 北京天融信网络安全技术有限公司 一种pcre热切换方法、网络设备及存储介质
CN113806239A (zh) * 2020-06-11 2021-12-17 中兴通讯股份有限公司 一种内存操作控制方法、设备及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1908934A (zh) * 2006-08-02 2007-02-07 华为技术有限公司 一种嵌入式数据库的在线升级控制方法和装置
CN101470632A (zh) * 2007-12-24 2009-07-01 华为软件技术有限公司 共享内存管理方法及装置
CN103164384A (zh) * 2011-12-15 2013-06-19 ***股份有限公司 多机***共享内存的同步实现方法及其***

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4506292B2 (ja) * 2004-06-10 2010-07-21 株式会社日立製作所 キャッシュ制御方法およびデータ処理システム並びにその処理プログラム
JP4210318B1 (ja) * 2007-11-28 2009-01-14 株式会社京都ソフトウェアリサーチ データ格納システムおよびデータ格納プログラム

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1908934A (zh) * 2006-08-02 2007-02-07 华为技术有限公司 一种嵌入式数据库的在线升级控制方法和装置
CN101470632A (zh) * 2007-12-24 2009-07-01 华为软件技术有限公司 共享内存管理方法及装置
CN103164384A (zh) * 2011-12-15 2013-06-19 ***股份有限公司 多机***共享内存的同步实现方法及其***

Also Published As

Publication number Publication date
CN104424030A (zh) 2015-03-18

Similar Documents

Publication Publication Date Title
CN104424030B (zh) 多进程操作共享内存的方法和装置
CN110287044B (zh) 无锁共享内存处理方法、装置、电子设备及可读存储介质
US6668291B1 (en) Non-blocking concurrent queues with direct node access by threads
US7673105B2 (en) Managing memory pages
US9128615B2 (en) Storage systems that create snapshot queues
CN107066498B (zh) 键值kv存储方法和装置
EP3462324B1 (en) Pointers in a memory managed system
WO2013160724A1 (en) Data processing system and method for operating a data processing system
CN112905365A (zh) 一种数据处理方法、装置、设备及介质
CN112925606B (zh) 一种内存管理方法、装置及设备
JP2016533588A (ja) 記憶処理方法、装置及び端末
CN107451070B (zh) 一种数据的处理方法和服务器
CN108829345B (zh) 日志文件的数据处理方法和终端设备
CN104572483B (zh) 动态内存管理装置及方法
CN116204124B (zh) 一种基于冲突锁的数据处理方法、***及电子设备
CN116661690A (zh) 记录内存状态的方法、装置、计算机设备及存储介质
EP3249540A1 (en) Method for writing multiple copies into storage device, and storage device
US9418175B2 (en) Enumeration of a concurrent data structure
CN108874560B (zh) 进行通信的方法和通信设备
EP4134802A1 (en) Method and apparatus for data access of nand flash file, and storage medium
CN110874273B (zh) 一种数据处理方法及装置
CN114201331B (zh) 固态硬盘的指令冲突检测方法、装置、设备和存储介质
CN117406933B (zh) 固态硬盘数据处理方法、装置、电子设备及存储介质
KR101881038B1 (ko) 비휘발성 메모리에 저장된 메모리 매핑 파일의 원자적 업데이트 방법 및 제어 장치
CN112068948A (zh) 数据散列方法、可读存储介质和电子设备

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant