第5章(COM+应用程序463 下载 象,如图15-5所示。 对象 对象环境 对象 对象环境 图15-5创建新的环境 返回到客户的代理确保激活者与对象之间的环境差异在运行期由COM+运行期透明管理。 因此在代码中不必操心这种管理工作 (4)IS和环境 IS使用环境向COM对象提供对ASP内置对象的访问,如图15-6所示, IIs (Inetinfo. exe) (对象)→·· 象环境 图15-6ASP对象与环境的关系 对ASP所有的内置对象,例如 Request和 Response的引用作为属性保存在环境中,该过程 由IS完成。任何与环境关联的COM对象可通过与环境相联系的 ObjectContext访问这些属性 记住, Object Context是一个COM对象,它提供从对象内部进入环境的接口。 这意味着一个COM对象能够访问IS(或任何其他使用环境暴露功能的应用程序)的功能, 即使在IS或对象之间没有“显式”的链接或联系。这就是说,这是一个IS通过使用COM+的 基础结构提供给组件的COM+服务 3.COM+幕后的成员(拦截、环境和COM+类别) 迄今为止,我们已讨论了关于COM+的一些关键内容 从配置的组件创建COM+应用程序 在配置的组件中使用COM+服务。 使用 Component Services Explorer配置COM应用程序和配置的组件 Component Services Explorer内的管理信息将存储在COM+类别中 COM+运行期使用环境和拦截来确保对象的运行期环境正确地使用为组件配置的服务。 所有这些对COM+来讲都是新内容的,不是 Windows2000前的COM的组成部分。假如你 曾经用过MTS,则下面两点需要注意 MTS包现在称为COM+应用程序 ·MTS提供的服务,如分布式事务和安全性,现在称为COM+服务
象,如图1 5 - 5所示。 图15-5 创建新的环境 返回到客户的代理确保激活者与对象之间的环境差异在运行期由 C O M +运行期透明管理。 因此在代码中不必操心这种管理工作。 (4) IIS和环境 I I S使用环境向C O M对象提供对A S P内置对象的访问,如图1 5 - 6所示。 图15-6 ASP对象与环境的关系 对A S P所有的内置对象,例如 R e q u e s t和R e s p o n s e的引用作为属性保存在环境中,该过程 由I I S完成。任何与环境关联的 C O M对象可通过与环境相联系的 O b j e c t C o n t e x t访问这些属性。 记住,O b j e c t C o n t e x t是一个C O M对象,它提供从对象内部进入环境的接口。 这意味着一个 C O M对象能够访问 I I S (或任何其他使用环境暴露功能的应用程序 )的功能, 即使在I I S或对象之间没有“显式”的链接或联系。这就是说,这是一个 I I S通过使用C O M +的 基础结构提供给组件的C O M +服务。 3. COM+幕后的成员(拦截、环境和C O M +类别) 迄今为止,我们已讨论了关于 C O M +的一些关键内容: • 从配置的组件创建C O M +应用程序。 • 在配置的组件中使用C O M +服务。 • 使用Component Services Explorer 配置C O M +应用程序和配置的组件。 • Component Services Explorer内的管理信息将存储在C O M +类别中。 • COM+运行期使用环境和拦截来确保对象的运行期环境正确地使用为组件配置的服务。 所有这些对C O M +来讲都是新内容的,不是 Windows 2000前的C O M的组成部分。假如你 曾经用过M T S,则下面两点需要注意: • MTS包现在称为C O M +应用程序。 • MTS提供的服务,如分布式事务和安全性,现在称为 C O M +服务。 第1 5章 C O M +应用程序计计463 下载 对象 对象 环 境 对象环境 对象环境 Request Response IIS (Inetinfo.exe) 对象 对象环境 环境A 环境B
464A5p3高程 Chinapul coM 下载 15.13组件/对象的生存期和状态 为了使用COM+提供的服务,需要重新考虑我们的编程风格。例如,COM+提供的一个服 务恰好及时的( Just-In-Time,Jn)激活,它延迟使用服务器资源直到真的需要使用这些资源时, 在客户不再使用对象的实例时确保释放它们 1.COM+的激活和释放 JIT激活指的是,直到调用第一个接口方法时,才激活对象的实例,这意味着一个对象的 初始化代码和资源请求将被延迟,直到真正需要它们。也就是说,直到绝对需要时,才消耗 服务器的资源,即消耗资源是客户调用对象方法的直接结果。这是很好的办法,因为这意味 着一个客户能在应用程序生存期的早期创建一个组件,在较晚时使用,而不需担心过早地消 耗资源。 基于相同的原则,COM+尽可能使不用的对象失效,尽可能早(AS-Soon-As- Possible, ASAP)失效使COM+能释放对象占用的内存和消耗的资源,同时允许客户确信仍然引用一个 真实的对象,而不必了解此对象是否已被取消。假如能缓冲对象,可使对象失效( deactive)而 不是取消( destroy)它。 但是一个客户怎样才能在应用程序生存期早期创建一个组件的实例,并仍然支持JT激活 和ASAP失效?答案是我们前面看到的拦截机制。当一个客户请求一个对象实例时,COM+拦 截这个代码(并且假设JT激活可用),它不创建对象实例,而是提供给客户一个虚拟的代理, 使客户相信引用的是一个真实的对象。 然后,当客户调用对象的方法时,代理拦截该调用并由COM+创建一个真实的对象实例 这个实例完成必要的处理过程。当方法调用完成后,对象失效,但是代理继续“欺骗”客户 如图15-7所示。 代理 图15-7客户调用对象时代理的拦截过程 正如我们已经解释过的,JT激活的含义是非常清楚的,ASP页面(或其他客户)首次调用 对象的方法时,激活对象。ASAP失效相对来说就不是很清楚了。当方法调用完毕后是否立即 使该对象失效?作为一个好的可扩展的COM+组件,答案是肯定的。这听起来会让人感到奇 怪,因为这样做,服务器必须重新创建对象,这会导致一定程度总开销的浪费。但是,需要 记住的是,任何应用需要考虑的一个重要因素是服务器宝贵的资源(例如内存等),快速使用, 快速释放以便其他客户能够使用这些资源。COM+保证能够做到这一点的唯一方法就是,使 对象失效,如果不进行缓冲就取消对象。 COM+能够根据需要有效地创建一个组件的实例,不断创建和释放对象的事实依赖于它 们的配置而不致造成过高的系统开销 (1)COM+应用程序中缓存类对象和DLL 为有效创建对象,COM+应用程序缓存COM服务器DLL和类对象 类对象是一种创建COM+对象的机制。类对象是一个COM对象,支持COM接口
15.1.3 组件/对象的生存期和状态 为了使用C O M +提供的服务,需要重新考虑我们的编程风格。例如, C O M +提供的一个服 务恰好及时的( J u s t - I n - Ti m e,J I T )激活,它延迟使用服务器资源直到真的需要使用这些资源时, 在客户不再使用对象的实例时确保释放它们。 1. COM+的激活和释放 J I T激活指的是,直到调用第一个接口方法时,才激活对象的实例,这意味着一个对象的 初始化代码和资源请求将被延迟,直到真正需要它们。也就是说,直到绝对需要时,才消耗 服务器的资源,即消耗资源是客户调用对象方法的直接结果。这是很好的办法,因为这意味 着一个客户能在应用程序生存期的早期创建一个组件,在较晚时使用,而不需担心过早地消 耗资源。 基于相同的原则, C O M +尽可能使不用的对象失效,尽可能早 ( A S - S o o n - A s - P o s s i b l e, A S A P )失效使C O M +能释放对象占用的内存和消耗的资源,同时允许客户确信仍然引用一个 真实的对象,而不必了解此对象是否已被取消。假如能缓冲对象,可使对象失效 ( d e a c t i v e )而 不是取消( d e s t r o y )它。 但是一个客户怎样才能在应用程序生存期早期创建一个组件的实例,并仍然支持 J I T激活 和A S A P失效?答案是我们前面看到的拦截机制。当一个客户请求一个对象实例时, C O M +拦 截这个代码 (并且假设J I T激活可用 ),它不创建对象实例,而是提供给客户一个虚拟的代理, 使客户相信引用的是一个真实的对象。 然后,当客户调用对象的方法时,代理拦截该调用并由 C O M +创建一个真实的对象实例, 这个实例完成必要的处理过程。当方法调用完成后,对象失效,但是代理继续“欺骗”客户。 如图1 5 - 7所示。 图15-7 客户调用对象时代理的拦截过程 正如我们已经解释过的, J I T激活的含义是非常清楚的, A S P页面(或其他客户 )首次调用 对象的方法时,激活对象。 A S A P失效相对来说就不是很清楚了。当方法调用完毕后是否立即 使该对象失效?作为一个好的可扩展的 C O M +组件,答案是肯定的。这听起来会让人感到奇 怪,因为这样做,服务器必须重新创建对象,这会导致一定程度总开销的浪费。但是,需要 记住的是,任何应用需要考虑的一个重要因素是服务器宝贵的资源 (例如内存等),快速使用, 快速释放以便其他客户能够使用这些资源。 C O M +保证能够做到这一点的唯一方法就是,使 对象失效,如果不进行缓冲就取消对象。 C O M +能够根据需要有效地创建一个组件的实例,不断创建和释放对象的事实依赖于它 们的配置而不致造成过高的系统开销。 (1) COM+应用程序中缓存类对象和D L L 为有效创建对象,C O M +应用程序缓存C O M服务器D L L和类对象。 类对象是一种创建 C O M +对象的机制。类对象是一个 C O M对象,支持C O M接口 464计计ASP 3 高级编程 下载 客户 代理 真实对象
第15章(OM+应用程序465 下载 IClassFactory。该接口有一个方法 Createlnstance,创建并返回一个COM+对象。每种 类型的COM+组件有一个类对象。VB会自动创建这些类对象。 当客户创建一个包含在COM+应用程序中的组件实例时,将会发生 如果内存中没有的话,包含组件的DLL将被调入 创建组件类型的类对象 ·COM+请求类对象创建新的COM+对象实例 当COM+应用程序载入一个COM服务器(DLL)去创建某类型的COM+对象时,在COM+应 用程序关闭前,DLL一直保存在内存中。假國w性 如COM+不能完成缓存工作,当最后一个由 a securily Identy Activation Queuing Advarced 来自于该DLL的类对象创建的对象取消时 Leave running when d 卸载该DLL。一个对象的重复创建和取消会 引起一个DLL重复载入和卸载,可能会引起 硬盘不停地运转。COM+允许定义空闲时间 段,经过这个空闲段后COM+应用程序和所 Lbie deletion 有载入的DLL才释放(见图15-8) 当COM+应用程序创建一个类对象时 Launch n debugger 将保持对类对象的一个引用直到其卸载。这 意味着第一次创建对象以后仅需要执行下面 个步骤: 厂Enae3 GB supoort COM+请求类对象创建一个新的COM+ 对象的实例 这种缓存能够改进对象创建的性能,这 图15-8设定空闲时间段 也意味着对于创建非缓冲对象,JT激活的开 销不致于过高 (2)JT激活不需要改变COM 需要清楚的是COM的基本规则没有为了对服务的支持而改变,如果没有外部引用,将取 消COM+对象的实例。然而,这会改变客户编程方式,使我们的组件成为无状态组件。 无状态”编程范型 个COM+组件,像任何COM组件一样,能够在客户交互(方法调用)之间在内部存储信 息。这一工作我们称之为保持状态,称这种组件为状态化组件。现在,假如我们标识该组件 使用JIT激活,并为使对象失效增加必要的调用,这个模型将发生较大的改变 由对象存储和管理的信息,当客户调用时,对于后续的方法调用将不再可用。通过使组 件使用JIT激活,告诉COM+在方法调用之间可使对象失效,这其中的含义就是下一个方法调 用将可能潜在地由不同的对象实例处理。 这里使用了“潜在地”一词,是因为如果对象被缓冲,那么使对象失效并放回 缓冲池,则从缓冲池中取出供下一个调用使用的对象,可能会与原来的不相同 3.对于JT组件忘掉面向对象编程 这个问题需要一些时间来理解,读者可能读过相关的许多文章,都在一定程度不正确地
I C l a s s F a c t o r y。该接口有一个方法C r e a t e I n s t a n c e,创建并返回一个C O M +对象。每种 类型的C O M +组件有一个类对象。V B会自动创建这些类对象。 当客户创建一个包含在C O M +应用程序中的组件实例时,将会发生: • 如果内存中没有的话,包含组件的 D L L将被调入。 • 创建组件类型的类对象。 • COM+请求类对象创建新的C O M +对象实例。 当C O M +应用程序载入一个C O M服务器( D L L )去创建某类型的C O M +对象时,在C O M +应 用程序关闭前, D L L一直保存在内存中。假 如C O M +不能完成缓存工作,当最后一个由 来自于该 D L L的类对象创建的对象取消时, 卸载该D L L。一个对象的重复创建和取消会 引起一个D L L重复载入和卸载,可能会引起 硬盘不停地运转。 C O M +允许定义空闲时间 段,经过这个空闲段后 C O M +应用程序和所 有载入的D L L才释放(见图1 5 - 8 )。 当C O M +应用程序创建一个类对象时, 将保持对类对象的一个引用直到其卸载。这 意味着第一次创建对象以后仅需要执行下面 一个步骤: • C O M +请求类对象创建一个新的 C O M + 对象的实例。 这种缓存能够改进对象创建的性能,这 也意味着对于创建非缓冲对象, J I T激活的开 销不致于过高。 (2) JIT激活不需要改变C O M 需要清楚的是C O M的基本规则没有为了对服务的支持而改变,如果没有外部引用,将取 消C O M +对象的实例。然而,这会改变客户编程方式,使我们的组件成为无状态组件。 2 .“无状态”编程范型 一个C O M +组件,像任何 C O M组件一样,能够在客户交互 (方法调用)之间在内部存储信 息。这一工作我们称之为保持状态,称这种组件为状态化组件。现在,假如我们标识该组件 为使用J I T激活,并为使对象失效增加必要的调用,这个模型将发生较大的改变。 由对象存储和管理的信息,当客户调用时,对于后续的方法调用将不再可用。通过使组 件使用J I T激活,告诉C O M +在方法调用之间可使对象失效,这其中的含义就是下一个方法调 用将可能潜在地由不同的对象实例处理。 这里使用了“潜在地”一词,是因为如果对象被缓冲,那么使对象失效并放回 缓冲池,则从缓冲池中取出供下一个调用使用的对象,可能会与原来的不相同。 3. 对于J I T组件忘掉面向对象编程 这个问题需要一些时间来理解,读者可能读过相关的许多文章,都在一定程度不正确地 第1 5章 C O M +应用程序计计465 下载 图15-8 设定空闲时间段
466Asp;海编程 Chinapub coM 下载 定义无状态( stateless)编程模型这个概念,简单而言,无状态编程模型对于开发人员有两方面 含义 个客户不能依靠同一个对象实例处理每一个方法的调用(对于同一个对象)。因为无法 确定方法调用之间的一个对象的状态。 一个对象不能依赖于同一个客户调用其提供的每一个方法,如果对象被缓冲,许多客户 将重复使用同一对象 这两点实际上十分简单,但对创建组件和客户的方式有很大影响,面向对象编程(OOP)对 JⅠT组件来说,不能正常工作。面向对象技术的基础是对象有同一性、行为以及一段时间的状 态。恰好是最后一点不满足要求,因此如下代码不能正常工作: Dim objPerson As Richard Set objPerson New Richard bjPerson, Name ="Richard bjPerson DOB 1972 objPerson. Title ="Developer objPerson. UpdateDetails 这是一个非常典型的OOP,我们先设置对象的属性,然后要求对象通过一些存储媒介保 存变化情况。你能看出问题吗?是的,每次属性的存取和方法的调用将引起COM+的运行期 创建或取消COM对象,从代码中看不出这个过程,因为创建和取消发生在COM+运行期内, 在我们调用 Update Details方法时使用的对象实例,可能不是设置属性时使用的那个。对象存 储什么内容呢?存储的可能是在组件 Class Initialize例程中初始化的缺省值。 作为传统的OOP不会使用COM+JT配置的组件。我们必须回过头来考虑其他的使用组件 和客户的方式。不使用JIT的组件可使用OOP技术进行编程,但对于JIT组件必须把代码改变 为“面向过程”。简单说,这意味着客户要把处理一个请求所需的所有状态传给对象(在每次 方法调用中) (1)面向过程的对象 对于上面的代码,我们重写为 Dim ob]Person As Richard Set objPerson New Richard bi Person. UpdateDetails Richard,, 1972, Developer 我们现已知道依赖于方法调用间的状态不是一个可行办法,所以将所有需要的状态作为 参数传给完成 Update Details的过程 在ASP中,对于无状态组件有两个地方需要注意: ·避免存储任何信息在组件的局部变量中 避免页面-页面之间保持组件的引用 最简单的避免客户将信息存储在对象内的方法是,只提供组件的基于方法的接口,组件 应没有公共属性,所有与组件的交互都通过方法调用完成,所有的组件所需的工作信息,均 作为参数传递给方法调用 (2)对象状态可重复使用
定义无状态( s t a t e l e s s )编程模型这个概念,简单而言,无状态编程模型对于开发人员有两方面 含义: • 一个客户不能依靠同一个对象实例处理每一个方法的调用 (对于同一个对象 )。因为无法 确定方法调用之间的一个对象的状态。 • 一个对象不能依赖于同一个客户调用其提供的每一个方法,如果对象被缓冲,许多客户 将重复使用同一对象。 这两点实际上十分简单,但对创建组件和客户的方式有很大影响,面向对象编程 ( O O P )对 J I T组件来说,不能正常工作。面向对象技术的基础是对象有同一性、行为以及一段时间的状 态。恰好是最后一点不满足要求,因此如下代码不能正常工作: 这是一个非常典型的 O O P,我们先设置对象的属性,然后要求对象通过一些存储媒介保 存变化情况。你能看出问题吗?是的,每次属性的存取和方法的调用将引起 C O M +的运行期 创建或取消 C O M对象,从代码中看不出这个过程,因为创建和取消发生在 C O M +运行期内, 在我们调用U p d a t e D e t a i l s方法时使用的对象实例,可能不是设置属性时使用的那个。对象存 储什么内容呢?存储的可能是在组件 C l a s s _ I n i t i a l i z e例程中初始化的缺省值。 作为传统的O O P不会使用COM+ JIT配置的组件。我们必须回过头来考虑其他的使用组件 和客户的方式。不使用 J I T的组件可使用 O O P技术进行编程,但对于 J I T组件必须把代码改变 为“面向过程”。简单说,这意味着客户要把处理一个请求所需的所有状态传给对象 (在每次 方法调用中)。 (1) 面向过程的对象 对于上面的代码,我们重写为: 我们现已知道依赖于方法调用间的状态不是一个可行办法,所以将所有需要的状态作为 参数传给完成U p d a t e D e t a i l s的过程。 在A S P中,对于无状态组件有两个地方需要注意: • 避免存储任何信息在组件的局部变量中。 • 避免页面-页面之间保持组件的引用 最简单的避免客户将信息存储在对象内的方法是,只提供组件的基于方法的接口,组件 应没有公共属性,所有与组件的交互都通过方法调用完成,所有的组件所需的工作信息,均 作为参数传递给方法调用。 (2) 对象状态可重复使用 466计计ASP 3 高级编程 下载
第5章(COM+应用程序467 下载 我们知道包含相关信息的对象状态是由对象保存的,通常大多数对象保存的状态与某 特定客户有关。例如,在一个电子商务的应用程序中,如果用一个COM对象表示某一特定用 户采购的内容,那么该对象将唯一地对应这个用户,该对象的状态对于他人毫无用处,所以 不能重复利用。 为什么要重复利用对象的状态?假设一个简单的对象可使一系列值有效,一些应用程序 创建并使用此组件的实例。现在,假设每一实例从数据库中装入这些值,创建这些实例将花 费很长的时间,如果有许多人用某一组件,将需要大量的数据库输入输出,给应用程序带来 的开销很大 通过缓冲这样一个组件,可以重复利用由组件实例创建的值列表,而无需每次重复装入 因为对象保存的状态并不特定对应于某指定的客户,如上述的采购示例,所以可以实现上述 方法。因此,若VB支持对象缓冲,需要记住的是状态可以重复使用。JT是一个可加快对象 初始化的好方法。一个具有代表性的例子就是 OLE DB,它能够缓冲数据库的连接,建立数据 库的连接需要长时间,由于一般的启动过程和身份验证相当慢。所以,通过缓冲这些连接 连接开销大这一问题仅在第一次启动对象时出现,而后的用户可重复利用,当然这里假设安 全和连接字符串是兼容的 3)在可扩展系统中保持对象的时间应最小化 前面提到的购物示例中,我们有一个代表购物的对象,但其可扩展性太差。要理解其原 因,假设系统工作于一个大型的网站如 amazon. com,支持成千上万个同时访问的用户,每 用户有一相应的COM对象表示他们的采购行为,存储在 Session对象中。现在,假如我们知道 组件需要10KB内存来执行和维持采购行为,估计在高峰时有5000个活动的 Session,需要5000 ×10KB(大约50000KB或49MB来维持这一个组件。即使内存比较便宜,对于这个问题也要引 起足够的重视。 选择用于创建组件的工具,有助于我们实现其他一些无状态组件的关键设计。通过 Visual Basic创造的组件的类型应该仅仅存在于一个应用程序的页面范围之内,通过VB创造的组件不 应存储在 Session中或者应用程序级的变量中,任何这样做的企图将导致web服务器性能严重 地下降,可以配置ASP从而产生一个错误信息,防止这种情况的发生。通过这种方式,在创 建一个Web的应用程序时,ASP自身促进无状态组件的使用。这取决于VB组件可以支持的线 程模型。 152单元和线程模型 作为 VB ASP的开发人员,不需担心单元和线程模型,但应该意识到它们是COM+的基本 组成部分。理解它们之前首先需要理解线程 152.1线程 简单地说,可把线程看作“轻量进程”,不像通常的进程,线程并不是实际的系统资源, 在 Windows下启动一个运用程序,如 Notepad,操作系统将创建应用程序在其中执行的一个进 程,这个进程将有其自己的地址空间,因而独立于其他进程,这样即使这个应用程序出现严 重错误,将保持其他应用程序的完整性。 在一个进程中总是至少有一个线程,称为主线程。一个线程是操作分配CPU时间最基本
我们知道包含相关信息的对象状态是由对象保存的,通常大多数对象保存的状态与某一 特定客户有关。例如,在一个电子商务的应用程序中,如果用一个 C O M对象表示某一特定用 户采购的内容,那么该对象将唯一地对应这个用户,该对象的状态对于他人毫无用处,所以 不能重复利用。 为什么要重复利用对象的状态?假设一个简单的对象可使一系列值有效,一些应用程序 创建并使用此组件的实例。现在,假设每一实例从数据库中装入这些值,创建这些实例将花 费很长的时间,如果有许多人用某一组件,将需要大量的数据库输入输出,给应用程序带来 的开销很大。 通过缓冲这样一个组件,可以重复利用由组件实例创建的值列表,而无需每次重复装入。 因为对象保存的状态并不特定对应于某指定的客户,如上述的采购示例,所以可以实现上述 方法。因此,若 V B支持对象缓冲,需要记住的是状态可以重复使用。 J I T是一个可加快对象 初始化的好方法。一个具有代表性的例子就是 OLE DB,它能够缓冲数据库的连接,建立数据 库的连接需要长时间,由于一般的启动过程和身份验证相当慢。所以,通过缓冲这些连接, 连接开销大这一问题仅在第一次启动对象时出现,而后的用户可重复利用,当然这里假设安 全和连接字符串是兼容的。 (3) 在可扩展系统中保持对象的时间应最小化 前面提到的购物示例中,我们有一个代表购物的对象,但其可扩展性太差。要理解其原 因,假设系统工作于一个大型的网站如 a m a z o n . c o m,支持成千上万个同时访问的用户,每一 用户有一相应的C O M对象表示他们的采购行为,存储在 S e s s i o n对象中。现在,假如我们知道 组件需要1 0 K B内存来执行和维持采购行为,估计在高峰时有 5 0 0 0个活动的S e s s i o n,需要5 0 0 0 ×1 0 K B (大约5 0 0 0 0 K B或4 9 M B )来维持这一个组件。即使内存比较便宜,对于这个问题也要引 起足够的重视。 选择用于创建组件的工具,有助于我们实现其他一些无状态组件的关键设计。通过 Vi s u a l B a s i c创造的组件的类型应该仅仅存在于一个应用程序的页面范围之内,通过 V B创造的组件不 应存储在S e s s i o n中或者应用程序级的变量中,任何这样做的企图将导致 We b服务器性能严重 地下降,可以配置 A S P从而产生一个错误信息,防止这种情况的发生。通过这种方式,在创 建一个We b的应用程序时, A S P自身促进无状态组件的使用。这取决于 V B组件可以支持的线 程模型。 15.2 单元和线程模型 作为VB ASP的开发人员,不需担心单元和线程模型,但应该意识到它们是 C O M +的基本 组成部分。理解它们之前首先需要理解线程。 15.2.1 线程 简单地说,可把线程看作“轻量进程”,不像通常的进程,线程并不是实际的系统资源, 在Wi n d o w s下启动一个运用程序,如 N o t e p a d,操作系统将创建应用程序在其中执行的一个进 程,这个进程将有其自己的地址空间,因而独立于其他进程,这样即使这个应用程序出现严 重错误,将保持其他应用程序的完整性。 在一个进程中总是至少有一个线程,称为主线程。一个线程是操作分配 C P U时间最基本 第1 5章 C O M +应用程序计计467 下载