关于COM+组件边界和同步的研究与分析-05.doc

关于COM+组件边界和同步的研究与分析-05.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于COM组件边界和同步的研究与分析-05

第五讲 关于COM+组件边界和同步的研究与分析 本讲围绕COM+对象的三种边界环境:进程、套间和上下文,分析了实现跨越这些边界调用的机制,论述了COM+在不同环境中实现并行保护的策略。 引言 COM+可以看作是COM、DCOM和MTS的集成和发展,它把COM组件提升到应用层而不再是底层的软件结构,把底层细节留给操作系统,使COM+与操作系统的结合更加紧密。COM+的底层结构仍然是以COM为基础,但在应用方式上更多地继承了MTS的处理机制,包括事务机制、安全模型、对象池等,同时新增了一些服务,比如负载平衡、事件模型、队列组件等,使得COM+成为适合构建多层分布式的组件技术。 COM+程序设计方法的核心是基于对属性值进行声明请求的模型。COM+运行时系统将根据组件设置的属性来实例化对象,并把对象装入相匹配的执行环境中运行。我们可以把执行环境看作是一组具有相容属性的对象运行时所处的环境,它相当于给运行其中的对象构筑一道边界。每一个COM+对象在外围具有三道这样的边界:进程、套间(apartment)和上下文(context),在它的整个生存期它只能生存于某一进程、某一套间和某一上下文中,也就是说一个COM+对象不能越过自己的边界进入另一执行环境中。当进行跨边界(包括跨进程、同一进程中跨套间和同一套间中跨上下文)调用时,调用者和被调用的对象之间必须加入代理机制,只有处于同一上下文中的对象才能进行直接调用。 虽然多线程技术可以显著地提高应用程序的性能,但隶属于同一进程的线程由于可以对共享地址空间内的数据进行并行访问,这将很容易产生竞争情况。竞争情况可以通过对共享数据实施串行化访问,即进行同步处理来加以避免。在COM+中有两种方法可以实现对对象的串行化访问;一种方法是由系统自动实现对COM+对象成员函数的串行化访问,它保证下一次方法调用在上次调用完成后才可进行;另一种方法是使用事件、互斥变量、监界区和信号量等机制来保护共享数据。针对处于不同边界中的对象和各种跨边界调用,COM+采用不同的策略来进行同步处理。 跨进程调用与同步 由于不同的进程使用不同的地址空间,所以客户不能直接调用进程外组件(包括本地进程外组件和远程组件)。对于跨进程调用,中间必须经过代理/存根(proxy/stub)机制和使用列集/散集(marshaling/unmarshaling)手段。 图1 跨进程调用 如图1所示,代理对象在客户进程中扮演组件对象,它具有与组件对象一样的接口,但不提供方法实现。客户实际调用的是代理对象,代理对象负责把调用参数及其它一些调用信息组装成一个数据包,并通过RPC/QC通道列集给组件进程中的存根代码,存根代码负责把包散集到组件进程的地址空间中,并进行实际的接口功能调用,函数的返回值和输出参数按相反的顺序传回给客户。 对于进程外组件对象,客户调用必须跨越进程边界,因此调用始终是间接进行的,中间必须经过调度,而这种调度自动实现了对调用的串行化访问,对象成员函数可以不处理同步。 套间与同步 为了适应多线程的需要,COM+为此提供了一种称为套间的结构。我们可以把套间想象成一个盒子,里面装着线程和组件对象,每一个要使用COM的线程和每一个这些线程创建的组件对象都必须属于某一个套间。一个套间只能属于某一个进程,且不能跨越进程边界。 目前COM+支持三种套间,它们是单线程套间(STA:single-threaded apartment)、多线程套间(MTA:multithreaded apartment)和中性套间(TNA:thread-neutral apartment)。一个进程可以包含一个MTA、一个TNA和多个STA。 一个STA中只能容纳一个线程,但COM对于里面包含的组件对象个数并未限制,STA中的对象只能由该套间中唯一的线程来调用。当线程调用CoInitialize()或CoInitializeEx(NULL,COINIT_APARTMENTHREADED)函数时,COM将构建一个新的STA,并把这个线程赋予新创建的STA。同时自动地调用CreateWindowEx来为STA创建一个隐藏窗口,客户对套间中对象的调用被当作一个发给此隐藏窗口的消息,套间线程主函数的消息循环负责接收消息并分发消息,于是隐藏窗口会接收到消息,然后它的窗口过程调用对象的相应接口成员函数。通过这种消息分发机制自动实现了对STA中对象调用的同步,所以运行在STA中的组件对象不必处理同步,但对象仍需保护全局变量,因为一个组件可以在多个套间中创建实例,它们有可能被同时访问。 MTA中的线程没有个数的限制,也没限制所包含的对象个数,任何线程都可以通过调用CoInitializeEx(NULL,COINIT_MULTITHREADED)函数来进入MTA。MTA没有

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档