以类为单位的远程构件生命周期的管理方法

文档序号:6555674阅读:211来源:国知局
专利名称:以类为单位的远程构件生命周期的管理方法
技术领域
本发明涉及一种以类为单位的远程构件生命周期的管理方法,尤其是一种在计算机系统中,客户进程与服务进程之间进行构件远程调用时,创建远程构件并以类为单位对远程构件的生存期进行有效管理的方法。
背景技术
构件技术,是一种具有标准接口的对象模型技术,这种模型使各软件构件可以用统一的方式进行交互。在构件技术的实现和使用过程中,牵涉到对构件以及构件所占有资源的生存期的管理,即生命周期的管理,其着重于解决远程构件在远程调用过程中所必须的资源的创建,计数,以及销毁。
构件本身的生命周期可以通过其引用计数来控制,其必须实现的标准构件接口方法AddRef,Release可以用来控制引用计数(AddRef,Release方法详情出自微软的COM相关技术文件),而远程构件之间的调用则是通过动态生成的存根对象,代理对象间接完成的,所以远程构件生命周期管理亦牵涉到对存根对象,代理对象的存活期的管理。构件服务进程做为构件服务的载体,其活动时间亦和构件对象的生命周期紧密相连。
远程构件技术允许远程服务以及服务使用者可以处于不同的地址空间。远程服务所在空间称之为服务器端,服务使用者所在空间称之为客户端。远程服务的传递过程通过动态生成的存根对象,代理对象完成。服务器端的建立包括构件对象的建立,与构件对象对应的存根对象的建立,以及向操作系统内核注册相关服务的信息,通过这些注册信息足以找到相关服务的启动信息,亦能够通过其获得大部分建立构件对象对应的代理对象所需要的信息。客户端的建立则以对象代理的建立为标志。
微软公司(microsoft)的COM是一种典型的构件技术,针对跨域的远程构件调用,采用动态生成存根代理的方式间接完成,其远程构件生命周期管理亦涉及到对存根对象,代理对象的存活期的管理,但是,在COM的生命周期管理中,是以接口为单位,而组件本身的实现则以类为单位,即一个组件类可以实现多个接口。如图1所示,一个构件对象的实例可以允许实现多个接口,图中所示一个构件对象的实例3具有接口A、接口B和接口C。远程服务的传递过程中,在客户端动态生成存根对象1以及三个与构件对象的实例相对应的接口代理A、接口代理B和接口代理C;同样,在服务器端也建立了对象存根2和与构件对象的实例3相对应的接口存根A、接口存根B和接口存根C。在远程构件调用中,对构件接口的引用计数的操作会转发到相应的构件实现类上,相应地,由于动态生成的类存根和类代理都具有和构件类相匹配的接口存根和接口代理,因此,对于接口存根和接口代理的引用计数的操作会转发到相应的类存根和类代理上。
目前,以接口为单位的远程构件生命周期管理过程通常具有比较复杂的过程,以一个客户端的一个进程以及其所属的两个线程进行远程构件调用为例,其包括如下过程,服务端的进程首先创建一个远程构件服务,如图1中的构件对象的实例,具有三个接口存根;运行于客户端的进程的一个线程获得该远程构件服务的一个接口,客户端的另一个线程获得该远程构件服务的另一个接口;当客户端的两个线程分别使用完成该远程构件服务后,先后释放掉与其对应的接口;服务端的进程选择合适的时机注销该远程构件服务。在这一过程中,两个线程对远程构件服务的调用需要经过四次远程调用,当客户端的进程具有更多的线程时,或者有多个客户端的进程需要进行远程构件服务时以及出现跨进程调用时,远程调用的耗时将会过长,从而浪费了大量的系统资源。

发明内容
本发明的目的在于针对上述以接口为单位的远程构件生命周期管理过程所存在的远程调用耗时过长,浪费了大量的系统资源的现状,而提供一种以类为单位的远程构件生命周期的管理方法,该方法以类为单位进行远程构件调用,能够减少远程调用次数,降低调用耗时,提高远程构件服务效率。
为实现上述目的,本发明采用的一种以类为单位的远程构件生命周期的管理方法,包括以下步骤步骤1、在服务端创建一个与构件对象一一对应的存根对象,通过调用AddRef方法,设置该存根对象引用计数器的初始值,同时通过调用构件对象的AddRef方法一次,在构件对象引用计数器原有数值上加1;步骤2、判断客户端是否异常退出,如果是,则执行步骤9;如果不是,则执行步骤3;步骤3、判断服务端是否异常退出,如果是,则执行步骤11;如果不是,则执行步骤4;步骤4、在客户端创建一个代理对象,通过调用AddRef方法,设置该代理对象引用计数器的初始值,并远程对所述存根对象引用计数器的AddRef方法一次,使其加1;步骤5、获得所述代理对象,通过调用AddRef方法一次,将所述代理对象引用计数器的初始值加1;步骤6、通过调用所述代理对象的Release方法,将所述代理对象引用计数器的数值减1;用户可以通过代理对象调用构件对象的相应方法,完成用户所需要完成的任务。
步骤7、调用所述代理对象的Release方法,将所述代理对象引用计数器置为0;远程调用所述存根对象的Release方法,将所述存根对象引用计数变为1;释放掉所述代理对象以及与所述代理对象相关的资源;步骤8、调用所述存根对象的Release方法,将所述存根对象引用计数变为0;释放掉构件对象指针,使所述构件对象计数器返回所述原有数值;释放掉所述存根对象以及与所述存根对象相关的资源,然后执行步骤12;步骤9、在客户端创建一个代理对象,通过调用AddRef方法,设置该代理对象引用计数器的初始值;在所述客户端的进程对象中记录所述存根对象的相关信息,并远程对所述存根对象引用计数器的AddRef方法一次,使其加1;步骤10、调用所述代理对象的Release方法,将所述代理对象引用计数器置为0;在所述客户端的进程对象中删除所述存根对象的相关信息,远程调用所述存根对象的Release方法,将所述存根对象引用计数变为1;释放掉所述代理对象以及与所述代理对象相关的资源;步骤11、所述服务端释放所创建的存根对象以及与所述存根对象相关的资源,并删除由服务端进程向系统内核注册的信息,然后执行步骤12;步骤12、结束。
通过上述技术方案可以看出,本发明具有以下几个特点,能够通过引用计数来动态控制构件对象以及存根对象,代理对象的存活期;服务器进程控制它自己的生命周期,可以在任何它意愿的时候终止自己,服务器进程的设计者可以选择将其生命周期和构件对象的生命周期挂钩;远程客户端进程在使用完构件前必须增加构件服务的相关引用计数,以防止在使用过程中服务退出,使用完服务后要释放相关引用计数;服务器进程异常退出,则所有的构件服务的远程客户端获得的指针将失效,其相关资源依然可以正常释放;远程客户端异常退出,其所拥有的远程构件指针以及资源将全部释放。这些特点也正是本发明对远程构件生命周期进行管理的方法所遵循的原则;以类为单位做引用计数管理同以接口为单位做引用技术管理大大减少了接口(如构件对象的查询接口QuerryInterface)之间的远程消耗,更符合构件对象模型;代理,存根的引用计数优化使Addref,Release等用户显式的构件生命周期管理操作最大限度的控制在本地进行处理。
本发明通过对以类为单位的构件对象、存根对象和代理对象的创建以及采用以类为单位的引用计数进行生命周期管理,使处于操作系统不同空间的构件服务和构件服务调用者能够进行远程通讯和数据交换,并且大大缩短了调用的耗时,节省了系统资源。
以下,通过具体实施方式
并结合附图对本发明做进一步的详细说明。


图1为以接口为单位进行远程构件的生命周期管理的构件对象实例与存根对象、代理对象之间的关系示意图;图2为构件对象、存根对象,代理对象之间的关系示意图;图3为本发明的一个具体实施例的流程图;图4为图3所示实施例中存根对象的创建流程图;图5为图3所示实施例中代理对象的创建流程图。
具体实施例方式
CAR即Component Assembly Runtime,是一种构件技术,该技术支持远程接口调用,即允许构件服务和构件服务调用者处于操作系统的不同空间,这两个不同空间之间不允许彼此直接访问或者具有不同的访问权限,构件服务和构件服务调用通过第三方进行通讯和数据交换。远程构件生命周期的管理用于对构件的生存期管理以及对于构件在远程化过程中所需要的资源的生存期管理,其着重于解决远程构件在远程调用过程所必须的资源的创建,计数,以及销毁。
本发明对远程构件生命周期的管理是以类为单位实现的,其主要包括三大内容创建与远程构件对象相关的存根对象、代理对象;远程调用并引用计数方法;在条件具备的情况下释放系统资源、注销相关注册信息。
通过CAR构件技术可以动态生成存根对象、代理对象。存根对象和构件服务处于服务器端,代理对象则处于客户端。一个远程构件服务由存根对象以及构件服务实例组成,存根对象和构件服务实例之间存在一一对应的关系,存根对象的生成标志着一个远程构件服务的建立,而客户端的建立则以代理对象的生成为标志,该代理对象一定对应于某个远程存根对象。图2所示为远程构件服务中,构件对象6、存根对象4,代理对象5之间的关系。远程构件服务进程具有一个存根对象4。任何一个客户端的用户进程只能同时拥有或创建一个对应于该存根对象4的代理对象5,而一个远程构件服务进程的存根对象4则可以拥有多个客户端的代理对象5,换句话说可以允许存在多个代理对象和一个存根对象相对应。对于远程构件的调用,由客户端程序转发给代理对象5,代理对象5再通过远程转发给服务端的存根对象4,存根对象4则再把调用转发给构件对象6。
在通过引用计数进行管理时,实际上是通过代理对象,再转发到存根对象,由存根对象再转发到构件对象本身,当然,并不是客户端的每一个本地的AddRef和Release都会翻译成远程的AddRef以及Release。出于效率的考虑,本发明对于引用计数的管理进行了一系列如下基于算法的合理优化1、存根对象作为远程服务的标志,当存根对象被创建的时候,本进程内AddRef 1次相对应的组件对象的引用计数;远程服务取消,存根对象销毁的时候释放1次(调用Release)该引用计数。
2、除存根对象被创建以及引用计数被减到0时存根对象被销毁两种情况,所有针对存根对象的引用计数的操作都只作用于存根对象本身上,而与构件对象无关。
3、代理对象作为客户端获得远程服务的标志,当代理对象被创建的时候,远程AddRef一次相应的存根对象的计数;客户端使用完该远程服务,释放掉服务,销毁代理对象的时候远程释放1次(远程调用Release)存根对象的引用计数。
4、除代理对象被创建,以及引用技术被减到0代理对象被销毁两种情况,所有针对代理对象的引用计数的操作都只作用于代理对象本身上,且完全是在客户端进行,不与服务器端进行交互。
5、按照标准的COM引用计数规则使用引用计数,当远程的对象指针被释放的时候,其代理对象的计数到0,代理对象即会被销毁。
6、一个进程空间同时段多次获得某个远程服务,将现存的代理对象引用计数加1,在任意时间点,相对于获取的某个远程服务,一个进程只有一个相应的代理存在。
图3所示为本发明一个具体实施例的流程,其步骤如下步骤301、在服务端创建一个与构件对象一一对应的存根对象,通过调用AddRef方法,设置该存根对象引用计数器的初始值,同时通过AddRef方法一次,在构件对象引用计数器原有数值m上加1,成为m+1。存根对象引用计数器的初始值设置为1。
步骤302、判断客户端是否异常退出,如果是,则执行步骤309;如果不是,则执行步骤303。
步骤303、判断服务端是否异常退出,如果是,则执行步骤311;如果不是,则执行步骤304;步骤304、在客户端创建一个代理对象,通过调用AddRef方法,设置该代理对象引用计数器的初始值,该初始值可以设置为1;远程对存根对象引用计数器的AddRef方法一次,使其加1;步骤305、获得所述代理对象,通过调用AddRef方法一次,将所述代理对象引用计数器加1,使其变为2。
步骤306、通过调用所述代理对象的Release方法,将所述代理对象引用计数器的数值减1。
步骤307、调用所述代理对象的Release方法,将所述代理对象引用计数器置为0;远程调用所述存根对象的Release方法,将所述存根对象引用计数变为1;释放掉所述代理对象以及与所述代理对象相关的资源。
步骤308、调用所述存根对象的Release方法,将所述存根对象引用计数变为0;释放掉构件对象指针,使所述构件对象计数器返回所述原有数值,即由m+1变为m;释放掉所述存根对象以及与所述存根对象相关的资源,然后执行步骤312。
步骤309、由于客户端异常退出可能带来包括客户端所拥有的服务器端的接口指针没有释放,导致服务器端引用计数不对以及无法正常退出等问题,客户端出现异常退出的情况如下,在客户端创建一个代理对象,通过调用AddRef方法,将该代理对象引用计数器的初始值设置为1;在所述客户端的进程对象中记录所述存根对象的相关信息,并远程对所述存根对象引用计数器的AddRef方法一次,使其加1。
步骤310、在正常情况下,调用所述代理对象的Release方法,将所述代理对象引用计数器置为0;在所述客户端的进程对象中删除所述存根对象的相关信息,远程调用所述存根对象的Release方法,将所述存根对象引用计数变为1;释放掉所述代理对象以及与所述代理对象相关的资源。在客户端异常退出的情况下,客户端进程退出的时候则检查该进程对象中是否存在步骤309记录的信息,如果存在,则根据这些记录一一释放掉该远程构件对象服务(通过远程调用存根对象的Release方法),再删除这些信息,然后执行步骤312。
步骤311、在服务器异常退出的情况下,在服务进程对象停止活动的过程中,服务端释放所创建的存根对象以及与所述存根对象相关的资源,并删除由服务端进程向系统内核注册的信息。完成这部分工作后,如果此时客户端的远程调用转到服务器端的内核,则内核通过查找,发现相关远程构件服务已经退出,则返回错误,客户端的代理对象检测到这个错误,则释放掉其本身以及相关资源,并返回错误给用户。由于服务器端的异常退出可能导致服务器端以及内核相关数据没有被释放,造成用户内存泄漏以及内核内存泄漏,并且可能造成客户端相关调用发生错误且无法正常释放相关资源,因此,需要执行上述操作,使整个资源的释放过程完成。
步骤312、结束。
在上述步骤301中,服务端创建一个存根对象的具体过程如图4所示,其过程为步骤401、通过CAR构件环境创建一个构件对象。
步骤402、创建一个与所述构件对象一一对应的所述存根对象,通过该存根对象可以调用所述构件对象。
步骤403、向内核注册相关存根对象以及构件对象的信息。
在上述步骤304中,客户端创建一个代理对象的具体过程如图5所示,其过程为步骤501、所述客户端查询本进程内的信息,如果不存在相应的代理对象,则过列集\散集过程或通过命名服务从内核获得相关构件服务的信息。
步骤502、通过所述相关构件服务信息建立所述代理对象。
最后所应说明的是以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种以类为单位的远程构件生命周期的管理方法,其包括以下步骤步骤1、在服务端创建一个与构件对象一一对应的存根对象,通过调用AddRef方法,设置该存根对象引用计数器的初始值为1,同时通过AddRef方法一次,将构件对象的引用计数器在原有数值上加1;步骤2、判断客户端是否异常退出,如果是,则执行步骤9;如果不是,则执行步骤3;步骤3、判断服务端是否异常退出,如果是,则执行步骤11;如果不是,则执行步骤4;步骤4、在客户端创建一个代理对象,通过调用AddRef方法,设置该代理对象引用计数器的初始值为1,并远程调用所述存根对象的AddRef方法一次,使其引用计数器加1;步骤5、获得所述代理对象,通过调用AddRef方法一次,将所述代理对象引用计数器的初始值加1;步骤6、通过调用所述代理对象的Release方法,将所述代理对象引用计数器的数值减1;步骤7、调用所述代理对象的Release方法,将所述代理对象引用计数器置为0;远程调用所述存根对象的Release方法,将所述存根对象引用计数变为1;释放掉所述代理对象以及与所述代理对象相关的资源;步骤8、调用所述存根对象的Release方法,将所述存根对象引用计数变为0;释放掉构件对象指针,使所述构件对象计数器返回所述原有数值;释放掉所述存根对象以及与所述存根对象相关的资源,然后执行步骤12;步骤9、在客户端创建一个代理对象,通过调用AddRef方法,设置该代理对象引用计数器的初始值;在所述客户端的进程对象中记录所述存根对象的相关信息,并远程对所述存根对象引用计数器的AddRef方法一次,使其加1;步骤10、调用所述代理对象的Release方法,将所述代理对象引用计数器置为0;在所述客户端的进程对象中删除所述存根对象的相关信息,远程调用所述存根对象的Release方法,将所述存根对象引用计数变为1;释放掉所述代理对象以及与所述代理对象相关的资源;然后执行步骤12;步骤11、所述服务端释放所创建的存根对象以及与所述存根对象相关的资源,并删除由服务端进程向系统内核注册的信息;步骤12、结束。
2.根据权利要求1所述的以类为单位的远程构件生命周期的管理方法,其特征在于所述步骤1中创建一个存根对象的具体过程为步骤1a、通过CAR构件环境创建一个构件对象;步骤1b、创建一个与所述构件对象一一对应的的所述存根对象,通过该存根对象可以调用所述构件对象;步骤1c、向内核注册相关存根对象以及构件对象的信息。
3.根据权利要求1所述的以类为单位的远程构件生命周期的管理方法,其特征在于所述步骤1中将所述存根对象引用计数器的初始值设置为1。
4.根据权利要求1所述的以类为单位的远程构件生命周期的管理方法,其特征在于所述步骤4中创建一个代理对象的具体过程为步骤41、所述客户端查询本进程内的信息,如果不存在相应的代理对象,则过列集\散集过程或通过命名服务从内核获得相关组件服务信息;步骤42、通过所述相关组件服务信息建立所述代理对象。
5.根据权利要求1、2或3所述的以类为单位的远程构件生命周期的管理方法,其特征在于所述步骤4中将所述代理对象引用计数器的初始值设置为1,且通过AddRef方法一次,使所述存根对象引用计数器为2。
6.根据权利要求5所述的以类为单位的远程构件生命周期的管理方法,其特征在于所述步骤5中通过调用AddRef方法一次,将所述代理对象引用计数器设置为2。
7.根据权利要求6所述的以类为单位的远程构件生命周期的管理方法,其特征在于所述步骤9中通过调用AddRef方法,将该代理对象引用计数器的初始值设置为1。
全文摘要
本发明涉及一种以类为单位的远程构件生命周期的管理方法,该方法包括创建与远程构件对象相对应的存根对象、代理对象;通过调用AddRef和Release方法对存根对象、代理对象的引用计数器的值进行增减;在条件具备的情况下释放系统资源、注销相关注册信息。本发明通过引用计数来动态控制构件对象以及存根对象,代理对象的存活期,大大减少了接口之间的远程消耗,更符合构件对象模型;同时代理,存根的引用计数的优化使用户对构件生命周期管理操作最大限度的控制在本地进行处理,方便了用户使用,也节省了系统资源。
文档编号G06F9/44GK1889038SQ200610029729
公开日2007年1月3日 申请日期2006年8月3日 优先权日2006年8月3日
发明者苏翼鹏, 刘亚东, 梁宇洲, 陈榕, 王晨辉 申请人:上海科泰世纪科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1