(计算机应用技术专业论文)基于com组件的局域网管理模型的研究.pdf_第1页
(计算机应用技术专业论文)基于com组件的局域网管理模型的研究.pdf_第2页
(计算机应用技术专业论文)基于com组件的局域网管理模型的研究.pdf_第3页
(计算机应用技术专业论文)基于com组件的局域网管理模型的研究.pdf_第4页
(计算机应用技术专业论文)基于com组件的局域网管理模型的研究.pdf_第5页
已阅读5页,还剩89页未读 继续免费阅读

(计算机应用技术专业论文)基于com组件的局域网管理模型的研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京交通大学硕士学位论文 摘要 随着软件需求的激增,软件规模和复杂度不断增大,传统软件开发模 式面临巨大挑战,人们开始探索新的软件开发技术来适应软件发展的需求。 组件技术致力于两个目标:管理日益增加的复杂的应用程序和代码重用。 组件技术的发展推动了网络技术及中间件技术的蓬勃发展,为软件的发展 开辟了崭新的空问。 c o m 是微软提出的一种协议,它定义了一套在构建一个组件时所遵循 的规则,遵循此种规范我们可以管理日益增加的复杂的应用程序和实现二 进制意义上的代码重用。因此本论文围绕着c o m 技术的核心讨论了以下 几个方面: l 、概述了组件技术产生的背景、组件技术的技术规范、c o m 的 特性以及组件对象模型中的重要概念。 2 、阐述了接口的概念及其在c o m 中的核心地位,深入讨论了接 口的实现意义以及其实现原理。 3 、描述c o m 服务器,讨论了c o m 如何将其中对象付诸运行, c o m 服务器如何介入及在何种程度上介入到程序的运行中 去。探讨了整个对象的运行机制。 4 、分析了c o m 的远程结构,以及为满足不同的并发要求而定义 的规范,最终将其统一到c o m 模型内部并给以恰好足够的支 持。讨论了c o m 对于远程通信所提供的支持以及其所带来的 无关性和灵活性。 5 、讨论了连接点的意义和作用原理。 6 、利用c o m 作为支持实现局域网管理模型,并讨论了c o m 技 术为该模型在效率、复用性、扩展性方面带来的良好特性。 关键字:c o m软件复用局域网监控接口c o m 服务器 远程结构连接点 北京交通大学硕士学位论文 a b s t r a c t w i t ht h e r a p i d i n c r e a s ei nt h e c o m p l e x i t ya n dr e q u i r e m e n t s o fs o f t w a r e s y s t e m s ,t h e t r a d i t i o n a ls o f t w a r e d e v e l o p m e n t m o d ef a c e st h ee n o r m o u s c h a l l e n g e p e o p l eb e g i n t or e s e a r c hn e ws o f t w a r ed e v e l o p m e n tt e c h n o l o g i e st o m e e tt h en e e d so f d e v e l o p m e n to f t h es o f t w a r e s o f t w a r er e u s ei sa ne f f e c t i v e m e t h o dt od e a lw i t ht h es o f t w a r ec r i s i s ,a n d c o m p o n e n tt e c h n i q u ep l a y sa n i m p o r t a n tr o l ei ns o f h , v a l - er e u s e 。c o m p o n e n tt e c h n i q u ew a s d e v o t e dt ot o w a i m s :t h em a n a g e m e n to f i n c r e a s i n g l yc o m p l i c a t e da p p l i c a t i o na n ds o f t w a r e r e u s e c o mi sar e g u l a t i o n p r o v i d e db ym i c r o s o f tc o r p o r a t i o n i t d e f i n e sr u l e s w h i c hs h o u l db eo b e y e dw h e np e o p l ec o n s t r u c tac o m p o n e n t t h u sw ec a l l m a n a g ei n c r e a s i n g l yc o m p l i c a t e da p p l i c a t i o n sa n d r e a l i z et h es o f t w a r er e u s et o s o m e b i n a r ye x t e n t t h i sp a p e r d i s c u s s e st h ef o l l o w i n gc o n t e n t s : 1 i n t r o d u c e st h eb a c k g r o u n do f c o m p o n e n tt e c h n i q u e ,t h ec h a r a c t e r i s t i c s 2 3 o fc o ma n ds o m e i m p o r t a n tc o n c e p t so f c o m p o n e n to b j e c tm o d l e d e s c r i b e st h ek e r n e ls t a t u s ,s i g n i f i c a n c ea n d t h e o r y o f i n t e r f a c e d e s c r i b e sc o m s e r v e r , d i s c u s s e st h ew o r k i n gp r o c e s so fo b j e c ta n d h o wc a ni to p e r a t e si nt h a tw a y 4 a n a l y z e s t h er e m o t ec o m p o n e n to fc o ma n dt h e d i f f e r e n tc o n c u r r e n c e u n i t e si ti n c o m p o n e n t p r o v i d e s c o r r e c ts u p p o r t r e g u l a t i o nf i t t e df o r o b j e c t m o d e la n d 5 d i s c u s s e st h e s i g n i f i c a n c ea n df u n c t i o n a r yt h e o r y o f c o n n e c t i o n 6 r e a l i z e st h el a nm a n a g e m e n tm o d e l ,d i s c u s s e sc o m s p e r f o r m a n c e i ne f f i c i e n c y , r e u s e ,e x p a n s i b i l i t ye t c p o i n t p e r f e c t k e yw o r d s :c o m ,s o f t w a r er e u s e ,l a b lm a n a g e m e n li n t e r f a c e ,c o m s e r v e r , r e m o t ec o m p o n e n t ,c o n n e c t i o np o i n t 独创性声明 y - 4 1 3 3 3 本人声明,所呈交的学位论文是我个人在导师指 导下进行的研究工作及取得的研究成果。尽本人所 知,除了文中特别加以标注和致谢的地方外,论文中 不包含其他人已经发表或撰写过的研究成果,也不包 含为获得北京交通大学或其他教学机构的学位或证 书而使用过的材料。与我一起工作的同志对本研究所 做的任何贡献已在论文中作了明确的说明并表示了 谢意。 本人签名: 日期:年月日 关于论文使用授权的说明 本人完全了解北京交通大学有关保留、使用学 位论文的规定,即:学校有权保留送交论文的复印件, 允许论文被查阅和借阅:学校可以公布论文的全部或 部分内容,可以采用影印、缩印或其他复制手段保存 论文。论文中所有创新和成果归北京交通大学计算机 与信息技术学院所有。未经许可,任何单位和个人不 得拷贝。版权所有,违者必究。 本人签名: 日期:年一月一日 j t 京交通大学硕士学位论文 1 1 组件技术的发展 第一章概述 1 1 1 组件技术产生背景 随着计算机网络的飞速发展,软件的应用环境变得更加广阔。软件产 业也获得了飞速的发展,人们对软件的要求也越来越高,随着在更加深入 层次和更广阔空间上的应用,软件本身也更加趋于复杂。在这种背景下。 一个应用常常需要异种的计算机硬件平台及其相连的操作系统平台并且其 功能常常需要不断的扩展,大的应用软件常常需要有跨越多个异种平台的 能力并且有开放的系统结构。此外,为了提高开发速度和节省开发费用, 需要最大限度地重用以有代码。因此,当今的应用软件普遍需要有良好的 平台兼容性、互操作性、结构开放性、可扩展性及代码重用能力等。 另一方面,在传统的系统开发技术下,庞大的软件使得开发越来越难、 开发周期越来越长、维护费用越来越高并且功能的扩展危险而难行。应用 系统严重依赖于操作系统和特定的网络服务因而开放性很差。开发者为每 种不同的应用环境( 本地应用、网络应用、不同操作平台的应用) 开发不同 的代码。为解决这些问题,国际上成立了许多标准化组织来对系统和处理 方式加以标准化,但这只是增强软件可操作性和重用性的种权宜之计,并 不能彻底解决问题。在这种情况下,为适应这种分布式软件应用环境,组 件化程序设计思想迅速地发展起来,出现了具有互操作能力和可重用能力 的组件对象设计模式和具有分散和联合处理能力的开放分布式处理系统。 1 _ 1 2 复用软件的发展历程 北京交通大学硕士学位论文 组合软件模型是新一代软件技术发展的标志,它的提出很自然,为了 提高软件生产力、不草率地开发应用程序、设计开发人员应尽可能地利用 可重用的软件构件、组装构造新的应用软件系统。追根求源,由软件模块 构件组织合成软件的思想早在7 0 年代就已提出了,函数就是一种最原始的 组件,函数通过参数来适应不同应用需求的变化,a d a 语言的模块p a c k a g e 就是一种构件,实现了内部细节掩藏,模块通过接口规范说明进行连接和 组装,p a c k a g e 还提供了类属机制,使模块通过类属参数,适应不同应用需 求的变化。但是,传统软件系统结构的局限性,以过程为中心设计的功能 模块,其扩充和复用的能力都较差,对模块进行应用重组的困难很多。 从8 0 年代开始的面向对象技术的研究,使组合软件又萌发出新的生命 力。面向对象技术使得人们的编程思想和模式发生了根本上的转变,它所 提供的服务概念更加深刻地描述了事物之间的关系和行为准则,它所提供 的封装、继承等特性极大地方便了代码重用和事物描述,极大地提高了类的 可扩充性和可再用能力。对象类较之于传统软件的功能模块而另具有的主 要优点是: l 、易于理解,具有完整的语义特征; 2 、易于重用,可方便地被使用到不同的应用中; 3 、良好的封装性和独立性,相互之间的影响小; 4 、易于扩充和修改,一个对象类的修改不影响其他的对象; 5 、易于构造组装,具有规范的外部接口。 最早大量使用面向对象技术的是o o ( 面向对象) 的编程语言,它具有上 述前三个优点。但0 0 中的对象是源代码级的,它没有也不能统一对象间 相互作用的工作机制。这意味着它不能克服以下的缺点: 0 0 中只有能提供源代码的对象止类才可被重用。客户和重用对象之间 是以一种紧致耦合的方式存在,即它的代码可重用性不能跨越编程语言的 限制。因此这对实际应用环境来说是一个十分苛刻的要求,使开发人员只能 北京交通大学硕士学位论文 利用丰富的软件资源中很少的一部分,并且难以挣脱开发商的束缚。 兼容性限制到代码级的事实意味着o o p 不能解决极其重要的软件修 改和升级问题。重用代码或者各种语言的类库都是源代码的形式发布,用 户把这些分发代码加入他们的程序中,然后重新编译。这种做法的后果是, 重用代码的可执行代码将成为客户应用中不可分割的一部分。当一个对象 被更新或替换时,即使它对外的接口没有被改变,任何使用了该对象的代 码也都需要被重新编译,与此相关的应用程序必须被重新生成并重新发行 所有相关的地点。这不仅费时、费钱且容易导致版本交叉的混乱。 由于对象没有标准的对外接口,不能使用组装技术来生成应用程序。 解决上述问题的一种技术是将重用代码以动态链接库( d l l ,d y n a m i c “n kl i b r a r y ) 的形式包装起来。动态链接库可以实现代码在内存中共享、 动态载入内存等功能,而且动态链接库与用户程序是独立的。如果升级动 态链接库不需要对客户程序作改动。无疑动态链接库是从原始的重用代码 走向可替换的、有效的可重用组件的重要一步。 但用动态连接库的形式发椎重用组件也将面临来自语言编译器的挑 战。比如c + + 缺少二进制一级的标准,没有一个统一的c + + 的二进制运 行时标准模型。因而客户在链接动态库的引入库的时候就会遇到麻烦。另 外,为了允许函数重载,c + + 编译器往往以自己的方式篡改每个入口点的 符号名,以使同一个函数名称有多种用法,由于编译器厂商按自己的方式 进行名字改编( n a m em a n g l i n g ) ,因而不同的编译器下的客户与动态链接 库无法成功链接。因而简单的用动态链接库方式,不足以实现真正意义上 的二进制重用。 组件化程序设计思想,即复杂的应用程序被设计成一些小的、功能单 一的组件模块,这些组件模块可以运行在同一台机器上,也可以运行在不 同的机器上,甚至机器的运行环境也可以不同。 组件技术是一种更高层次的对象技术:它是独立于语言和面向应用程 北京交通火学硕士学位论文 序的,它只规定组件的外在表现形式,而不关心其内部实现方法;它既可 用0 0 编程语言实现,也可用非0 0 的过程语言实现。只要遵循组件技术 的规范,各个软件开发商就可以用自己方便的语言去实现可被重用的构件, 应用程序的开发人员就有可能实现挑选组件组合新的应用软件。 1 2c o m 组件概览 1 2 1 组件技术的的分支和技术规范 目前组件与开放分布式系统模型理论已经在实际中得到了越来越广泛 的应用。当前应用较多的有以下三种技术规范或体系结构:一是 c o r b a ( c o m m o no b j e c tr e q u e s t b r o k e ra r c h i t e c t ) 、二是c o m d c o m ( c o m p o n e n to b j e c tm o d e ,d i s t r i b u t e dc o m p o n e n to b j e c tm o d e l ) 、三是 j a v a b e a n s 。o m g ( o b j e c tm a n a g e m e n tg r o u p ,对缘管理组织) 提出了 c o r b a ( c o m m o no b j e c tr e q u e s tb r e a k e ra r c h i t e c t u r e ,公共对象请求中介 体系结构) ,而微软提出了c o m ( c o m p o n e n to b j e c tm o d e l ,组件对缘模型) 标准。而j a v ab e a n s 则是s u n 公司提出的基于j a v a 的组件模型。目前, c o r b a 模型主要应用于u n i x 操作系统平台上,而c o m 主要应用于 m i c r o s o f tw i n d o w s 操作系统平台上。j a v ab e a n s 在两种平台上都有应用。 只需要平台支持j a v a 虚拟机便可。 除这三者之外,以下规范也可被用来构造分布式构件系统: o s f 的d c e ( d i s t r i b u t e d c o m p u t i n g e n v i r o m e n t ) 远程过程调用一r p c ( r e m o t ep r o c e d u r ec a l l s ) 命名管道( n a m e dp i p e ) 通讯 基于共享内存的系统 套接字( s o c k e t ) 编程 北京交通大学硕士学位论文 消息排队( m e s s a g eq u e u i n g ) 其他进程间通讯机制 数据库表、触发器和轮询( p o l l i n g ) 1 2 2c o m 的特性 推动组件技术发展的最大动力之一是软件重用。软件重用就是利用已 有的软件成分来构造新的软件,它可以减少软件开发所需的费用和时间, 且有利用提高软件的可维护性和可靠性。构件软件是目前发展最快的软件 重用方式。构件软件解决两个重要问题:一是重用,即构件具有通用的特 性,所提供的功能能为多种系统使用;二是互操作,即不同来源的构件能相 互协调、通信。共同完成更复杂的功能。 1 1 2 节也从重用的角度回顾了软件的发展历程和出现的一些问题,要 解决上面涉及的问题,就需要一种规范来统一的实现组件,这样就相当于 增加了一个中问层,实现真正意义上的独立组件。组建对琢模型( c o m , c o m p o n e n to b j e c tm o d e l ) 是一种协议,它定义了一套在构建一个组件时所 遵循的规则,由此得来的组件将可以在二进制层面上有新的特性。 c o m 规范有以下特性: 1 、支持面向对象:c o m 支持面向对象的三个原则:封装、多态、继 承。显而易见,c o m 组件封装使得用户只需了解与组件交互的方法。利 用暴露接口、用接口实现的办法实现多态;c o m 也支持继承和封装。 2 、松耦合;每个组件与应用程序都是松耦合的,只要保证接口虚函数 表不产生混乱,那么组件中接口方法的实现改变对客户程序不产生影响, 这也是对二进制级别的代码重用的最有力的支持。 3 、稳定的升级:保证以前接口声明不变的情况下,面向组件追加新的 北京交通大学硕士学位论文 接口或方法。就可以更新组件,这样新旧客户程序均可以使用新组件。 4 、位置无关性:组件既可以在被本地客户调用,也可以被远程客户调 用;组件可以和客户程序在同一进程中,也可以在独立的进程中运行。这 些差异对于用户来说是透明的。 5 、语言无关性:c o m 是二进制代码级的标准。c o m 规范的定义不依 赖于任何特定的语言。不同语言开发的c o m 对象可以交互、共享:而面 向对象编程( o o p , o b j e c t - o r i e n t e dp r o g r a m m i n g ) 语言定义的对象,只能在同 种语言中被重用。实际上,可以使用o o p 编程技术来开发c o m 组件,这 两种技术是互补的。所有编程语言中,与c o m 规范最贴近的要数c + + 。 6 、进程透明性;c o m 提供的服务组件对象在实现时有两种进程模型: 进程内对象和进程外对象。前者通常以d l l 的形式,在客户进程空问中运 行:后者通常以e x e 的形式,运行在同一机器的另一个进程空间中,或远 程机器的一个进程空间中( 此时,c o m 对象也可能是以d l l 形式提供服 务,而远程机为其创建一个代理进程) 。虽然c o m 对象有以上几种不同的 进程模型,但这些区别对于客户程序来说是透明的。客户程序只要遵照 c o m 规范操作c o m 对象即可,完全不必理会c o m 对象的进程模型。 1 2 3c o m 的基本概念 接口:接口是组件程序暴露给外部调用的数据结构,外部对象只有通 过接口来调用组件方法。 虚函数表( v t a b l e ) :指向接口暴露出来的函数的函数指针数组。虚函数 表在c o m 能够定义二进制标准的基础和关键。 i u n k n o w n 接口:i u n k n o w n 接口是所有组件必须实现的一个接口,它 有3 个方法。q u e r y i n t e r f a c e 是用以判断是否支持特定接口的方法。a d d r e f 北京交通大学硕士学位论文 和r e l e a s e 方法用以控制引用计数和管理组件对象生命周期。 类场:创建特定c o m 对象的组件。 连接点:连接点是微软定义的一组标准接口,c o m 对象用以调用已知 的客户方法。 套间:套间定义了一组对象的逻辑组合,这些对象共享同一组并发性 和重入限制,它定义对象与进程及线程之间的相互关系模型。 北京交通大学硕士学位论文 第二章接口和q u e r y i n t e r f a c e 在c o m 中函数的声明和实现是分离开的,这个小变化对组件的影响 却是决定性的,正因为这一点才使得真正意义上的c o m 规范得以建立, 才使得真正意义上的c o m 特性得以显现。 c o m 中组件对象暴露接口,而客户程序则通过接口调用组件对象的 方法。把接口与实现分开是为了把对象内部的工作细节都隐蔽掉。这样就 提供了一层间接性,将请求与服务隔离开来,也允许组件实现内部发生变 化而不影响客户程序。这也允许客户可以在运行时询问对象以便发现对象 的扩展功能。 2 1 虚函数表 在c o m 中把接口与实现分开,接下来的问题是两者之闯是如何相互 联系的,接口类又是如何描述客户与对蒙之间的通信的。为了做到这一点, 必须抓住各种编译器都统一的一些特征,以此为基础,实现上面的两个问 题。 在源代码中,c 风格的s t r u c t 在运行时的表现形式对于不同的编译器 保持不变由此c o m 中的接口实质上就是被定义为s t r u c t 的一种数据类型, 或者说就是一个s t r u e t 结构。保持接口二进制意义上不变性的另外一个关 键是对于某个给定平台上的的所有c + + 编译器都实现了同样的虚函数调 用。只有这样才能保证接口在不同编译器下编译时产生一致的虚函数表。 由于接口的要求,这个技术只需满足“没有数据成员,并且至多只有一个 没有数据成员的基类”的情形即可。 c + + 中,虚函数的运行时实现采用v p t r 和v t b l 的形式,编译器在后台 为每个包含虚函数的类产生一个静态函数指针数组,即虚函数表( v t b l ) , 北京交通大学硕士学位论文 在这个类或者它的基类中定义的每个虚函数都有一个相应的函数指针。这 个类的每个实例包含一个不可见的数据成员,即虚函数指针( v p t r ) ,这个 指针被构造函数自动初始化为指向类的v t b l 。当客户调用虚函数表时,编 译器产生代码反指向到v p t r ,索引到v t b l 中,然后在指定位置上找到函数 指针并发生调用。 例如: c l a s si a n i m a l p u b l i c : v i r t u a lv o i d e a t ( v o i d ) c o n s t - - 0 ; v i r t u a lv o i dj u m p ( v o i d ) c o n s t = o ; ) 其v p t r 指向如下图所示: 假定在给定平台上所有的编译器都使用同样的方式实现虚函数调用机 制。那么只要接口类不能包含数据成员,并且接口类不能直接从多个其他 接口类派生,所有的编译器将为客户端的方法调用产生等价的二进制码。 一个c o m 虚函数表和在c + + 中用的虚函数表是完全相同的,在一 个对象上实现一个接口意味着要为这个对象建立一个必需的虚函数表,虚 函数表的设计使c o m 能够定义一个二进制的标准,只要一个组件支持这 个二进制虚函数表标准,它就支持这个标准的组件的相互操作。从这个意 北京交通大学硕士学位论文 义上说,一个组件公布的接口是不能改变的。c o m 正是利用虚函数表不变 的这个原则实现二进制意义上的代码重用。 2 2i u n k n o w n 接口 2 2 1i u n k n o w n 的定义 在所有的组件对象中,都有一个接口 u n k n o w n 。i u n k n o w n 是所有 c o m 接口的根源。它是唯一一个不从其他c o m 接口派生的c o m 接口。 i u n k n o w n 的i d l 定义如下: 【 l o c a l 。 o b j e c t , u u i d ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 c 0 0 0 - 0 0 0 0 0 0 0 0 0 0 4 6 ) , p o i n t e r d e f a u l t ( u n i q u e ) 】 i n t e r f a c ei u n k n o w n h r e s u 【t q u e r y i n t e r f a c e ( 【i n 】r e f i t dd i d , 【o u t ,i i d _ i s ( r i i d ) 】v o i d p p v ) ; u l o n g a d d r e f 0 ; u l o n g r e l e a s e o ; ) 所有其他合法的c o m 接口都需要直接或间接从c o m 接口派生。这 就表示,所有c o m 接口的v t b l 都从这三个入口q u e r y i n t e r f a c e 、a d d r e f 和 北京交通大学硕士学位论文 r e l e a s e 开始,其他接口方法的v t b l 入口都位于这三个公共的入口之后。 其中a d d r e f 和r e l e a s e 共同完成生命周期管理服务,而q u e r y i n t e r f a c e 完成运行时类型发现服务。m i c r o s o f t 提供了c o m 的实现版本a t l 。我们 来考察一下a t l 对于这两个函数的支持,以期更深入的理解他们。 a t l 关于a d d r e f 和r e l e a s e 的实现提供了c c o m o b j e c t r o o t e x 基类, 它按照期望的线程模型给予函数以恰好足够的安全性能。 c l a s s c c o m o b j e c t r o o t e x :p u b l i cc c o m o b j e c t r o o t b a s e p u b l i c : t y p e d e f t h r e a d m o d e l _ t h r e a d m o d e l ; t y p e d e f _ t h r e a d m o d e l :a u t o c r i t i c a l s e e t i o nc r i t s e c ; t y p e d e f c c o m o b j e c t l o c k t o b j e c t l o c k ; u l o n g i n t e m a l a d d r e f 0 a t l a s s e r t ( m d w r e f 净- 1l ) ; r e t u r n _ t h r e a d m o d e l :i n e r e m e n t ( & m _ d w r e f ) ; u l o n g i m e m a l r e l e a s e o a t l a s s e r t ( m _ d w r e f o ) ; r e t u r n _ t h r e a d m o d e h :d e c r e m e n t ( & r n _ d w r e 0 ; ) v o i dl o c k o m _ c r i t s e c l o c k o ; v o i d u n l o c k ( ) m _ c r i t s e c u n l o c k o ; 北京交通大学硕士学位论文 p d v a t e : c r i t s e cm _ c r i t s e c ; ) : 其中对于单线程模型t h r e a d m o d e l :i n c r e m e n t和 一t h r e a d m o d e l :d e c r e m e n t 只是简单的加减操作。而对于多线程模型,这两 个函数则对于md w r e f 的计数增减设立l 临界区,可以避免不符合对象操 作的意外发生。 h r e s u l t q u e r y i n t e r f a c e ( 【i n 】r e f i dr i i d , o u t ,i i d _ i s ( f i i d ) 】v o i d 料p p v o b j e c t ) ; 第一个参数r i i d 是被请求的接口的实质名字。第二个参数p p v 指向一 个接口指针变量,当函数成功返回时,它包含客户所请求的接口指针。 我们通过一个例子看看q u e r y i n t e r f a e e 的实现,对于类d o g : c l a s sd o g :p u b l i c i a n i m a l ,p u b l i c i c h a r a c t e r i u n i 1 1 l ,w n s t d m e t h o d i m p d o g :q u e r y i n t e r f a c e ( r e f i i dr i i d ,v o i d + + p p v ) a s s e r t ( p p v ! = o ) ; i f ( r i i d 一- h d _ i a n i m a l ) + p p v = s t a t i c c a s t ( t m s x e l s ei f ( r i i d i i d i u n k n o w n ) p p v = s t a c i c _ c a s t ( t h j s ) ; e l s ei f :( r i i d = = ) i c h a r a c t e r ) 】2 一 一 c 北京交通大学硕士学位论文 幸p p v = s t a c i c _ c a s t ( t h j s ) ; e l s e 幸p p v = o ; r e t u r ne _ n o i n t e r f a c e ; r e i n t e r p r e tc a s t ( 幸p p v ) 一 a d d r e f o ; r e t u r n s o k ; 2 2 2q u e r y i n t e r f a c e 的特征和要求 q u e r y i n t e r f a e e 的实现必须要在对象的类型层次结构上来回转换,并 且使用静态的类型转换功能为它所支持的接口返回茫确的指针类型。 从客户的角度来看q u e r y i n t e r f a c e 非常简单,任何客户都可咀通过一 个简单的调用来查询一个对象是否支持其他的功能,但是就服务端而言, q u e r y i n t e r f a c e 必须满足特定要求,以保证c o m 规范的顺利展开。其中包 括: 1 、通过q u e r y i n t e r f a c e 客户端程序能够直接获得对象实现的任何接 口: 2 、对象的接口在生命周期中必须是静态的; 3 、通过q u e r y i n t e r f a c e 查询i u n k n o w n 必须永远成功,而且每次必须 返回相同的接口指针值。 先来看一下条件1 ,通过q u e r y i n t e r f a c e 客户程序能够直接获得对象实 现的任何接口,包括客户用来执行q u e r y i n t e r f a c e 操作的接口。那么这就要 北京交通大学硕士学位论文 求q u e r y i n t e f f a c e 的实现必须有“自反性、对称性和传递性”。我们知道这 三个特性也是图的特性,因此条件1 可以等价的理解为对象的所有接口组 成一个完全图,从一个接口到另外任一个接口都是可达的。比如: 对于对象d o g i u n k n o w , 接口的关系如下: 第1 个条件,对于每个接口来说,“自反性、对称性、传递性”作为条 件的充分性已经得到了。 1 4 裟_ c 北京交通大学硕士学位论文 第2 个条件,对象的接口在生命周期中必须是静态的,尽管客户必须 通过q u e r y i n t e r f a c e 动态地请求,才能确定对象到底支持哪些类型,但是对 象的类型层次是静态不变的。这样才能使得对象实例在提供服务时保持一 致性,不至于产生混乱。另外对于远程对象。c o m 并不保证客户所有 q u e r y i n t e r f a c e 请求都将被传递给对象。而对象接口在生命周期中的静态性 使得客户端的代理对象可以把q u e r y i n t e r f a c e 的结果缓存起来,减少远程通 信开销。 第3 个条件,对于i u n k n o w n 的q u e r y i n t e r f a e e 请求时增加了特殊限 制。利用一个所有类均有的接口来加上这个限制,就能够判断出两个接口 指针是否指向同一个对象实体。 2 3 表驱动的q u e r y i n t e r f a c e 2 3 1 表驱动的q u e r y i n t e r f a c e 的实现原理和代码 q u e r y i n t e r f a c e 是用来查询对缘支持的接口的,因而以表格方式来实现 q u e r y i n t e r f a e e 查询信息的存储是比较合适的。为了实现表格驱动的 q u e r y i n t e r f a e e 。首先每个表项要包含一个指向l i d 的指针。以便 q u e r y i n t e r f a e e 能够找到对象中与被请求的接口相对应的v p t r 我们用些宏来帮助我们实现q u e r y i n t e r f a c e 查询的数据结构和查询实 现: 定义专用的查找接口类型的结构 t y p e d e fh r e s u l t ( * i n t e r f a c e _ f i n d e r ) ( v o i d p t h i s ,d w o r d d w d a t a , r e f i i d r i i d ,v o i d 木p p v ) ; 伪函数表明表项就是偏移 北京交通大学硕士学位论文 # d e f i n e e n t r y i s 一0 f f s e t i n t e r f a c e _ f i n d e r ( - i ) ,表的基本布局,q u e r y i n t e r f a c e 操作的依据 t y p e d e fs t r u c t _ i n t e r f a c ee n t r y c o n s ti d * p l d ;指向接口的指针 i n t e r f a c ef i n d e r p f n f i n d e r ;函数指针,指向接口方法的 入口 d w o r d d w d a t a ;偏移值 i n t e r f a c e _ e n t y r ; 另外我们再定义一些宏: # d e f i n eb a s eo f f s e t ( c l a s s n a m e ,b a s e n a m e ) ( d w o r d ( s t a t i c _ c a s t ( r e i n t e r p r e t _ c a s t ( o x l0 0 0 0 0 0 ) ) ) 一0 x 1 0 0 0 0 0 0 0 ) # d e f i n eb e g i n _ i n t e r f a c e _ t a b l e ( c l a s s n a m e ) t y p e d e fc l a s s n a m e _ l t c l s ;l c o n s ti n t e r f a c e _ e n t r y g e t i n t e r f a e e t a b t e ( v o i d ) s t a t i cc o n s ti n t e r f a c e _ e n t r y t a b l e = # d e f i n ei m p l e m e n t si n t e r f a c e ( i t 0 f & i d # # l t f , e n t r y i s o f f s e t , b a s e _ o f f s e t c l s , i t f ) , # d e f i n ei m p l e m e n t s _ i n t e r f a c 置一s ( r e q 。i t o | & i i d _ # # r e q , e n t r yi s o f f s e t , b a s e _ o f f s e t ( _ i t c i s ,i t o , # d e f i n ee n d _ i n t e r f a c et a b l e 0 0 , 0 ,0 ,0 ) ;r e r l mt a b l e ; 1 6 北京交通大学硕士学位论文 比如上面例子中对象d o g c l a s sd o g :p u b l i c l a n i m a l ,p u b l i ci c h a r a c t e r , p u b l i c i a c t i o n 用以q u e r y i n t e r f a e e 的表结构如下: , t a b l e 。 & l l d 睛n i m 刊 眦) i c h a r a c t e r- & i t db o t 6 0 n - 1 - 1 - 1 b a s eo f f s e t ( d o g ,l n l r n a l ) b 疆o f f s e t i d o 口。i c h a m e t w ) b a s eo f f s e t d o g 1 a c t i c ) 那么表驱动的q u e r y i n t e r f a c e 只需要对此表进行遍历便可获取想要的 接口指针,我们可以在此t a b l e 和i n t e r f a c e _ e n t r y 结构的基础上实现 q u e r y i n t e r f a c e ,模拟代码如下 h r e s u l t i n t e r f a c e t a b l e q u e r y i n t e r f a e e ( v o i d 木p t h i s , c o n s ti n t e r f a c e _ e n t r y 车p t a b l e ,r e f i i d d i d ,v o i d 木+ p p v ) i f ( i n l i n e l s e q u a l g u l d ( r i i d ,l i d l u n k n o w n ) ) 木p p v = ( c h a r ) p t h i s + p t a b l e d w d a t a ; ( ( i u n k n o w n 十) ( 阜p p v ) ) - a d d r e f 0 ; r e t u r n so k ; ) e l s e h r e s u l th r = - en o i n t e r f a c e ; w h i l e ( p t a b l e - p f r t f i n d e r ) 1 7 北京交通大学硕士学位论文 i f ( ! p t a b l e - p a d i li n l i n e i s e q u a l g u i d ( r i i d , * p t a b l e 一 p i n g ) ) i f ( p t a b l e - p f r d r i n d e f e n t r yi so f f s e t ) p p v = ( c h a r 丰) p t h i s + p t a b l e - d w d a t a ; ( ( 1 u n k n o w n + ) ( 木p p v ) ) - a d d r e f 0 ; h r = s o k ; b r e a k ; e l s e h r = p t a b l e - p f n f i n d e r ( p t h i s ,p t a b l e - d w d a t a , d i d ,p p v ) ; i f ( h r - 一s o k ) b r e a k ; p t a b l e + + ; i f ( h r ! = s _ o k ) p p v = 0 ; r e t u m h r ; ) 给定了被查询对象的一个接口指针之后,i n t e r f a c e t a b l e q u e r y i n t e r f a c e 遍历整个表格,查找与指定l i d 匹配的表项,找到之后,或者加上相应的 偏移,或者调用适当的函数,便得到相应接口的指针。 北京交通大学硕士学位论文 s t r u c ta u t o _ l o n g l o n g v a l u e ; a u t ol o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论