专利名称:一种实现一对多的进程间通信的系统和方法
技术领域:
本发明涉及计算机网络技术领域,特别是涉及一种实现一对多的进程间通信的系统和方法。
背景技术:
近年来,网络即时通信软件发展迅猛,在网络应用中占有重要的地位。输入法类软件作为用户输入的必备软件,各类输入法的用户量是非常巨大的也已成为不争的事实。如果将即时通信(IM)类应用程序(产品)嵌入到输入法中,可以大大提高IM产品的用户使
用量。 但是输入法类应用程序有其特殊性,就是输入法程序在操作系统中是以动态链接库的形式存在,它的运行需要依附于父进程(即加载它的进程)。为记事本为例,具体过程如下启动记事本,切换出输入法,这个过程是由Windows操作系统的专有服务程序将相应的输入法动态链接库加载到该记事本进程空间中。如果打开多个记事本程序,每个记事本程序切换出输入法,那么这多个输入法所处的进程空间是独立的。也就是说当有多个应用程序加载输入法时,输入法也相应启动了多份实例。此时,如果按照传统的简单叠加的方式将頂产品嵌入到输入法中时,頂产品也启动相应数量的多份实例,这增大了系统开销。
发明内容
本发明提供了一种实现一对多的进程间通信的系统,该系统能够解决将IM产品嵌入到输入法中以及类似情况下,启动的进程实例多及开销大的问题。本发明还提供了一种实现一对多的进程间通信的方法,该方法能够解决将IM产品嵌入到输入法中以及类似情况下,启动的进程实例多及系统开销大的问题。为达到上述目的,本发明的技术方案是这样实现的本发明提供了一种实现一对多的进程间通信的系统,该系统运行有多个第一类进程、一个第二类进程和一个共享内存;同一时刻只有一个第一类进程需要与第二类进程进行通信,其中共享内存包括数据区和控制区,且共享内存的控制区包括控制权字段和第二类进程地址字段;第一类进程,将自身的地址写入共享内存控制区的控制权字段中,当需要与第二类进程进行通信时,第一类进程从共享内存控制区的第二类进程地址字段中读取第二类进程的地址,根据所读取的地址向第二类进程发送命令消息;第二类进程,在接收到命令消息后,执行该命令,从共享内存控制区的控制权字段读取进程地址,向所读取的进程地址所对应的第一类进程发送命令执行状态消息。本发明还公开了一种实现一对多的进程间通信的方法,共享内存被划分为数据区和控制区,其中控制区包括控制权字段和第二类进程地址字段,同一时刻只有一个第一类进程需要与第二类进程进行通信,则多个第一类进程和一个第二类进程之间的通信包括当前的第一类进程将自身的地址写入共享内存控制区的控制权字段中,当需要与第二类进程进行通信时,第一类进程从共享内存控制区的第二类进程地址字段中读取第二类进程的地址,根据所读取的地址向第二类进程发送命令消息;第二类进程在接收到命令消息后,执行该命令,从共享内存控制区的控制权字段读取进程地址,向所读取的进程地址所对应的第一类进程发送命令执行状态消息。由上述可见,本发明这种基于共享内存进行控制权切换实现一个第二类进程和多个第一类进程之间的一对多通信的技术方案,不仅能够实现将第二类进程嵌入到第一类进程中,且即使多个第一类进程需要运行多个实例,第二 类进程也只需要运行一份实例即可,例如可以实现将IM应用程序进程嵌入到输入法中,且当有多个应用程序加载输入法时,即使输入法也相应启动多份实例,但却只需维护一份IM实例即可。这大大减少了系统开销。
图I是本发明中的实现一对多的进程间通信的系统的组成示意图;图2是本发明实施例中的输入法争夺IM应用程序进程的控制权的流程图;图3是本发明实施例中的初始状态下SRA争取控制权的过程示意图;图4是本发明实施例中的SRB夺取控制权的过程示意图;图5是本发明实施例中的SRB进程与MP进程进行交互的示意图。
具体实施例方式本发明的核心思想是IM产品和输入法在独立的进程空间中运行,使用共享内存的方式进行数据交互,如果有多个输入法实例在运行,同一时刻只能有一个与IM产品进行数据交互。通过“控制权”转移的方式来实现任一时刻只有一个输入法实例可以控制頂产品,与IM产品进行数据交互。控制权相关的信息记录在共享内存中,IM产品实例和输入法实例通过访问共享内存实现数据交互。这种思想及技术手段可以延及到类似的其他应用场景。为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。图I是本发明中的实现一对多的进程间通信的系统的组成示意图。如图I所示,该系统运行有多个第一类进程、一个第二类进程和一个共享内存;同一时刻只有一个第一类进程需要与第二类进程进行通信,其中共享内存包括数据区和控制区,且共享内存的控制区包括控制权字段和第二类进程地址字段;第一类进程,将自身的地址写入共享内存控制区的控制权字段中,当需要与第二类进程进行通信时,第一类进程从共享内存控制区的第二类进程地址字段中读取第二类进程的地址,根据所读取的地址向第二类进程发送命令消息;第二类进程,在接收到命令消息后,执行该命令,从共享内存控制区的控制权字段读取进程地址,向所读取的进程地址所对应的第一类进程发送命令执行状态消息。在图I所示的系统中,共享内存的控制区还包括第二类进程启动标识字段;
第一类进程,在需要与第二类进程进行通信时,先从共享内存控制区的第二类进程启动标志字段中读取第二类进程启动标志位,根据该标志位判断第二类进程是否已启动;如果第二类进程已启动,则用自身的地址更新共享内存控制区的控制权字段;如果第二类进程没有启动,则启动第二类进程,将所述第二类进程启动标志字段中的标志位设置成有效,将第二类进程的地址写入所述第二类进程地址字段中,将自身的地址写入共享内存控制区的控制权字段中。在图I所示的系统中,第一类进程以及第二类进程,在读写共享内存控制区之前获取共享内存控制区的读写锁,并在完成对共享内存控制区的读写后,释放共享内存控制区的读写锁。在图I所示的系统中,所述第一类进程可以为输入法进程,所述第二类进程可以是即时通信应用程序进程。此时,根据图I所示的系统,不仅可以实现将即时通信应用程序嵌入到输入法中,且当有多个应用程序加载输入法时,即使输入法也相应启动多份实例,但却只需维护一份頂实例即可。
下面仍以输入法进程和IM应用程序进程为例,对发明的技术方案进一步进行详细说明。在本实施例中,输入法通过共享内存与頂应用程序进程进行数据交互。共享内存分为控制区和数据区两部分,控制区主要用于控制权切换,数据区用于输入法和IM应用程序进程之间指令数据的交互。控制区具体分为三个字段控制权字段,用于存放输入法的虚拟地址(不论頂应用程序进程,还是输入法,都有一个唯一的标识,称之为虚拟地址);IM应用程序进程启动标志字段,用于记录頂应用程序进程是否已经启动(即是否开始运行);頂应用程序进程地址字段,用于存放頂应用程序进程的虚拟地址。数据区中用于存放交互数据,任一时刻只有一个实体(输入法或IM应用程序)有权写数据区,这种权限通过事件互斥可以实现,这里不再详述,任一有权实体写完数据后,需要通知相应的实体去读取数据。在上述前提下多个输入法和一个頂应用程序进程间的通信过程包括如图2所示的过程。图2是本发明实施例中的输入法争夺IM应用程序进程的控制权的流程图。如图2所示,包括以下步骤步骤201,应用程序切换出输入法。Windows操作系统专有的服务程序会加载此输入法到该应用程序的地址空间。输入法被加载启动。步骤202,输入法访问共享内存控制区,读取頂应用程序进程启动标志字段中的标志位。步骤203,根据标志位判断頂应用程序进程是否已启动。如果该标志位有效(即已经被置位),说明頂应用程序进程已经启动,执行步骤204,否则说明頂应用程序进程没有被启动,执行步骤205。步骤204,頂应用程序进程已经启动,需要切换控制权。任一时刻,頂应用程序进程只会被当前处于激活状态的输入法控制。切换控制权的过程就是访问共享内存控制区,修改控制权字段的过程。输入法将自身的虚拟地址写入控制权字段中,完成控制权的切换。步骤205,頂应用程序进程没有启动,说明是第一次切换出输入法,输入法启动頂应用程序进程。步骤206,输入法修改共享内存控制区中的頂应用程序进程启动标志字段,将该字段的标志位进行置位,并将頂应用程序进程的虚拟地址写入共享内存控制区中的頂应用程序进程地址字段。步骤207,输入法修改控制权字段,将当前输入法自身的虚拟地址写入共享内存控制区的控制权字段中。下面例举一个具体实施例进行说明。假设如下场景两个输入法进程SRA和SRB,一个頂应用程序进程MP。系统运行任一时刻,只有一个输入法进程处于激活状态,处于激活状态的输入法与MP发生交互。初始状态SRA进程启动并激活,IMP进程未启动。 1-1 SRA进程启动并激活,初始化共享内存控制区,并且启动MP进程。过程如图3所示。图3是本发明实施例中的初始状态下SRA争取控制权的过程示意图,如图3所示SRA获取共享内存控制区的读写锁;获取成功后,检查控制区中的IM应用程序进程启动标志字段中的标志位;根据该标志位发现頂P未启动后,将SRA进程的地址写入共享内存控制区的控制权字段,初始化控制权;启动MPJf頂应用程序进程启动标志字段中的标志位置位,并将MP的地址写入共享内存控制区的頂应用程序进程地址字段;释放共享内存控制区的读写锁。1-2 =SRB进程启动并激活,此时SRA转为未激活状态,SRB需要夺取控制权。具体过程如图4所示。图4是本发明实施例中的SRB夺取控制权的过程示意图。如图4所示SRB获取共享内存控制区的读写锁;获取成功后,检查控制区中的IM应用程序进程启动标志字段中的标志位;根据该标志位发现MP已启动后,将SRB进程的地址写入共享内存控制区的控制权字段,夺取控制权;SRB释放共享内存控制区的读写锁。1-3 =SRB进程与MP进程的交互过程,如图5所示。图5是本发明实施例中的SRB进程与MP进程进行交互的示意图。如图5所示SRB获取共享内存控制区的读写锁;获取成功后,读共享内存控制区的IM应用程序进程地址字段,获取MP的地址;根据MP的地址向MP发送命令消息;SRB释放共享内存控制区的读写锁;IMP根据所接收的命令消息执行命IMP获取共享内存控制区的读写锁;获取成功后,读共享内存控制区的控制权字段,获取当前的实控进程SRB的地址;根据SRB的地址向SRB发送命令执行状态消息;MP释放共享内存控制区的读写锁。到此完成了 SRB和MP的交互。综上所述,本发明这种基于共享内存进行控制权切换实现一个第二类进程和多个第一类进程之间的一对多通信的技术方案,不仅能够实现第二类进程和第一类进程之间的交互式合作,且即使多个第一类进程需要运行多个实例,第二类进程也只需要运行一份实例即可,例如可以实现将IM应用程序进程嵌入到输入法中,且当有多个应用程序加载输入法时,即使输入法也相应启动多份实例,也只需维护一份頂实例即可。这大大减少了系统开销。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做 的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
权利要求
1.一种实现一对多的进程间通信的系统,其特征在于,该系统运行有多个第一类进程、一个第二类进程和一个共享内存;同一时刻只有一个第一类进程需要与第二类进程进行通 目,其中: 共享内存包括数据区和控制区,且共享内存的控制区包括控制权字段和第二类进程地址字段; 第一类进程,将自身的地址写入共享内存控制区的控制权字段中,当需要与第二类进程进行通信时,第一类进程从共享内存控制区的第二类进程地址字段中读取第二类进程的地址,根据所读取的地址向第二类进程发送命令消息; 第二类进程,在接收到命令消息后,执行该命令,从共享内存控制区的控制权字段读取进程地址,向所读取的进程地址所对应的第一类进程发送命令执行状态消息。
2.根据权利要求I所述的系统,其特征在于, 共享内存的控制区还包括第二类进程启动标识字段; 第一类进程,在需要与第二类进程进行通信时,先从共享内存控制区的第二类进程启动标志字段中读取第二类进程启动标志位,根据该标志位判断第二类进程是否已启动;如果第二类进程已启动,则用自身的地址更新共享内存控制区的控制权字段;如果第二类进程没有启动,则启动第二类进程,将所述第二类进程启动标志字段中的标志位设置成有效,将第二类进程的地址写入所述第二类进程地址字段中,将自身的地址写入共享内存控制区的控制权字段中。
3.根据权利要求2所述的系统,其特征在于, 所述第一类进程为输入法进程; 所述第二类进程为即时通信应用程序进程。
4.根据权利要求I至3中任一项所述的系统,其特征在于, 第一类进程以及第二类进程,在读写共享内存控制区之前获取共享内存控制区的读写锁,并在完成对共享内存控制区的读写后,释放共享内存控制区的读写锁。
5.一种实现一对多的进程间通信的方法,其特征在于,共享内存被划分为数据区和控制区,其中控制区包括控制权字段和第二类进程地址字段,同一时刻只有一个第一类进程需要与第二类进程进行通信,则多个第一类进程和一个第二类进程之间的通信包括 当前的第一类进程将自身的地址写入共享内存控制区的控制权字段中,当需要与第二类进程进行通信时,第一类进程从共享内存控制区的第二类进程地址字段中读取第二类进程的地址,根据所读取的地址向第二类进程发送命令消息; 第二类进程在接收到命令消息后,执行该命令,从共享内存控制区的控制权字段读取进程地址,向所读取的进程地址所对应的第一类进程发送命令执行状态消息。
6.根据权利要求5所述的方法,其特征在于,共享内存的控制区还包括第二类进程启动标识字段; 在所述当前的第一类进程将自身的地址写入共享内存控制区的控制权字段之前,该方法还包括 当前的第一类进程先从共享内存控制区的第二类进程启动标志字段中读取第二类进程启动标志位,根据该标志位判断第二类进程是否已启动; 如果第二类进程已启动,则当前的第一类进程用自身的地址更新共享内存控制区的控制权字段; 如果第二类进程没有启动,则当前的第一类进程启动第二类进程,将所述第二类进程启动标志字段中的标志位设置成有效,将第二类进程的地址写入所述第二类进程地址字段中,将自身的地址写入共享内存控制区的控制权字段中。
7.根据权利要求6所述的方法,其特征在于, 所述第一类进程为输入法进程; 所述第二类进程为即时通信应用程序进程。
8.根据权利要求5至7中任一项所述的方法,其特征在于, 第一类进程以及第二类进程在读写共享内存控制区之前,获取共享内存控制区的读写锁,并在完成对共享内存控制区的读写后,释放共享内存控制区的读写锁。
全文摘要
本发明公开了一种实现一对多的进程间通信的系统的方法。所述方法包括共享内存被划分为数据区和控制区,控制区包括控制权字段和第二类进程地址字段,同一时刻只有一个第一类进程与第二类进程进行通信;当前的第一类进程将自身的地址写入控制区的控制权字段中,当需要与第二类进程进行通信时,第一类进程从控制区的第二类进程地址字段中读取第二类进程的地址,根据所读取的地址向第二类进程发送命令消息;第二类进程在接收到命令消息后,执行该命令,从控制区的控制权字段读取进程地址,向所读取的进程地址所对应的第一类进程发送命令执行状态消息。本发明的技术方案能够解决将IM产品嵌入到输入法中以及类似情况下,系统开销大的问题。
文档编号G06F9/54GK102799490SQ20111014007
公开日2012年11月28日 申请日期2011年5月27日 优先权日2011年5月27日
发明者王瑞彪, 马家智, 区智殷 申请人:北京神州泰岳软件股份有限公司