CN103425538B - 进程通讯方法及系统 - Google Patents
进程通讯方法及系统 Download PDFInfo
- Publication number
- CN103425538B CN103425538B CN201210164179.5A CN201210164179A CN103425538B CN 103425538 B CN103425538 B CN 103425538B CN 201210164179 A CN201210164179 A CN 201210164179A CN 103425538 B CN103425538 B CN 103425538B
- Authority
- CN
- China
- Prior art keywords
- data
- module
- logical address
- length
- memory
- 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
Links
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
一种进程通讯方法,包括如下步骤:根据进程通讯请求分配内存空间;将通讯数据存入所述内存空间;将所述内存空间的逻辑地址写入消息队列;通过从所述消息队列中读取的逻辑地址访问所述通讯数据。上述进程通讯方法及系统,在接收到进程通讯请求时分配用于存储通讯数据的内存空间,这将不需要预先划分通讯数据的存储空间,将内存空间的逻辑地址写入消息队列中,通过在消息队列中逻辑地址的读取进行通讯数据的访问,以在消息队列的作用下使得数据访问进程通过对消息队列中逻辑地址的逐一读取有序访问通讯数据,在多个进程之间的通讯过程中不需要进行通讯数据的复制,大大地提高了数据共享的灵活性。
Description
【技术领域】
本发明涉及网络应用技术,特别是涉及一种进程通讯方法及系统。
【背景技术】
随着网络服务器中各种应用程序逐渐增多以及性能的提升,进程之间的通讯越来越频繁,通讯过程中交互的数据量也越来越庞大,使得进程之间的通讯存在着诸多缺陷。传统的进程通讯包括Apache的进程通讯模型和内存共享的进程通讯方式。Apache是广泛应用的网络服务器软件,通过维护进程池来实现主进程和进程池中多个进程之间的数据交互,例如,进程池中的进程用于执行网络服务器中的程序,即CGI(CommonGatewayInterface,基于浏览器的输入、在Web服务器上运行的程序)之类的重操作程序,主进程与执行CGI程序的进程通过建立UNIXDomainSocket这一进程间通讯机制进行通讯。但是,Apache的进程通讯模型中建立的每一UNIXDomainSocket只能被主进程和进程池中的一个进程使用,在主进程与进程池中多个进程通讯时必须进行数据的大量复制,缺乏灵活性。
内存共享的进程通讯方式是直接通过共享内存实现数据共享,由一个进程将共享内存区域中划分成若干单元,其它进程按照事先的约定共享地访问共享内存区域中的数据。但是,预先划定的共享内存区域是静态的,无法预期进程通讯时的实际数据长度,往往会出现共享内存区域不足,或者空间浪费的情况,也存在着不够灵活的缺陷。
【发明内容】
基于此,有必要提供一种能提高数据共享的灵活性的进程通讯方法。
此外,还有必要提供一种能提高数据共享的灵活性的进程通讯系统。
一种进程通讯方法,包括如下步骤:
根据进程通讯请求分配内存空间;
将通讯数据存入所述内存空间;
将所述内存空间的逻辑地址写入消息队列;
通过从所述消息队列中读取的逻辑地址访问所述通讯数据。
优选的,所述根据进程通讯请求分配内存空间的步骤为:
根据所述进程通讯请求分配内存空间,并获取所述内存空间的逻辑地址;
向所述通讯请求进程传递所述内存空间的逻辑地址。
优选的,所述根据所述进程通讯请求分配内存空间,并获取所述内存空间的逻辑地址的步骤为:
获取通讯数据对应的数据长度;
选定与所述数据长度相匹配的内存长度区间;
根据所述选定的内存长度区间得到对应的内存空间以及逻辑地址。
优选的,所述根据所述选定的内存长度区间得到对应的内存空间以及逻辑地址的步骤之后还包括:
判断所述选定的内存长度区间是否大于数据长度,若是,则
根据所述数据长度分裂所述得到内存空间;
更新与所述分裂得到的内存空间相关联的内存长度区间;
根据更新的内存长度区间以及数据长度向通讯请求进程分配所述分裂得到的内存空间以及逻辑地址。
优选的,所述通过从所述消息队列中读取的逻辑地址访问所述通讯数据的步骤之后还包括:
获取空间释放请求,并释放所述空间释放请求对应的内存空间;
判断是否存在与所述释放的内存空间形成连续区域的空闲内存空间,若是,则将所述判断得到的空闲内存空间与释放的内存空间合并;
更新对应的内存长度区间。
优选的,所述将通讯数据存入内存空间的步骤为:
将接收得到的逻辑地址转换为物理地址;
按照所述物理地址将所述通讯数据存入相应的内存空间。
优选的,所述将所述内存空间的逻辑地址写入消息队列的步骤之后还包括:
判断写入消息队列的逻辑地址是否为唯一消息,若是,则向所述消息队列中的命名管道写入数据。
优选的,所述通过从所述消息队列中读取的逻辑地址访问所述通讯数据的步骤为:
数据访问进程通过监控到所述命名管道中写入的数据触发消息队列的读取,得到逻辑地址;
将所述逻辑地址转换为物理地址,并根据所述转换得到的物理地址访问通讯数据。
一种进程通讯系统,包括:
资源管理器模块,用于根据进程通讯请求分配内存空间;
通讯请求进程模块,用于将所述通讯数据存入所述内存空间,并将所述内存空间的逻辑地址写入消息队列;
数据访问进程模块,用于通过所述消息队列中读取的逻辑地址访问所述通讯数据。
优选的,所述资源管理器模块包括:
分配模块,用于根据所述进程通讯请求分配内存空间,并获取所述内存空间的逻辑地址;
传递模块,用于向所述通讯请求进程模块传递所述内存空间的逻辑地址。
优选的,所述分配模块包括:
长度获取模块,用于获取通讯数据对应的数据长度;
区间选定模块,用于选定与所述数据长度相匹配的内存长度区间;
空间获取模块,用于根据所述选定的内存长度区间得到对应的内存空间以及逻辑地址。
优选的,所述分配模块还包括:
长度判断模块,用于判断所述选定的内存长度区间是否大于数据长度,若是,则通知空间分裂模块;
所述空间分裂模块用于根据所述数据长度分裂所述得到的内存空间;
分裂更新模块,用于更新与所述分裂得到的内存空间相关联的内存长度区间;
分裂空间分配模块,用于根据更新的内存长度区间以及数据长度向所述通讯请求进程模块分配所述分裂得到的内存空间以及逻辑地址。
优选的,所述资源管理器模块还包括:
空间释放模块,用于获取空间释放请求,并释放所述空间释放请求对应的内存空间;
空间判断模块,用于判断是否存在与所述释放的内存空间形成连续区域的空闲内存空间,若是,则通知合并模块;
所述合并模块用于将所述判断得到的空闲内存空间与释放的内存空间合并;
合并更新模块,用于更新对应的内存长度空间。
优选的,所述通讯请求进程模块包括:
地址转换模块,用于将接收得到的逻辑地址转换为物理地址;
数据写入模块,用于按照所述物理地址将所述通讯数据存入相应的内存空间。
优选的,还包括:
消息管理器,用于判断写入消息队列的逻辑地址是否为唯一消息,若是,则向所述消息队列中的命名管道写入数据。
优选的,所述数据访问进程模块包括:
监控触发模块,用于通过监控到所述命名管道中写入的数据触发消息队列的读取,得到逻辑地址;
访问模块,用于将所述逻辑地址转换为物理地址,并根据所述转换得到的物理地址访问通讯数据。
上述进程通讯方法及系统,在接收到进程通讯请求时分配用于存储通讯数据的内存空间,这将不需要预先划分通讯数据的存储空间,将内存空间的逻辑地址写入消息队列中,通过在消息队列中逻辑地址的读取进行通讯数据的访问,以在消息队列的作用下使得数据访问进程通过对消息队列中逻辑地址的逐一读取有序访问通讯数据,在多个进程之间的通讯过程中不需要进行通讯数据的复制,大大地提高了数据共享的灵活性。
【附图说明】
图1为一个实施例中进程通讯方法的流程图;
图2为一个实施例中消息队列的示意图;
图3为图1中根据进程通讯请求分配内存空间的方法流程图;
图4为一个实施例中根据进程通讯请求分配内存空间,并获取内存空间的逻辑地址的方法流程图;
图5为另一个实施例中根据进程通讯请求分配内存空间,并获取内存空间的逻辑地址的方法流程图;
图6为一个实施中共享内存池的示意图;
图7为一个实施例中描述区和数据区的详细示意图;
图8为另一个实施例中进程通讯方法的流程图;
图9为图1中将通讯数据存入内存空间的方法流程图;
图10为图1中通过从消息队列中读取的逻辑地址访问通讯数据的方法流程图;
图11为一个实施例中进程通讯系统的结构示意图;
图12为一个实施例中资源管理器模块的结构示意图;
图13为一个实施例中分配模块的结构示意图;
图14为另一个实施例中分配模块的结构示意图;
图15为另一个实施例中资源管理器模块的结构示意图;
图16为图1中通讯请求进程模块的结构示意图;
图17为图1中数据访问进程模块的结构示意图。
【具体实施方式】
如图1所示,在一个实施例中,一种进程通讯方法,包括如下步骤:
步骤S10,根据进程通讯请求分配内存空间。
本实施例中,进程通讯请求是需要与其它进程进行数据共享的进程发出的,资源管理器在接收到进程通讯请求之后将在共享内存池中为相应的通讯数据分配内存空间,所分配的内存空间是根据通讯数据的数据长度申请得到的共享内存池中的一片共享内存资源。这一内存空间的分配是动态进行的,可保证存储资源的有效利用。
步骤S30,将通讯数据存入内存空间。
本实施例中,通讯数据被存入申请得到的内存空间中,以便于多个进程共享地访问该内存空间中的通讯数据。
步骤S50,将内存空间的逻辑地址写入消息队列。
本实施例中,内存空间的逻辑地址为共享内存池中存入通讯数据时产生的地址偏移量。消息队列用于传递通讯数据的逻辑地址,以控制多个数据访问进程对共享的通讯数据的有序读取。
如图2所示,消息队列包括了描述信息以及消息头和消息体,并在消息队列中设定命名管道,该命名管道用于进行FIFO通知管理,触发数据访问进程对消息队列的监控。
具体的,在将逻辑地址写入消息队列之前,将首先根据队首偏移量和队尾偏移量判断消息队列的容量是否足够写入逻辑地址等信息,若是,则构造消息头,并将生成包含逻辑地址的消息体以写入消息队列,更新队尾偏移量。
步骤S70,通过从消息队列中读取的逻辑地址访问通讯数据。
本实施例中,数据访问进程逐一读取消息队列中的逻辑地址,进而根据读取到的逻辑地址映射为数据访问进程中的实际地址进行通讯数据的访问。具体地,在某一数据访问进程通过读取到的逻辑地址访问了相应的通讯数据时,若需要与另一数据访问进程共享通讯数据,则已经完成了通讯数据访问的数据访问进程将变为通讯请求进程,该通讯请求进程将逻辑地址写入消息队列中,使得另一数据访问进程能够从消息队列中读出,并提取到相应的逻辑地址,进而将提取的逻辑地址转换为该逻辑地址在数据访问进程中的实际地址,实现该通讯请求进程与另一数据访问进程之间的通讯数据共享,且易于实现数据访问的时序控制。
如图3所示,在一个实施例中,上述步骤S10的具体过程包括:
步骤S110,根据进程通讯请求分配内存空间,并获取内存空间的逻辑地址。
本实施例中,资源管理器在共享内存池中为进程通讯过程中的通讯数据分配内存空间,并提供该内存空间的逻辑地址。
如图4所示,在一个实施例中,上述步骤S110的具体过程包括:
步骤S111,获取通讯数据对应的数据长度。
本实施例中,所获取的数据长度为进程之间发起一次数据通讯时通讯数据的实际长度。
步骤S112,选定与数据长度相匹配的内存长度区间。
本实施例中,内存长度区间标识了相关的内存空间大小,也就是说,与某一内存长度区间相关的内存空间大小是处于该内存长度区间的范围之内的。预先建立内存长度区间与内存空间之间的映射关系,进而在进行内存空间的分配时能够方便快速地为通讯数据分配合适的存储资源,提高处理效率,避免存储资源的浪费。在优选的实施例中,多个内存长度区间以索引数组的数据形式存在,并与相应的内存空间形成链表的形式,这有利于加快分配过程中的数据处理效率以及存储有序性的提高。
步骤S113,根据选定的内存长度区间得到对应的内存空间以及逻辑地址。
本实施例中,由选定的内存长度区间获取处于该内存长度区间这一范围之内的内存空间,以及相应的逻辑地址。
如图5所示,在另一个实施例中,上述步骤S113之后还包括如下步骤:
步骤S114,判断选定的内存长度区间是否大于数据长度,若是,则进入步骤S115,若否,则进入步骤S130。
本实施例中,选定的内存长度区间大于数据长度是指该内存长度区间的下限仍然大于数据长度,但是,这一选定的内存长度区间已经是所有的内存长度区间中最小的,因此,当判断到选定的内存长度区间大于数据长度时,需要分裂该内存长度区间相应的内存空间,以得到与通讯数据的数据长度相适应的内存空间,也避免了存储资源的浪费。
步骤S115,根据数据长度分裂得到的内存空间。
本实施例中,如图6所示,共享内存池的总体布局包括了描述区和数据区,描述区包括内存长度区间的索引数组、空闲描述块链表以及描述块数组,数据区包括了数据块头以及相应的数据块。
描述区和数据区均是以链表的形式存储的,如图7所示,内存长度区间的索引数组中,每一个内存长度区间是与描述块数组中某些描述块相链接的,并且该描述块还将与数据区中的某一数据块头相链接。也就是说,用于存储通讯数据的内存空间包括了空闲描述区以及与该空闲描述区相链接的空闲数据区,具体为依次链接的内存长度区间、描述块、数据块头和数据块,其中,通讯数据存储于内存空间中的数据块中。
进一步的,描述块用于描述与之相链接的数据块信息,例如对应数据块长度、对应数据块偏移量,数据块头记录了数据块的具体信息,例如,相邻前一个数据块长度、本数据块长度等信息,而空闲描述块链表是不与任何数据区相链接的,是没有被占用的描述块。
在内存空间进行分裂的过程中,根据通讯数据的数据长度将从该内存空间的数据块中分裂出一个与该数据长度相对应的数据块以及其它的数据块,此时,将需要空闲的描述块与每一分裂得到的数据块相链接,因此,从空闲描述块链表中提取描述块,并将提取的描述块与分裂得到的数据块相链接,得到了新的内存空间。该提取的描述块将用于描述分裂得到的数据块。
步骤S116,更新与分裂得到的内存空间相关联的内存长度区间。
本实施例中,在分裂得到新的内存空间之后,相应的,将与这一新的内存空间相链接的内存长度区间添加到内存长度区间的索引数组中,以方便内存空间分配过程中对内存空间的选取。
步骤S117,根据更新的内存长度区间以及数据长度向通讯请求进程分配分裂得到的内存空间以及逻辑地址。
本实施例中,分裂得到了至少两个内存空间,因此,需要根据数据长度在更新的内存长度区间中选取合适的内存长度区间,进而得到与选取的内存长度区间相链接的描述块以及数据块头、数据块组成的内存空间,并获取该内存空间的逻辑地址。
如图8所示,在另一个实施例中,上述步骤S70的步骤之后还包括:
步骤S810,获取空间释放请求,并释放空间释放请求对应的内存空间。
本实施例中,在进程之间的通讯结束之后,将根据空间释放请求清空存储了通讯数据的内存空间,以保证有限的共享内存池能够满足多次进程通讯需求。
步骤S830,判断是否存在与释放的内存空间形成连续区域的空闲内存空间,若是,则进入步骤S850,若否,则结束。
本实施例中,在释放了内存空间之后,若存在能够与释放的内存空间形成连续区域的空闲内存空间,则将释放的内存空间与空闲内存空间合并。
步骤S850,将判断得到的空闲内存空间与释放的内存空间合并。
本实施例中,若与释放的内存空间相邻的内存空间均为空闲内存空间,则将释放的内存空间以及相邻的内存空间所对应的数据块合并为一个新的数据块,并根据释放的内存空间以及相邻的内存空间中数据块头以及描述块中记录的信息得到数据块的描述信息,判断得到的空闲内存空间以及释放的内存空间均对应了一个描述块,使用其中任一描述块与作为合并后内存空间数据的描述块,并将描述信息更新到使用的描述块中,未被使用的描述块将被加入空闲描述块链表中,保证了空闲描述块的可持续利用。在优选的实施例中,选用逻辑地址相对靠前的内存空间所对应的描述块作为合并后内存空间的描述块。
若与释放的内存空间相邻的某一内存空间为空闲内存空间,则需要查看该空闲内存空间之前的内存空间或该空闲内存空间之后的内存空间是为空闲内存空间,若是,则对其进行合并。
步骤S870,更新对应的内存长度区间。
本实施例中,获取合并得到的内存空间所对应的内存长度区间,与合并得到的内存空间相链接,并更新至内存长度区间的索引数组中。
步骤S130,向通讯请求进程传递内存空间的逻辑地址。
本实施例中,在分配了通讯请求进程用于进行通讯数据共享的内存空间之后,还需要向通讯请求进程传递该内存空间的逻辑地址。
如图9所示,在一个实施例中,上述步骤S30的具体过程包括:
步骤S310,将接收得到的逻辑地址转换为物理地址。
本实施例中,由于逻辑地址所表示的是一个相对的位置,在操作系统中同一内存空间中不同进程中的地址可能各不相同,因此需要通讯请求进程根据地址映射机制将逻辑地址转换为物理地址,以保证地址的准确性。
步骤S330,按照物理地址将通讯数据存入相应的内存空间。
本实施例中,通讯请求进程按照物理地址将共享的通讯数据填充到相应的内存空间中,以使得其它进程能够在这一内存空间中读取到通讯数据,实现进程之间的通讯。
在另一个实施例中,上述步骤S50之后还包括:判断写入消息队列的逻辑地址是否为唯一消息,若是,则向消息队列中的命名管道写入数据,若否,则不做任何处理。
本实施例中,通讯数据存入相应的内存空间时还将该内存空间的逻辑地址写入消息队列中,此时,将判断写入的逻辑地址是否为消息队列中的唯一消息,即在写入逻辑地址之前,消息队列是否为空,若是,则向命名管道(FIFO)写入一定的数据,例如,该数据可为一个字节,用于触发数据访问进程的监控。
在另一个实施例中,上述进程通讯方法中若存在多个通讯请求进程共享消息队列,在从消息队列写入逻辑地址或者读取逻辑地址时还将设置互斥锁,以保证消息队列的有序访问。
如图10所示,在一个实施例中,上述步骤S70的具体过程包括:
步骤S710,数据访问进程通过监控到命名管道中写入的数据触发消息队列的读取,得到逻辑地址。
本实施例中,在数据访问进程通过EPOLL监控到命名管道中写入了数据时,将对消息队列进行消息的读取。具体地,数据访问进程将首先判断消息队列是否为空,若否,则读取消息队列中的逻辑地址。
步骤S730,将逻辑地址转换为物理地址,并根据转换得到的物理地址访问通讯数据。
本实施例中,数据访问进程通过地址映射机制将读取到的逻辑地址转换为物理地址,进而按照该物理地址访问通讯数据,实现与通讯请求进程之间的通讯。
如图11所示,在一个实施例中,一种进程通讯系统,包括资源管理器模块10、通讯请求进程模块30以及数据访问进程模块50。
资源管理器模块10,用于根据进程通讯请求分配内存空间。
本实施例中,进程通讯请求是需要与其它进程进行数据共享的进程发出的,资源管理器模块10在接收到进程通讯请求之后将在共享内存池中为相应的通讯数据分配内存空间,所分配的内存空间是根据通讯数据的数据长度申请得到的共享内存池中的一片共享内存资源。
通讯请求进程模块30,用于将通讯数据存入内存空间,并将内存空间的逻辑地址写入消息队列。
本实施例中,通讯数据被通讯请求进程模块30存入申请得到的内存空间中,以便于多个进程共享地访问该内存空间中的通讯数据。
内存空间的逻辑地址为共享内存池中存入通讯数据时产生的地址偏移量。消息队列用于传递通讯数据的逻辑地址,以控制多个数据访问进程对共享的通讯数据的有序读取。
消息队列包括了描述信息以及消息头和消息体,并在消息队列中设定命名管道,该命名管道用于进行FIFO通知管理,触发数据访问进程模块50对消息队列的监控。
具体的,在将逻辑地址写入消息队列之前,通讯请求进程模块30将首先根据队首偏移量和队尾偏移量判断消息队列的容量是否足够写入逻辑地址等信息,若是,则构造消息头,并将生成包含逻辑地址的消息体以写入消息队列,更新队尾偏移量。
数据访问进程模块50,用于通过消息队列中读取的逻辑地址访问通讯数据。
本实施例中,数据访问进程模块50逐一读取消息队列中的逻辑地址,进而根据读取到的逻辑地址映射为数据访问进程中的实际地址进行通讯数据的访问。具体地,在某一数据访问进程模块50通过读取到的逻辑地址访问了相应的通讯数据时,若需要与另一数据访问进程模块50共享通讯数据,则此时,已经完成了通讯数据访问的数据访问进程将变为通讯请求进程,该通讯请求进程模块30将逻辑地址写入消息队列中,使得另一数据访问进程模块50能够从消息队列中读出,并提取到相应的逻辑地址,进而将提取的逻辑地址转换为该逻辑地址在数据访问进程中的实际地址,实现该通讯请求进程模块30与另一数据访问进程模块50之间的通讯数据共享,且易于实现数据访问的时序控制。
如图12所示,在一个实施例中,上述资源管理器模块10包括分配模块110以及传递模块130。
分配模块110,用于根据进程通讯请求分配内存空间,并获取内存空间的逻辑地址。
本实施例中,分配模块110在共享内存池中为进程通讯过程中的通讯数据分配内存空间,并提供该内存空间的逻辑地址。
如图13所示,在一个实施例中,上述分配模块110包括长度获取模块111、区间选定模块113以及空间获取模块115。
长度获取模块111,用于获取通讯数据对应的数据长度。
本实施例中,长度获取模块111所获取的数据长度为进程之间发起一次数据通讯时通讯数据的实际长度。
区间选定模块113,用于选定与数据长度相匹配的内存长度区间。
本实施例中,内存长度区间标识了相关的内存空间大小,也就是说,与某一内存长度区间相关的内存空间大小是处于该内存长度区间的范围之内的。预先建立内存长度区间与内存空间之间的映射关系,进而在进行内存空间的分配时能够方便快速地为通讯数据分配合适的存储资源,提高处理效率,避免存储资源的浪费。在优选的实施例中,多个内存长度区间以索引数组的数据形式存在,并与相应的内存空间形成链表的形式,这有利于加快分配过程中的数据处理效率以及存储有序性的提高。
空间获取模块115,用于根据选定的内存长度区间得到对应的内存空间以及逻辑地址。
本实施例中,空间获取模块115由选定的内存长度区间获取处于该内存长度区间这一范围之内的内存空间,以及相应的逻辑地址。
如图14所示,在另一个实施例中,上述分配模块110还包括长度判断模块116、空间分裂模块117、分裂更新模块118以及分裂空间分配模块119。
长度判断模块116,用于判断选定的内存长度区间是否大于数据长度,若是,则通知空间分裂模块117,若否,则通知传递模块130。
本实施例中,选定的内存长度区间大于数据长度是指该内存长度区间的下限仍然大于数据长度,但是,这一选定的内存长度区间已经是所有的内存长度区间中最小的,因此,当长度判断模块116判断到选定的内存长度区间大于数据长度时,需要空间分裂模块117分裂该内存长度区间相应的内存空间,以得到与通讯数据的数据长度相适应的内存空间,也避免了存储资源的浪费。
空间分裂模块117,用于根据数据长度分裂得到的内存空间。
本实施例中,共享内存池的总体布局包括了描述区和数据区,描述区包括内存长度区间的索引数组、空闲描述块链表以及描述块数组,数据区包括了数据块头以及相应的数据块。
描述区和数据区均是以链表的形式存储的,内存长度区间的索引数组中,每一个内存长度区间是与描述块数组中某些描述块相链接的,并且该描述块还将与数据区中的某一数据块头相链接。也就是说,用于存储通讯数据的内存空间包括了空闲描述区以及与该空闲描述区相链接的空闲数据区,具体为依次链接的内存长度区间、描述块、数据块头和数据块,其中,通讯数据存储于内存空间中的数据块中。
进一步的,描述块用于描述与之相链接的数据块信息,例如对应数据块长度、对应数据块偏移量,数据块头记录了数据块的具体信息,例如,相邻前一个数据块长度、本数据块长度等信息,而空闲描述块链表是不与任何数据区相链接的,是没有被占用的描述块。
空间分裂模块117根据通讯数据的数据长度将从该内存空间的数据块中分裂出一个与该数据长度相对应的数据块以及其它的数据块,此时,将需要空闲的描述块与每一分裂得到的数据块相链接,因此,空间分裂模块117从空闲描述块链表中提取描述块,并将提取的描述块与分裂得到的数据块相链接,得到了新的内存空间。该提取的描述块将用于描述分裂得到的数据块。
分裂更新模块118,用于更新与分裂得到的内存空间相关联的内存长度区间。
本实施例中,在分裂得到新的内存空间之后,相应的,分裂更新模块118将与这一新的内存空间相链接的内存长度区间添加到内存长度区间的索引数组中,以方便内存空间分配过程中对内存空间的选取。
分裂空间分配模块119,用于根据更新的内存长度区间以及数据长度向通讯请求进程模块分配分裂得到的内存空间以及逻辑地址。
本实施例中,分裂得到了至少两个内存空间,因此,需要分裂空间分配模块119根据数据长度在更新的内存长度区间中选取合适的内存长度区间,进而得到与选取的内存长度区间相链接的描述块以及数据块头、数据块组成的内存空间,并获取该内存空间的逻辑地址。
传递模块130,向通讯请求进程模块传递内存空间的逻辑地址。
本实施例中,在分配了通讯请求进程模块用于进行通讯数据共享的内存空间之后,还需要传递模块130向通讯请求进程模块传递该内存空间的逻辑地址。
如图15所示,在另一个实施例中,上述资源管理器模块10包括空间释放模块150、空间判断模块160、合并模块170以及合并更新模块180。
空间释放模块150,用于获取空间释放请求,并释放空间释放请求对应的内存空间。
本实施例中,在进程之间的通讯结束之后,空间释放模块150将根据空间释放请求清空存储了通讯数据的内存空间,以保证有限的共享内存池能够满足多次进程通讯需求。
空间判断模块160,用于判断是否存在与释放的内存空间形成连续区域的空闲内存空间,若是,则通知合并模块170,若否,则停止执行。
本实施例中,在释放了内存空间之后,若空间判断模块160判断到存在能够与释放的内存空间形成连续区域的空闲内存空间,则合并模块170将释放的内存空间与空闲内存空间合并。
合并模块170,用于将判断得到的空闲内存空间与释放的内存空间合并。
本实施例中,若与释放的内存空间相邻的内存空间均为空闲内存空间,则合并模块170将释放的内存空间以及相邻的内存空间所对应的数据块合并为一个新的数据块,并根据释放的内存空间以及相邻的内存空间中数据块头以及描述块中记录的信息得到数据块的描述信息,判断得到的空闲内存空间以及释放的内存空间均对应了一个描述块,使用其中任一描述块与作为合并后内存空间数据的描述块,并将描述信息更新到使用的描述块中,未被使用的描述块将被加入空闲描述块链表中。在优选的实施例中,选用逻辑地址相对靠前的内存空间所对应的描述块作为合并后内存空间的描述块。
若与释放的内存空间相邻的某一内存空间为空闲内存空间,则需要合并模块170查看该空闲内存空间之前的内存空间或该空闲内存空间之后的内存空间是为空闲内存空间,若是,则对其进行合并。
合并更新模块180,用于更新对应的内存长度空间。
本实施例中合并更新模块180,获取合并得到的内存空间所对应的内存长度区间,与合并得到的内存空间相链接,并更新至内存长度区间的索引数组中。
如图16所示,在一个实施例中,通讯请求进程模块30包括地址转换模块310以及数据写入模块330。
地址转换模块310,用于将接收得到的逻辑地址转换为物理地址。
本实施例中,由于逻辑地址所表示的是一个相对的位置,在操作系统中同一内存空间中不同进程中的地址可能各不相同,因此需要地址转换模块310根据地址映射机制将逻辑地址转换为物理地址,以保证地址的准确性。
数据写入模块330,用于按照物理地址将所述通讯数据存入相应的内存空间。
本实施例中,数据写入模块330按照物理地址将共享的通讯数据填充到相应的内存空间中,以使得其它进程能够在这一内存空间中读取到通讯数据,实现进程之间的通讯。
在另一个实施例中,上述进程通讯系统还包括了消息管理器,该消息管理器用于判断写入消息队列的逻辑地址是否为唯一消息,若是,则向消息队列中的命名管道写入数据。
本实施例中,通讯数据存入相应的内存空间时还将该内存空间的逻辑地址写入消息队列中,此时,消息管理器将判断写入的逻辑地址是否为消息队列中的唯一消息,即在写入逻辑地址之前,消息队列是否为空,若是,则向命名管道(FIFO)写入一定的数据,例如,该数据可为一个字节,用于触发数据访问进程的监控。
在另一个实施例中,上述进程通讯系统中若存在多个通讯请求进程模块共享消息队列,在从消息队列写入逻辑地址或者读取逻辑地址时还将设置互斥锁,以保证消息队列的有序访问。
如图17所示,在一个实施例中,上述数据访问进程模块50包括监控触发模块510以及访问模块530。
监控触发模块510,用于通过监控到命名管道中写入的数据触发消息队列的读取,得到逻辑地址。
本实施例中,监控触发模块510在数据访问进程模块通过EPOLL监控到命名管道中写入了数据时,将对消息队列进行消息的读取。具体地,监控触发模块510将首先判断消息队列是否为空,若否,则读取消息队列中的逻辑地址。
访问模块530,用于将逻辑地址转换为物理地址,并根据转换得到的物理地址访问通讯数据。
本实施例中,访问模块530通过地址映射机制将读取到的逻辑地址转换为物理地址,进而按照该物理地址访问通讯数据,实现与通讯请求进程模块之间的通讯。
上述进程通讯方法及系统中,某一进程作为数据访问进程进行了通讯数据的访问之后,还可能与其它进程进行通讯,此时,该进程将变换为通讯请求进程,此时,通讯请求进程不需要再次在共享内存池中申请共享内存资源,通过将存储了通讯数据的内存空间逻辑地址写入消息队列即可实现。
上述进程通讯方法及系统,在接收到进程通讯请求时分配用于存储通讯数据的内存空间,这将不需要预先划分通讯数据的存储空间,将内存空间的逻辑地址写入消息队列中,通过在消息队列中逻辑地址的读取进行通讯数据的访问,以在消息队列的作用下使得数据访问进程通过对消息队列中逻辑地址的逐一读取有序访问通讯数据,在多个进程之间的通讯过程中不需要进行通讯数据的复制,大大地提高了数据共享的灵活性。
上述进程通讯方法及系统中,消息队列被多个通讯请求进程共享,多个通讯请求进程从同一消息队列中竞争地读取逻辑地址,进而通过逻辑地址得到相应的物理地址,实现了系统的负载均衡。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (12)
1.一种进程通讯方法,包括如下步骤:
根据进程通讯请求分配内存空间,所述分配的内存空间是根据通讯数据的数据长度申请得到的共享内存池中的一片共享内存资源;
将通讯数据存入所述内存空间;
将所述内存空间的逻辑地址写入消息队列;
判断写入消息队列的逻辑地址是否为唯一消息,若是,则向所述消息队列中的命名管道写入数据;
通过从所述消息队列中读取的逻辑地址访问所述通讯数据,具体包括:数据访问进程通过监控到所述命名管道中写入的数据触发消息队列的读取,得到逻辑地址;将所述逻辑地址转换为物理地址,并根据所述转换得到的物理地址访问通讯数据。
2.根据权利要求1所述的进程通讯方法,其特征在于,所述根据进程通讯请求分配内存空间的步骤为:
根据所述进程通讯请求分配内存空间,并获取所述内存空间的逻辑地址;
向所述通讯请求进程传递所述内存空间的逻辑地址。
3.根据权利要求2所述的进程通讯方法,其特征在于,所述根据所述进程通讯请求分配内存空间,并获取所述内存空间的逻辑地址的步骤为:
获取通讯数据对应的数据长度;
选定与所述数据长度相匹配的内存长度区间;
根据所述选定的内存长度区间得到对应的内存空间以及逻辑地址。
4.根据权利要求3所述的进程通讯方法,其特征在于,所述根据所述选定的内存长度区间得到对应的内存空间以及逻辑地址的步骤之后还包括:
判断所述选定的内存长度区间是否大于数据长度,若是,则
根据所述数据长度分裂所述得到内存空间;
更新与所述分裂得到的内存空间相关联的内存长度区间;
根据更新的内存长度区间以及数据长度向通讯请求进程分配所述分裂得到的内存空间以及逻辑地址。
5.根据权利要求3所述的进程通讯方法,其特征在于,所述通过从所述消息队列中读取的逻辑地址访问所述通讯数据的步骤之后还包括:
获取空间释放请求,并释放所述空间释放请求对应的内存空间;
判断是否存在与所述释放的内存空间形成连续区域的空闲内存空间,若是,则将所述判断得到的空闲内存空间与释放的内存空间合并;
更新对应的内存长度区间。
6.根据权利要求2所述的进程通讯方法,其特征在于,所述将通讯数据存入内存空间的步骤为:
将接收得到的逻辑地址转换为物理地址;
按照所述物理地址将所述通讯数据存入相应的内存空间。
7.一种进程通讯系统,其特征在于,包括:
资源管理器模块,用于根据进程通讯请求分配内存空间,所述分配的内存空间是根据通讯数据的数据长度申请得到的共享内存池中的一片共享内存资源;
通讯请求进程模块,用于将所述通讯数据存入所述内存空间,并将所述内存空间的逻辑地址写入消息队列;
数据访问进程模块,用于通过所述消息队列中读取的逻辑地址访问所述通讯数据;
所述系统还包括:消息管理器模块,用于判断写入消息队列的逻辑地址是否为唯一消息,若是,则向所述消息队列中的命名管道写入数据;
所述数据访问进程模块包括:
监控触发模块,用于通过监控到所述命名管道中写入的数据触发消息队列的读取,得到逻辑地址;
访问模块,用于将所述逻辑地址转换为物理地址,并根据所述转换得到的物理地址访问通讯数据。
8.根据权利要求7所述的进程通讯系统,其特征在于,所述资源管理器模块包括:
分配模块,用于根据所述进程通讯请求分配内存空间,并获取所述内存空间的逻辑地址;
传递模块,用于向所述通讯请求进程模块传递所述内存空间的逻辑地址。
9.根据权利要求8所述的进程通讯系统,其特征在于,所述分配模块包括:
长度获取模块,用于获取通讯数据对应的数据长度;
区间选定模块,用于选定与所述数据长度相匹配的内存长度区间;
空间获取模块,用于根据所述选定的内存长度区间得到对应的内存空间以及逻辑地址。
10.根据权利要求9所述的进程通讯系统,其特征在于,所述分配模块还包括:
长度判断模块,用于判断所述选定的内存长度区间是否大于数据长度,若是,则通知空间分裂模块;
所述空间分裂模块用于根据所述数据长度分裂所述得到的内存空间;
分裂更新模块,用于更新与所述分裂得到的内存空间相关联的内存长度区间;
分裂空间分配模块,用于根据更新的内存长度区间以及数据长度向所述通讯请求进程模块分配所述分裂得到的内存空间以及逻辑地址。
11.根据权利要求9所述的进程通讯系统,其特征在于,所述资源管理器模块还包括:
空间释放模块,用于获取空间释放请求,并释放所述空间释放请求对应的内存空间;
空间判断模块,用于判断是否存在与所述释放的内存空间形成连续区域的空闲内存空间,若是,则通知合并模块;
所述合并模块用于将所述判断得到的空闲内存空间与释放的内存空间合并;
合并更新模块,用于更新对应的内存长度空间。
12.根据权利要求8所述的进程通讯方法,其特征在于,所述通讯请求进程模块包括:
地址转换模块,用于将接收得到的逻辑地址转换为物理地址;
数据写入模块,用于按照所述物理地址将所述通讯数据存入相应的内存空间。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210164179.5A CN103425538B (zh) | 2012-05-24 | 2012-05-24 | 进程通讯方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210164179.5A CN103425538B (zh) | 2012-05-24 | 2012-05-24 | 进程通讯方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103425538A CN103425538A (zh) | 2013-12-04 |
CN103425538B true CN103425538B (zh) | 2016-05-11 |
Family
ID=49650328
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210164179.5A Active CN103425538B (zh) | 2012-05-24 | 2012-05-24 | 进程通讯方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103425538B (zh) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104063375A (zh) * | 2013-03-18 | 2014-09-24 | 深圳市腾讯计算机系统有限公司 | 管道通讯的方法和装置 |
CN103677988B (zh) * | 2013-12-11 | 2018-04-20 | 北京爱唯光石信息技术有限公司 | 用于软件系统的多进程通讯方法及系统 |
CN104978278B (zh) * | 2014-04-14 | 2020-05-29 | 创新先进技术有限公司 | 数据处理方法和装置 |
CN107168808A (zh) * | 2017-03-30 | 2017-09-15 | 太仓鸿策腾达网络科技有限公司 | 一种通讯进程智能推送系统 |
CN108038006B (zh) * | 2017-11-14 | 2022-02-08 | 北京小鸟看看科技有限公司 | 头戴显示设备的控制方法、设备及系统 |
CN109246085B (zh) * | 2018-08-15 | 2021-06-15 | 腾讯科技(深圳)有限公司 | 一种匿名网络访问方法、客户端、系统、服务器及介质 |
CN109710417A (zh) * | 2018-12-29 | 2019-05-03 | 苏州思必驰信息科技有限公司 | 智能音箱系统及其实现方法 |
CN109933441B (zh) * | 2019-02-28 | 2020-11-17 | 上海交通大学 | 微内核进程间通讯方法和系统 |
CN110727514A (zh) * | 2019-10-12 | 2020-01-24 | 北京无线电测量研究所 | 一种基于索引队列的内存管理方法以及嵌入式设备 |
CN110704214B (zh) * | 2019-10-14 | 2021-05-25 | 北京京东乾石科技有限公司 | 进程间通信方法和装置 |
CN111414603A (zh) * | 2020-03-17 | 2020-07-14 | 用友网络科技股份有限公司 | 一种基于命名管道间通讯机制的应用 |
CN111427707B (zh) * | 2020-03-25 | 2024-02-06 | 北京左江科技股份有限公司 | 一种基于共享内存池的ipc通信方法 |
CN112769900B (zh) * | 2020-12-22 | 2023-04-25 | 中冶赛迪信息技术(重庆)有限公司 | 一种数据分发方法、系统、介质及电子终端 |
CN113961378B (zh) * | 2021-11-16 | 2024-03-26 | 国汽智控(北京)科技有限公司 | 基于共享内存的进程间通信方法、装置及电子设备 |
CN114327946A (zh) * | 2021-12-24 | 2022-04-12 | 北京百度网讯科技有限公司 | 共享内存访问控制方法、装置、电子设备及自动驾驶车辆 |
CN116737409A (zh) * | 2023-05-22 | 2023-09-12 | 晶诺微(上海)科技有限公司 | 超大数据流的实时处理方法以及数据处理系统 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102004675A (zh) * | 2010-11-11 | 2011-04-06 | 福建星网锐捷网络有限公司 | 跨进程数据传输方法、装置及网络设备 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101329657A (zh) * | 2007-06-19 | 2008-12-24 | 瑞达信息安全产业股份有限公司 | 一种用于多应用间的安全共享动态内存系统和方法 |
CN101877726B (zh) * | 2010-05-25 | 2015-03-25 | 中兴通讯股份有限公司 | 链接地址处理方法及设备 |
-
2012
- 2012-05-24 CN CN201210164179.5A patent/CN103425538B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102004675A (zh) * | 2010-11-11 | 2011-04-06 | 福建星网锐捷网络有限公司 | 跨进程数据传输方法、装置及网络设备 |
Also Published As
Publication number | Publication date |
---|---|
CN103425538A (zh) | 2013-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103425538B (zh) | 进程通讯方法及系统 | |
US10446174B2 (en) | File system for shingled magnetic recording (SMR) | |
CN102035697B (zh) | 一种文件系统的并发连接数性能测试系统和方法 | |
CN104731799B (zh) | 内存数据库管理装置 | |
CN107924289A (zh) | 计算机系统和访问控制方法 | |
CN104317742A (zh) | 一种优化空间管理的自动精简配置方法 | |
CN101150485A (zh) | 一种零拷贝缓冲区队列网络数据发送的管理方法 | |
CN109388590A (zh) | 提升多通道dma访问性能的动态缓存块管理方法和装置 | |
CN104270412A (zh) | 一种基于Hadoop分布式文件系统的三级缓存方法 | |
CN105740248B (zh) | 一种数据同步方法、装置及系统 | |
CN106020731B (zh) | 存储设备、存储设备阵列和网络适配器 | |
CN107493329A (zh) | 一种分布式内存文件系统的远程文件访问方法 | |
CN107368583A (zh) | 一种多集群信息查询的方法及系统 | |
CN111427678A (zh) | 汽车诊断云平台中的虚拟化资源调度系统、方法 | |
US12008402B2 (en) | Determining computer resource usage at multiple levels of a container orchestration system hierarchy | |
CN103810109A (zh) | 内存分配方法、装置及系统 | |
CN103440200B (zh) | 一种基于双操作系统的高实时大数据量测试回放方法 | |
EP4185963B1 (en) | Zone hints for zoned namespace storage devices | |
CN106209933A (zh) | 源主机、迁移架构及数据迁移方法 | |
CN105426125B (zh) | 一种数据存储方法及装置 | |
CN105373346B (zh) | 一种虚拟化存储方法及存储装置 | |
CN105786724B (zh) | 空间管理方法及装置 | |
CN106354673A (zh) | 基于多dma队列的数据传输方法和装置 | |
CN102662891B (zh) | 基于亲和性感知的dma缓冲区管理方法及装置 | |
CN105183628B (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 | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |