CN111897666B - 用于多进程之间通信的方法、设备及系统 - Google Patents

用于多进程之间通信的方法、设备及系统 Download PDF

Info

Publication number
CN111897666B
CN111897666B CN202010778905.7A CN202010778905A CN111897666B CN 111897666 B CN111897666 B CN 111897666B CN 202010778905 A CN202010778905 A CN 202010778905A CN 111897666 B CN111897666 B CN 111897666B
Authority
CN
China
Prior art keywords
shared memory
module
notification
file descriptor
sender
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
CN202010778905.7A
Other languages
English (en)
Other versions
CN111897666A (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.)
Beijing Tusen Weilai Technology Co Ltd
Original Assignee
Beijing Tusen Weilai Technology 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 Beijing Tusen Weilai Technology Co Ltd filed Critical Beijing Tusen Weilai Technology Co Ltd
Priority to CN202410099166.7A priority Critical patent/CN118132286A/zh
Priority to CN202010778905.7A priority patent/CN111897666B/zh
Publication of CN111897666A publication Critical patent/CN111897666A/zh
Application granted granted Critical
Publication of CN111897666B publication Critical patent/CN111897666B/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/546Message passing systems or structures, e.g. queues
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及一种用于多进程之间通信的方法、设备及系统。在一些实施例中,所述方法包括:向操作系统申请文件描述符;建立所述文件描述符与共享内存之间的映射关系;将所述映射关系存储在共享内存管理模块中;以及将所述文件描述符发送给接收者模块。本发明的方案解决现有共享内存技术中由于进程意外退出所导致的系统安全性问题,且实现了对共享内存生命周期的管理并保证了通知机制的健壮性。

Description

用于多进程之间通信的方法、设备及系统
技术领域
本发明涉及计算机技术领域,特别是涉及一种用于多进程之间通信的方法、设备及系统。
背景技术
随着计算机技术的飞速发展和人们对应用程序的要求越来越高,单进程程序在许多场合已经不能满足人们的需求,编写多进程、多线程程序成为现代程序设计的一个重要的特点。在多进程程序设计中,进程间通信是不可避免的。进程间进行通信,不可避免的需要进行大数据块的传递。
共享内存允许两个或多个进程共享给定的内存区域。由于进程可以直接读写内存,而不需要任何数据的拷贝,因此共享内存是一种进程间通信(简称IPC,Inter-ProcessCommunication)的有效机制,尤其是在具有多个接收器的情况下。并且,减少的数据拷贝量可以大大降低存储器所需的吞吐量。
尽管基于共享内存的方法可提高性能且减少内存访问,但它通常会导致系统安全问题。例如,在进程意外退出时共享内存无法释放,从而会浪费系统资源。更严重的是,在某些实现中,会将用于同步功能的锁放置在共享内存中。该用于同步功能的锁是具有状态的量,当进程需要使用共享内存的资源时,其进行加锁操作,在使用完成后,其进行解锁操作。如果进程在使用共享内存的过程中意外退出,那么该用于同步功能的锁就进入锁定状态,此后,如果有另一进程需要使用共享内存的资源,则该进程将不能完成加锁操作。这种情况也被称为“锁不一致”。即,进程的意外退出会使得锁处于不一致状态,使得其他和该共享内存相关的进程被锁住,永远不能获得该共享内存的资源。对于实时性要求比较严格的无人驾驶系统而言,该问题会严重影响无人驾驶系统的稳定性和安全性。
发明内容
为了解决上述技术问题,本发明实施例公开了如下技术方案:
在一方面中,本发明提供一种用于多进程之间通信的方法,包括:向操作系统申请文件描述符;建立所述文件描述符与共享内存之间的映射关系;将所述映射关系存储在共享内存管理模块中;以及将所述文件描述符发送给接收者模块。
可选地,所述方法进一步包括:在将所述文件描述符发送给接收者模块之前,向所述操作系统申请unix网络套接字;以及将所述unix网络套接字存储在通知模块中。
可选地,将所述文件描述符发送给接收者模块包括:将所述文件描述符通过所述通知模块中的unix网络套接字发送给所述接收者模块。
可选地,所述unix网络套接字是抽象unix域套接字。
可选地,所述方法进一步包括:在将所述文件描述符发送给接收者模块之后,向所述操作系统申请共享内存中的内存空间;将数据存储在所述内存空间中;以及将所述内存空间的描述信息发送给所述接收者模块。
可选地,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小。
可选地,将所述内存空间的描述信息发送给所述接收者模块包括:将所述内存空间的描述信息通过所述通知模块中的unix网络套接字发送给所述接收者模块。
在另一方面中,本发明提供一种用于多进程之间通信的方法,包括:从发送者模块接收文件描述符;将所述文件描述符映射为共享内存;关闭所述文件描述符;以及在共享内存管理模块中保存所述共享内存的信息。
可选地,所述方法进一步包括:在从发送者模块接收文件描述符之前,向所述操作系统申请unix网络套接字;以及将所述unix网络套接字存储在通知模块中。
可选地,从发送者模块接收文件描述符包括:通过所述通知模块中的unix网络套接字从所述发送者模块接收所述文件描述符。
可选地,所述unix网络套接字是抽象unix域套接字。
可选地,所述方法进一步包括:在从发送者模块接收文件描述符之后,从所述发送者模块接收所述共享内存中的内存空间的描述信息;以及基于所述描述信息从所述内存空间读取数据。
可选地,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小。
可选地,从所述发送者模块接收所述共享内存中的内存空间的描述信息包括:通过所述通知模块中的unix网络套接字从所述发送者模块接收所述内存空间的描述信息。
在又一方面中,本发明提供一种用于多进程之间通信的设备,包括:内存管理模块,所述内存管理模块经配置以向操作系统申请文件描述符,建立所述文件描述符与共享内存之间的映射关系,以及将所述映射关系存储在所述共享内存管理模块中;以及通知模块,所述通知模块耦合到所述内存管理模块,且经配置以将所述文件描述符发送给接收者模块。
可选地,所述通知模块进一步经配置以:向所述操作系统申请unix网络套接字;以及将所述unix网络套接字存储在所述通知模块中。
可选地,所述通知模块经配置以通过所述unix网络套接字将所述文件描述符发送给所述接收者模块。
可选地,所述unix网络套接字是抽象unix域套接字。
可选地,所述内存管理模块进一步经配置以向所述操作系统申请共享内存中的内存空间,以及将数据存储在所述内存空间中;以及所述通知模块进一步经配置以将所述内存空间的描述信息发送给所述接收者模块。
可选地,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小。
可选地,所述通知模块经配置以通过所述unix网络套接字将所述内存空间的描述信息发送给所述接收者模块。
在又一方面中,本发明提供一种用于多进程之间通信的设备,包括:通知模块,所述通知模块经配置以从发送者模块接收文件描述符;以及内存管理模块,其耦合到所述通知模块且经配置以:将所述文件描述符映射为共享内存,关闭所述文件描述符,以及在所述共享内存管理模块中保存所述共享内存的信息。
可选地,所述通知模块进一步经配置以:向操作系统申请unix网络套接字;以及将所述unix网络套接字存储在所述通知模块中。
可选地,所述通知模块经配置以通过所述unix网络套接字接收所述文件描述符。
可选地,所述unix网络套接字是抽象unix域套接字。
可选地,所述通知模块进一步经配置以从所述发送者模块接收所述共享内存中的内存空间的描述信息;以及所述内存管理模块进一步经配置以基于所述描述信息从所述内存空间读取数据。
可选地,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小。
可选地,所述通知模块经配置以通过所述unix网络套接字接收所述内存空间的描述信息。
在又一方面中,本发明提供一种用于多进程之间通信的系统,包括发送者模块和接收者模块。所述发送者模块经配置以:向操作系统申请文件描述符;建立所述文件描述符与共享内存之间的映射关系;将所述映射关系存储在所述发送者模块的共享内存管理模块中;以及将所述文件描述符发送给所述接收者模块。所述接收者模块耦合到所述发送者模块且经配置以:从所述发送者模块接收文件描述符;将所述文件描述符映射为共享内存;关闭所述文件描述符;以及在所述接收者模块的共享内存管理模块中保存所述共享内存的信息。
在又一方面中,本发明提供一种计算机可读存储介质,其上存储有程序或指令,所述程序或指令在被处理器执行时实现上述用于多进程之间通信的方法。
在又一方面中,本发明提供一种包含指令的计算机程序产品,当所述计算机程序产品在计算机上运行时,使得计算机执行上述用于多进程之间通信的方法。
在本发明实施例提供的用于多进程之间通信的方法、设备及系统中,仅通过发送者模块管理共享内存,接收者模块只能在没有修改权限的情况下查看/读取它,这与现有技术中发送者模块和接收者模块均可以管理共享内存的技术不同。在本发明的技术方案中,共享内存资源可通过文件描述符的形式申请和传递的,如果发送者模块或者接收者模块意外退出,操作系统会根据该资源的引用计数决定是否需要回收该资源。此外,本发明中的通知形式可通过抽象unix域套接字实现的,不存在现有技术中的锁,不会使得其他和该共享内存相关的进程被锁住。基于此,一方面可实现对共享内存生命周期的管理,另一方面可保证通知机制的健壮性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了根据本发明的一些实施例的用于多进程之间通信的方法的流程图;
图2示出了根据本发明的另一些实施例的用于多进程之间通信的方法的流程图;
图3示出了根据本发明的一些实施例的发送者模块与接收者模块进行通信的示意图;
图4示出了根据本发明的一些实施例的用于多进程之间通信的设备的简化框图;
图5示出了根据本发明的另一些实施例的用于多进程之间通信的设备的简化框图;以及
图6示出了根据本发明的一些实施例的用于多进程之间通信的系统的简化框图。
具体实施方式
下面将结合附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员可以作出各种变型和变换,所有以等同方式变换获得的技术方案都属于本发明保护的范围。
为了便于清楚描述本发明实施例的技术方案,在本发明的实施例中,采用了“第一”、“第二”等字样对功能或作用基本相同的相同项或相似项进行区分,本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
单机多进程进行通信时,在追求通信效率的情况下一般会采用共享内存进行通信。例如,百度无人驾驶系统apollo的共享内存模型由boost库的interprocess模块实现。ROS2(robot operating system 2,机器人操作系统2)社区实现的rmw_iceoryx_cpp提供了零拷贝的共享内存技术。MPI(message passing interface,消息传递接口)实现了适用于特定通信模型的共享内存模型。Nvidia的mps(multi-process service,多进程服务)也利用了共享内存技术加速客户端(client)和服务器(server)之间的通信效率。以上共享内存技术相较于其他进程间通信形式(例如套接字、消息队列等)都有着较高的传输效率,可以提升系统的整体性能,减少内存中数据的拷贝。
但是,现有的共享内存技术没能做到对共享内存生命周期的很好的管理,在进程意外退出时共享内存无法销毁,使得该资源无法释放,从而造成系统资源的浪费。此外,为了避免争用情况并控制不同的进程在共享内存中读取和写入相同的数据,需要使用读写锁,该读写锁通常被保存在共享内存中。当发布者(例如,进程)在共享内存中写入数据时,会将读写锁的状态设置为“写入”,以防止其他进程访问该共享内存。同样的,当订阅者(例如,进程)从共享内存中读取数据时,会将读写锁的状态改变为“读取”,这也阻止了其他进程同时在共享内存中写入数据,这使得共享内存成为有状态的。因此,如果发布者或订阅者意外退出,则状态始终存在并且变得不可更改,这可能导致严重的情况,即其他需要读取或写入该共享内存的进程由于锁获取失败而被阻塞。对于实时性要求比较严格的无人驾驶系统而言,该问题会严重的影响系统的稳定性和无人驾驶系统的安全性。
为解决上述技术问题,本发明的实施例提供了一种新的机制。一方面,该机制通过文件描述符来表示共享内存,实现对共享内存生命周期的管理。另一方面,该机制通过使用unix域套接字来传输文件描述符和控制信息,从而避免了常规锁放置在共享内存中一端崩溃后造成锁不一致的情形,提供了一种高性能和高可靠性的IPC方法。
参见图1,其示出了根据本发明的一些实施例的用于多进程之间通信的方法的流程图,该方法可由发送者(也称为发布者)模块执行。在一些实施例中,发送者模块指的是实现某一进程的软件和/或硬件的集合。
如图1所示,在步骤101中,发送者模块向操作系统申请文件描述符。
在执行步骤101之前,发送者模块可创建共享内存管理模块(或者,共享内存管理单元)和通知模块(例如,notifier)。共享内存管理模块用于管理共享内存,且管理元数据存储在进程地址空间中。共享内存管理模块包括Malloc/Free之类的接口,用于从中分配共享内存并回收。通知模块用于发送共享内存句柄(例如,SendNewFd)以及相对于共享内存基地址的偏移量和大小(例如,SendPointer)。在创建共享内存管理模块和通知模块后,步骤101由共享内存管理模块执行。
在一些实施例中,发送者模块通过调用系统函数(例如,memfd_create)向操作系统申请文件描述符,操作系统可以返回一个内存后端文件以作为文件描述符。
在接收到该文件描述符后,在步骤102中,发送者模块建立所述文件描述符与共享内存之间的映射关系。具体而言,发送者模块通过调用系统函数(例如,mmap)将该文件描述符映射成共享内存。
在步骤103中,发送者模块将上述映射关系存储在共享内存管理模块中,从而使得该共享内存管理模块可以管理该共享内存。例如,可以通过解除映射关系而释放共享内存。
在步骤104中,发送者模块将所述文件描述符发送给接收者模块。在一些实施例中,发送者模块可以将所述文件描述符发送给一个或多个接收者模块。步骤104可由发送者模块创建的通知模块执行。
在本发明的一些实施例中,在发送所述文件描述符之前,通知模块可向操作系统申请unix网络套接字,并在获得所述unix网络套接字后,将所述unix网络套接字存储在通知模块中。在本发明的一个实施例中,发送者模块可通过通知模块中的所申请的unix网络套接字将文件描述符发送给接收者模块。在本发明的另一个实施例中,所申请的unix网络套接字是抽象unix域套接字(abstract unix domain socket)。在本发明的又一个实施例中,文件描述符可指示共享内存的基地址且通过共享内存句柄(例如,SendNewFd)发送,例如,该共享内存句柄可为48字节。
当发送者模块需要发送数据时,其通过共享内存管理模块向操作系统申请共享内存中的内存空间,该内存空间为共享内存中的一块区域。发送者模块将数据存储在该内存空间中,然后将内存空间的描述信息发送给接收者模块。在本发明的一个实施例中,该内存空间的描述信息通过通知模块中的之前申请的unix网络套接字发送。在本发明的另一个实施例中,内存空间的描述信息包括所述内存空间的相对起始位置的偏移量(即,该内存空间的起始位置相对于共享内存的基地址的偏移量)和大小。在本发明的又一个实施例中,内存空间的描述信息可以通过SendPointer发送,例如,该SendPointer的大小可为52字节。
由于共享内存是以文件描述符的形式存在的,并没有文件系统的文件与之关联,当与该共享内存相关的最后一个进程退出时,无论是正常退出还是异常退出,操作系统都会回收该共享内存的资源而不会造成资源的泄漏。此外,由于共享内存由发送者模块创建和管理,接收者模块可从共享内存读取数据,但并不参与共享内存资源的管理,所以该模型可以简单高效的实现内存的快速分配和回收。并且,通知机制采用抽象unix域套接字(abstract unix domain socket)实现,其在内核中也表现为作为引用计数对象的文件描述符,当进程意外退出时该资源也可以被操作系统收回。同时,由于共享内存只提供简单的数据传输功能,通知功能并没有放置在共享内存中,因而不存在锁不一致的情形,可以实现崩溃安全(Crash-Safe)的通信形式。
参见图2,其示出了根据本发明的另一些实施例的用于多进程之间通信的方法的流程图,该方法可由接收者(也称为订阅者)模块执行。在一些实施例中,接收者模块指的是实现某一进程的软件和/或硬件的集合。
如图2所示,在步骤201中,接收者模块从发送者模块接收文件描述符。所述文件描述符对应于由发送者模块的共享内存管理模块管理的共享内存。在一些实施例中,接收者模块可以从一个或多个发送者模块分别接收其各自的文件描述符。
在执行步骤201之前,接收者模块可创建共享内存管理模块(或者,共享内存管理单元)和通知模块(例如,notifier)。与发送者模块的共享内存管理模块和通知模块不同,接收者模块在创建共享内存管理模块和通知模块时并不管理任何的共享内存和unix网络套接字。当发送者模块需要和接收者模块通信时,接收者模块首先借助外部的服务发现工具获取发送者模块服务的地址,然后通过接收者模块的通知模块连接上发送者模块的通知模块。在建立完和发送者模块的通知模块的连接之后,步骤201由接收者模块的通知模块执行。
在接收到该文件描述符后,在步骤202中,接收者模块将所述文件描述符映射为共享内存。具体而言,接收者模块通过调用系统函数(例如,mmap)将该文件描述符映射成共享内存。
在获得共享内存的信息后,在步骤203中,接收者模块将关闭所述文件描述符。
在步骤204中,接收者模块在共享内存管理模块中保存所述共享内存的信息(例如,共享内存的基地址)。
在本发明的一些实施例中,在接收所述文件描述符之前,接收者模块的通知模块可向操作系统申请unix网络套接字,在获得所述unix网络套接字后,将所述unix网络套接字存储在通知模块中。该unix网络套接字用于与发送者模块申请的unix网络套接字进行通信。接收者模块借助外部的服务发现工具获取发送者服务的地址,然后通过接收者模块的通知模块连接上发送者模块的通知模块。
在本发明的一个实施例中,接收者模块可通过通知模块中的其申请的unix网络套接字接收文件描述符。在本发明的另一个实施例中,所申请的unix网络套接字是抽象unix域套接字(abstract unix domain socket)。在本发明的又一个实施例中,文件描述符指示共享内存的基地址且通过共享内存句柄(例如,SendNewFd)接收,例如,该共享内存句柄可为48字节。
当接收模块需要接收数据时,其首先从发送者模块接收共享内存中的内存空间的描述信息,该内存空间用于存储发送者模块的数据。在本发明的一个实施例中,该内存空间的描述信息通过接收者模块的通知模块中的unix网络套接字接收。在本发明的另一个实施例中,内存空间的描述信息包括所述内存空间的相对起始位置的偏移量(即,该内存空间的起始位置相对于共享内存的基地址的偏移量)和大小。在本发明的又一个实施例中,内存空间的描述信息可以通过SendPointer接收,例如,该SendPointer的大小可为52字节。
在获得内存空间的描述信息后,接收者模块可基于所述描述信息从所述内存空间读取数据。
下面结合图1和图2所示的用于多进程之间通信的方法,描述本发明的技术方案中发送者模块和接收者模块之间的具体通信过程。例如,参见图3,其示出了根据本发明的一些实施例的发送者模块与接收者模块进行通信的示意图。以下实施例中与前述实施例相关的技术术语、概念等的说明可以参照前述实施例,这里不再赘述。
如图3所示,发送者模块301创建共享内存管理模块3011和通知模块3012。接收者模块302创建共享内存管理模块3021和通知模块3022。
在步骤S1中,发送者模块301的共享内存管理模块3011向操作系统303的存储器3031申请文件描述符。例如,发送者模块通过调用系统函数(例如,memfd_create)向操作系统申请文件描述符。然后,发送者模块将文件描述符映射为共享内存,例如,发送者模块通过调用系统函数(例如,mmap)将该文件描述符映射成共享内存,该共享内存为操作系统的存储器3031的一部分。发送者模块301将文件描述符与共享内存之间的映射关系存储到发送者模块301内部的共享内存管理模块3011。
在步骤S2中,发送者模块301的通知模块3012可向操作系统303的网络模块3032申请unix网络套接字(以下称为发送者unix网络套接字),在获得发送者unix网络套接字后,将发送者unix网络套接字存储在通知模块3012中。在一个实施例中,该发送者unix网络套接字可以是抽象unix域套接字。
在步骤S3中,接收者模块302的通知模块3022可向操作系统303的网络模块3032申请unix网络套接字(以下称为接收者unix网络套接字),在获得接收者unix网络套接字后,将接收者unix网络套接字存储在通知模块3022中。接收者unix网络套接字用于与发送者unix网络套接字通信。在一个实施例中,该接收者unix网络套接字可以是抽象unix域套接字。
在步骤S4中,接收者模块首先借助外部的服务发现工具获取发送者模块服务的地址,然后通过通知模块3022连接上发送者模块301的通知模块3012。
在步骤S5中,发送者模块301的通知模块3012首先将共享内存管理模块3011所管理的共享内存的文件描述符发送给接收者模块302的通知模块3022。该文件描述符通过发送者模块301的通知模块3012中的发送者unix网络套接字发送。
接收者模块302通过通知模块3022中的接收者unix网络套接字收到该文件描述符后,将其指定给接收者模块的内存管理单元3021,此时内存管理单元3021将其映射到共享内存,然后内存管理单元3021关闭该文件描述符,保留共享内存的信息(例如基地址)。内存管理单元3021并不管理共享内存,只是可以从共享内存读取数据。
在步骤S6中,当发送者模块需要发送数据给接收者模块时,其先通过发送者模块的共享内存管理模块3011申请共享内存中的内存空间,然后将数据拷贝到该内存空间中,再通过发送者模块的通知模块3012将该内存空间的描述信息(例如,相对起始位置的偏移量和大小)发送给接收者模块。该描述信息通过通知模块3012中的发送者unix网络套接字发送。
在步骤S7中,在接收者模块302的通知模块3022通过通知模块3022中的接收者unix网络套接字接收到描述信息后,共享内存管理模块3021通过其存储的共享内存信息以及接收到的描述信息,得到内存空间在共享内存中的位置,由此可以读取发送者模块的数据(其保存共享内存的内存空间中)。
当发送者模块发送完毕所有信息并且希望关闭通信时,可以选择性的在步骤S8中发送关闭指令(例如,SendCloseFd)给接收者模块。接收者模块收到关闭指令后,断开共享内存管理模块3021所关联的共享内存。
尽管图3中的示例示出了一个发送者模块和一个接收者模块,本领域技术人员可以理解,发送者模块和接收者模块均可以为多个,多个发送者模块和接收者模块的每对发送者模块和接收者模块之间的通信均可以为图3示出的过程。
以上过程中,共享内存资源是通过文件描述符的形式申请和传递的,如果发送者模块或者接收者模块意外退出,操作系统会根据该资源的引用计数决定是否需要回收该资源;通知形式是通过抽象unix域套接字实现的,要么通知成功,要么没有通知,不会像锁一样具有状态。通过上面的方法策略,本发明实现了对共享内存生命周期的管理和通知机制的健壮性。
参见图4,其示出了根据本发明的一些实施例的用于多进程之间通信的设备400的简化框图,该设备可以为发送者模块。以下实施例中与前述实施例相关的技术术语、概念等的说明可以参照前述实施例,这里不再赘述。
如图4所示,发送者模块包括:共享内存管理模块401以及通知模块402。所述共享内存管理模块401经配置以向操作系统申请文件描述符,建立所述文件描述符与共享内存之间的映射关系,以及将所述映射关系存储在所述共享内存管理模块401中。所述通知模块402耦合到所述内存管理模块,且经配置以将所述文件描述符发送给接收者模块。
在一些实施例中,通知模块402进一步经配置以向所述操作系统申请unix网络套接字,以及将所述unix网络套接字存储在通知模块402中。在一个实施例中,通知模块经配置以通过unix网络套接字将所述文件描述符发送给所述接收者模块。在另一个实施例中,unix网络套接字是抽象unix域套接字。
在一些实施例中,共享内存管理模块401进一步经配置以向所述操作系统申请共享内存中的内存空间,以及将数据存储在所述内存空间中。通知模块402进一步经配置以将所述内存空间的描述信息发送给所述接收者模块。在一个实施例中,内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小。在另一个实施例中,通知模块402经配置以通过所述unix网络套接字将所述内存空间的描述信息发送给所述接收者模块。
参见图5,其示出了根据本发明的另一些实施例的用于多进程之间通信的设备500的简化框图,该设备可以为接收者模块。以下实施例中与前述实施例相关的技术术语、概念等的说明可以参照前述实施例,这里不再赘述。
如图5所示,接收者模块包括:通知模块501以及共享内存管理模块502。所述通知模块501经配置以从发送者模块接收文件描述符。所述共享内存管理模块502耦合到所述通知模块501且经配置以:将所述文件描述符映射为共享内存,关闭所述文件描述符,以及在所述共享内存管理模块502中保存所述共享内存的信息。
在一些实施例中,通知模块501进一步经配置以向操作系统申请unix网络套接字,以及将所述unix网络套接字存储在通知模块501中。在一个实施例中,通知模块501经配置以通过所述unix网络套接字接收所述文件描述符。在另一个实施例中,unix网络套接字是抽象unix域套接字。
在一些实施例中,通知模块501进一步经配置以从所述发送者模块接收所述共享内存中的内存空间的描述信息;共享内存管理模块502进一步经配置以基于所述描述信息从所述内存空间读取数据。在一个实施例中,内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小。在另一个实施例中,通知模块501经配置以通过所述unix网络套接字接收所述内存空间的描述信息。
参见图6,其示出了根据本发明的一些实施例的用于多进程之间通信的系统600的简化框图,该系统包括发送者模块601(例如,图3的发送者模块301)以及耦合到发送者模块601的接收者模块602(例如,图3的接收者模块302)。以下实施例中与前述实施例相关的技术术语、概念等的说明可以参照前述实施例,这里不再赘述。
在一些实施例中,发送者模块601经配置以:向操作系统申请文件描述符;建立所述文件描述符与共享内存之间的映射关系;将所述映射关系存储在发送者模块601的共享内存管理模块中;以及将所述文件描述符发送给接收者模块602。接收者模块602经配置以:从发送者模块601接收文件描述符;将所述文件描述符映射为共享内存;关闭所述文件描述符;以及在接收者模块602的共享内存管理模块中保存所述共享内存的信息。
另外,本申请的一些实施例提供一种计算机可读存储介质,其上存储有程序或指令,所述程序或指令在被处理器执行时可实现上述用于多进程之间通信的方法。其具体实现方式可以参见上述结合图1-3所描述的实施例,此处不再赘述。
另外,本申请的一些实施例提供一种包含指令的计算机程序产品,当所述计算机程序产品在计算机上运行时,使得所述计算机执行上述用于多进程之间通信的方法。其具体实现方式可以参见上述结合图1-3所描述的实施例,此处不再赘述。
在一些实施例中,本文所述的模块可用硬件、软件、固件或其任何组合来实施。如果用软件实施,则所述功能可作为一或多个指令或代码在计算机可读介质上存储或传输,且由基于硬件的处理单元执行。计算机可读介质可包含计算机可读存储介质,所述计算机可读存储介质对应于有形介质,例如数据存储介质或包含(例如)根据通信协议促进计算机程序从一位置传送至另一位置的任何介质的通信介质。以此方式,计算机可读介质通常可对应于(1)有形计算机可读存储介质,其是非暂时性的,或(2)通信介质,例如信号或载波。数据存储介质可为可由一或多个计算机或一或多个处理器存取以检索用于实施本发明中描述的技术的指令、代码及/或数据结构的任何可用介质。计算机程序产品可以包含计算机可读介质。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的多进程系统中的共享内存管理装置,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,可以是电性、机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本发明实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器或者网络设备等)或处理器执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。

Claims (20)

1.一种用于多进程之间通信的方法,其特征在于,适于在发送者模块中执行,所述方法包括:
向操作系统申请文件描述符;
建立所述文件描述符与共享内存之间的映射关系;
将所述映射关系存储在共享内存管理模块中;
将所述文件描述符发送给接收者模块;
向所述操作系统申请所述共享内存中的内存空间;以及
将所述内存空间的描述信息发送给所述接收者模块,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小;
其中,共享内存只提供数据传输功能,通知功能没有放置在共享内存中,通知机制是通过抽象unix域套接字实现的,要么通知成功,要么没有通知,不会像锁一样具有状态,其中通知机制在内核中表现为作为引用计数对象的文件描述符,共享内存资源是通过文件描述符的形式申请和传递的,操作系统会根据共享内存资源的引用计数决定是否需要回收该资源。
2.根据权利要求1所述的方法,其特征在于,在将所述文件描述符发送给所述接收者模块之前,所述方法进一步包括:
向所述操作系统申请unix网络套接字;以及
将所述unix网络套接字存储在通知模块中。
3.根据权利要求2所述的方法,其特征在于,所述将所述文件描述符发送给接收者模块,包括:
将所述文件描述符通过所述通知模块中的unix网络套接字发送给所述接收者模块。
4.根据权利要求2所述的方法,其特征在于,所述unix网络套接字是抽象unix域套接字。
5.根据权利要求2所述的方法,其特征在于,所述发送者模块具有所述共享内存的管理权限,所述接收者模块能够从所述共享内存中读取数据,且不参与所述共享内存资源的管理。
6.根据权利要求1所述的方法,其特征在于,当与所述共享内存的最后一个进程退出时,所述操作系统回收所述共享内存资源。
7.根据权利要求1所述的方法,其特征在于,所述将所述内存空间的描述信息发送给所述接收者模块,包括:
将所述内存空间的描述信息通过通知模块中的unix网络套接字发送给所述接收者模块。
8.一种用于多进程之间通信的方法,其特征在于,适于在接收者模块中执行,所述方法包括:
从发送者模块接收文件描述符;
将所述文件描述符映射为共享内存;
关闭所述文件描述符;
在共享内存管理模块中保存所述共享内存的信息;
从所述发送者模块接收所述共享内存中的内存空间的描述信息,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小;以及
基于所述描述信息从所述内存空间读取数据;
其中,共享内存只提供数据传输功能,通知功能没有放置在共享内存中,通知机制是通过抽象unix域套接字实现的,要么通知成功,要么没有通知,不会像锁一样具有状态,其中通知机制在内核中表现为作为引用计数对象的文件描述符,共享内存资源是通过文件描述符的形式申请和传递的,操作系统会根据共享内存资源的引用计数决定是否需要回收该资源。
9.根据权利要求8所述的方法,其特征在于,在从所述发送者模块接收所述文件描述符之前,所述方法进一步包括:
向操作系统申请unix网络套接字;以及
将所述unix网络套接字存储在通知模块中。
10.根据权利要求9所述的方法,其特征在于,所述从发送者模块接收文件描述符,包括:
通过所述通知模块中的unix网络套接字从所述发送者模块接收所述文件描述符。
11.根据权利要求9所述的方法,其特征在于,所述unix网络套接字是抽象unix域套接字。
12.根据权利要求9所述的方法,其特征在于,所述发送者模块具有所述共享内存的管理权限,所述接收者模块能够从所述共享内存中读取数据,且不参与所述共享内存资源的管理。
13.根据权利要求8所述的方法,其特征在于,当与所述共享内存的最后一个进程退出时,所述操作系统回收所述共享内存资源。
14.根据权利要求12所述的方法,其特征在于,所述从所述发送者模块接收所述共享内存中的内存空间的描述信息,包括:
通过所述通知模块中的unix网络套接字从所述发送者模块接收所述内存空间的描述信息。
15.一种用于多进程之间通信的设备,其特征在于,包括:
内存管理模块,所述内存管理模块经配置以向操作系统申请文件描述符,建立所述文件描述符与共享内存之间的映射关系,以及将所述映射关系存储在所述共享内存管理模块中;以及
通知模块,所述通知模块耦合到所述内存管理模块,且经配置以将所述文件描述符发送给接收者模块;
所述共享内存管理模块还经配置以申请共享内存中的内存空间;
所述通知模块还经配置以将所述内存空间的描述信息发送给接收者模块,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小;
其中,共享内存只提供数据传输功能,通知功能没有放置在共享内存中,通知机制是通过抽象unix域套接字实现的,要么通知成功,要么没有通知,不会像锁一样具有状态,其中通知机制在内核中表现为作为引用计数对象的文件描述符,共享内存资源是通过文件描述符的形式申请和传递的,操作系统会根据共享内存资源的引用计数决定是否需要回收该资源。
16.一种用于多进程之间通信的设备,其特征在于,包括:
通知模块,所述通知模块经配置以从发送者模块接收文件描述符;以及
内存管理模块,其耦合到所述通知模块且经配置以将所述文件描述符映射为共享内存,关闭所述文件描述符,以及在所述共享内存管理模块中保存所述共享内存的信息;
所述通知模块进一步经配置以从所述发送者模块接收所述共享内存中的内存空间的描述信息,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小;
所述共享内存管理模块进一步经配置以基于所述描述信息从所述内存空间读取数据;
其中,共享内存只提供数据传输功能,通知功能没有放置在共享内存中,通知机制是通过抽象unix域套接字实现的,要么通知成功,要么没有通知,不会像锁一样具有状态,其中通知机制在内核中表现为作为引用计数对象的文件描述符,共享内存资源是通过文件描述符的形式申请和传递的,操作系统会根据共享内存资源的引用计数决定是否需要回收该资源。
17.一种用于多进程之间通信的系统,其特征在于,包括发送者模块和接收者模块,其中:
所述发送者模块经配置以:
向操作系统申请文件描述符;
建立所述文件描述符与共享内存之间的映射关系;
将所述映射关系存储在所述发送者模块的共享内存管理模块中;
将所述文件描述符发送给所述接收者模块;
向所述操作系统申请所述共享内存中的内存空间;以及
将所述内存空间的描述信息发送给接收者模块,所述内存空间的描述信息包括所述内存空间的相对起始位置的偏移量和大小;
所述接收者模块耦合到所述发送者模块且经配置以:
从所述发送者模块接收所述文件描述符;
将所述文件描述符映射为所述共享内存;
关闭所述文件描述符;以及
在所述接收者模块的共享内存管理模块中保存所述共享内存的信息;
其中,共享内存只提供数据传输功能,通知功能没有放置在共享内存中,通知机制是通过抽象unix域套接字实现的,要么通知成功,要么没有通知,不会像锁一样具有状态,其中通知机制在内核中表现为作为引用计数对象的文件描述符,共享内存资源是通过文件描述符的形式申请和传递的,操作系统会根据共享内存资源的引用计数决定是否需要回收该资源。
18.一种计算机可读存储介质,其上存储有程序或指令,其特征在于,所述程序或指令在被处理器执行时实现根据权利要求1至7中任一项权利要求所述的方法。
19.一种包含指令的计算机程序产品,其特征在于,当所述计算机程序产品在计算机上运行时,使得所述计算机执行根据权利要求1至7中任一项权利要求所述的方法。
20.一种计算机可读存储介质,其上存储有程序或指令,其特征在于,所述程序或指令在被处理器执行时实现根据权利要求8至14中任一项权利要求所述的方法。
CN202010778905.7A 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统 Active CN111897666B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202410099166.7A CN118132286A (zh) 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统
CN202010778905.7A CN111897666B (zh) 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010778905.7A CN111897666B (zh) 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202410099166.7A Division CN118132286A (zh) 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统

Publications (2)

Publication Number Publication Date
CN111897666A CN111897666A (zh) 2020-11-06
CN111897666B true CN111897666B (zh) 2024-02-06

Family

ID=73245912

Family Applications (2)

Application Number Title Priority Date Filing Date
CN202410099166.7A Pending CN118132286A (zh) 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统
CN202010778905.7A Active CN111897666B (zh) 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN202410099166.7A Pending CN118132286A (zh) 2020-08-05 2020-08-05 用于多进程之间通信的方法、设备及系统

Country Status (1)

Country Link
CN (2) CN118132286A (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112906075A (zh) * 2021-03-15 2021-06-04 北京字节跳动网络技术有限公司 一种内存共享的方法及装置
CN112802232B (zh) * 2021-03-22 2021-07-16 智道网联科技(北京)有限公司 视频流数据的传输方法及其相关装置
CN112925754B (zh) * 2021-03-31 2023-04-07 四川虹美智能科技有限公司 文件描述符溢出上报方法、装置及计算机可读介质
CN113407631B (zh) * 2021-06-24 2023-09-08 深圳智多豚物联技术有限公司 基于kafka与哈希共享内存的分布式数据中心
CN113760578B (zh) * 2021-08-28 2022-04-19 特斯联科技集团有限公司 跨进程快速传输大数据的方法、装置、设备及计算机程序

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013044502A1 (zh) * 2011-09-30 2013-04-04 华为技术有限公司 数据管理的方法及装置
CN106301820A (zh) * 2015-05-15 2017-01-04 阿里巴巴集团控股有限公司 一种基于网络连接服务的升级方法和装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7373647B2 (en) * 2003-04-30 2008-05-13 International Business Machines Corporation Method and system for optimizing file table usage
US8220004B2 (en) * 2009-04-17 2012-07-10 Nokia Corporation Method, apparatus and computer program product for sharing resources via an interprocess communication
US10467151B2 (en) * 2017-09-05 2019-11-05 NGINX, Inc. Using shared memory to transport data between server processes

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013044502A1 (zh) * 2011-09-30 2013-04-04 华为技术有限公司 数据管理的方法及装置
CN106301820A (zh) * 2015-05-15 2017-01-04 阿里巴巴集团控股有限公司 一种基于网络连接服务的升级方法和装置

Also Published As

Publication number Publication date
CN118132286A (zh) 2024-06-04
CN111897666A (zh) 2020-11-06

Similar Documents

Publication Publication Date Title
CN111897666B (zh) 用于多进程之间通信的方法、设备及系统
US5339427A (en) Method and apparatus for distributed locking of shared data, employing a central coupling facility
US6598094B1 (en) Method and apparatus for determining status of remote objects in a distributed system
JP5510556B2 (ja) 仮想マシンのストレージスペースおよび物理ホストを管理するための方法およびシステム
US7454477B2 (en) Zero-copy transfer of memory between address spaces
EP2898655B1 (en) System and method for small batching processing of usage requests
KR20140069126A (ko) 미들웨어 머신 환경에서 다중노드 어플리케이션들을 위한 메시지 큐들을 제공 및 관리하는 시스템 및 방법
CN112039970B (zh) 一种分布式业务锁服务方法、服务端、系统及存储介质
US11474853B2 (en) Storage device operation method and physical server
CN112905304B (zh) 一种虚拟机间通信方法、装置、物理主机及介质
CN112073456B (zh) 分布式锁的实现方法、相关设备及系统
CN104503863A (zh) 用于虚拟容器系统容灾的内核态与用户态数据交换方法
WO2023284473A1 (zh) 数据管理方法、装置、计算机设备及存储介质
CN115525417A (zh) 数据通信方法、通信系统及计算机可读存储介质
CN114124812A (zh) 维护表项一致性的方法、装置及电子设备
CN115766044A (zh) 一种基于用户态协议栈的通信方法及相应装置
JP2021168123A (ja) ストレージ装置のネットワークキーバリューを使用して分散された読み取り/書き込みをロックするシステム及び方法
US20130144842A1 (en) Failover and resume when using ordered sequences in a multi-instance database environment
CN107615259A (zh) 一种数据处理方法及系统
CN113268356B (zh) 基于LINUX系统的多GPU板卡bounding的系统、方法及介质
CN110677465B (zh) 一种分布式锁的控制方法及装置
CN109634721B (zh) 一种虚拟机与主机的启动通信方法及相关装置
CN110704249A (zh) 一种保证应用一致性的方法、装置及系统
EP1064599B1 (en) Method and apparatus for determining status of remote objects in a distributed system
CN114860390B (zh) 容器数据管理方法、装置、程序产品、介质及电子设备

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