468A5p3高装程 Chinapub.com 下载 实体,因此,如果我们有10个进程,每一个进程有一个线程做一些密集性的工作,操作系统 将分给每个线程所有可获取的CPU时间的10%,这个时间的百分比要考虑到实际花费在管理 线程的转换上的时间,因而,给予执行代码的进程的全部时间可能略少,可能是95%左右 个进程能容纳多个并发运行的线程,每个线程分享提供给这一进程的系统资源,如虚 拟地址空间,这意味着这些线程可以执行应用程序的代码、访问共用内存和其他一些资源(比 如文件),而不用消耗太多的额外资源 因为相对于进程而言,线程是“廉价”的,真正的可扩展系统总是使用“每个客户一个 线程”,而不是“每个客户一个进程”,因为节约资源十分重要。依赖于系统的划分,对于 “每个客户一个线程”的不同的应用程序,系统也可很好地使用多进程。COM+使用了这种方 式,即每个COM+应用程序在自己的进程中运行。 COM+也可缓冲线程,COM+做这项工作十分有效,当线程缓冲池耗尽时,组件将开始以 种环形的方式共享线程,因而如果缓冲池的大小为5,则第6个创建的组件将共享第一个线 程,第7个共享第2个线程,依次类推。使用COM+的好处还在于无需在代码中编写线程管理 方面的代码,COM+会自动处理线程,不能创建和管理线程的语言可充分利用COM+的这个功 1522单 现在我们已经理解了什么是线程,可以进一步研究单元( apartment)的角色, 个单元是一个同步机制和COM对象的逻辑容器( container),从而提供一条线 程的执行,能在一个进程之中调用一个对象的方法 编写一个COM组件时,需要考虑线程如何访问组件的实例,如果不止一条线程同时访问 相同的对象,需要在更新数据的方法中执行一些类型的同步操作,否则会出现一些潜在的问 题 例如,同时使用相同的全局变量的多线程有可能在同一时间企图操纵同一数据,这会导 致出现不一致的结果 因为COM的设计目的是让组件开发人员集中精力编写组件,它给出相应的选项去选择组 件中需要的同步操作。如果不担心方法中的线程同步问题(也就说不止一个线程同时执行相同 的代码),可以标记组件以单线程单元( Single-Threaded Apartment,STA)方式执行 不像COM+服务,使用开发工具而不是C Component ervices Explorer"创建组件。其机理是非常十分简单 环境A 的,仅仅编程人员知道这个组件是否是线程安全的 环境B 因而除了编程人员外其他人员无法定义其属性 在COM+中,在许多方面没有充分利用单元。 现在环境是对象的主要容器,但单元仍然是非常重 要的,我们可以把单元简单地认为是环境的容器, 对象 如图15-9所示 单元可被进一步分成一个或更多的环境,在单 元中环境的数量依赖于在其中创建的对象数量和这 图15-9单元和环境的关系 些对象的环境要求。缺省时每个单元都有一个缺省的环境,缺省的环境用来包含不配置的传
实体,因此,如果我们有 1 0个进程,每一个进程有一个线程做一些密集性的工作,操作系统 将分给每个线程所有可获取的 C P U时间的1 0%,这个时间的百分比要考虑到实际花费在管理 线程的转换上的时间,因而,给予执行代码的进程的全部时间可能略少,可能是 9 . 5%左右。 一个进程能容纳多个并发运行的线程,每个线程分享提供给这一进程的系统资源,如虚 拟地址空间,这意味着这些线程可以执行应用程序的代码、访问共用内存和其他一些资源 (比 如文件),而不用消耗太多的额外资源。 因为相对于进程而言,线程是“廉价”的,真正的可扩展系统总是使用“每个客户一个 线程”,而不是“每个客户一个进程”,因为节约资源十分重要。依赖于系统的划分,对于 “每个客户一个线程”的不同的应用程序,系统也可很好地使用多进程。 C O M +使用了这种方 式,即每个C O M +应用程序在自己的进程中运行。 C O M +也可缓冲线程,C O M +做这项工作十分有效,当线程缓冲池耗尽时,组件将开始以 一种环形的方式共享线程,因而如果缓冲池的大小为 5,则第6个创建的组件将共享第一个线 程,第7个共享第2个线程,依次类推。使用 C O M +的好处还在于无需在代码中编写线程管理 方面的代码,C O M +会自动处理线程,不能创建和管理线程的语言可充分利用 C O M +的这个功 能。 15.2.2 单元 现在我们已经理解了什么是线程,可以进一步研究单元 ( a p a r t m e n t )的角色, 一个单元是一个同步机制和 C O M对象的逻辑容器 ( c o n t a i n e r ),从而提供一条线 程的执行,能在一个进程之中调用一个对象的方法。 编写一个C O M组件时,需要考虑线程如何访问组件的实例,如果不止一条线程同时访问 相同的对象,需要在更新数据的方法中执行一些类型的同步操作,否则会出现一些潜在的问 题。 例如,同时使用相同的全局变量的多线程有可能在同一时间企图操纵同一数据,这会导 致出现不一致的结果。 因为C O M的设计目的是让组件开发人员集中精力编写组件,它给出相应的选项去选择组 件中需要的同步操作。如果不担心方法中的线程同步问题 (也就说不止一个线程同时执行相同 的代码),可以标记组件以单线程单元 (Single-Threaded Apartment,S TA )方式执行。 不像C O M +服务,使用开发工具而不是C o m p o n e n t Services Explorer创建组件。其机理是非常十分简单 的,仅仅编程人员知道这个组件是否是线程安全的, 因而除了编程人员外其他人员无法定义其属性。 在C O M +中,在许多方面没有充分利用单元。 现在环境是对象的主要容器,但单元仍然是非常重 要的,我们可以把单元简单地认为是环境的容器, 如图1 5 - 9所示。 单元可被进一步分成一个或更多的环境,在单 元中环境的数量依赖于在其中创建的对象数量和这 些对象的环境要求。缺省时每个单元都有一个缺省的环境,缺省的环境用来包含不配置的传 468计计ASP 3 高级编程 下载 图15-9 单元和环境的关系 单元 环境A 环境B 对象 对象
第5章(COM+应用程序469 下载 统组件,这些组件不能使用COM+提供的服务。举例来说,这些组件不能通过组件服务装配 到COM+应用程序中 个进程能包含多个单元,单元能为其中的对象提供不同的相关线程服务。根据单元 类型,每个单元与一个或多个线程相关联。COM+定义三种单元的类型 单线程单元( Single- threaded Apartment) 多线程单元( Multi-threaded Apartment) 中立线程单元( Neutra- threaded Apartment) 1.单线程单元(STA) 个单线程单元(STA)或单元线程( Apartment- Threaded)模型,在每个单元内基本上仅允 许一个单线程运行,该线程在其生存期中与单元相联系。一个进程可包括任意数目的STA STA是为需要调用同步化和/或具有线程类似性 affinity)的组件而设计的,前者意味着不 能并发调用对象的方法,必须一个完成后再调用另外的一个方法,后者确保在生存期中总由 同一线程调用一个对象的每一个方法 对于COM+,如果一个组件没有线程类似性,但是要求调用同步化,则可通过使用中立 线程模型,使性能有所提高。COM+提供调用同步化,而不必约束组件访问指定的线程 目前,STA是VB唯一支持的单元类型 2.多线程单元(MTA 相比较而言,MTA允许多个线程在同一个单元内运行,因此允许多个线程调用同一个对 象实例的方法。不同于STA,每一个进程只能有一个MTA,如图15-10所示。 进程空间 MTA 图15-10线程、MTA与进程的关系 在MTA中运行的组件应考虑到它们能被多线程调用。每次调用可通过不同的线程进行, 而且可能出现并发调用 3.中立线程单元(NTA) STA和MTA允许对象可在适合于线程特性的执行环境中运行,但是如果对象的请求是调 用同步化的且不具有线程的类似性,则STA效率较低。这种情况下,对象不关心是什么线程 调用它,假设仅有一个线程调用它。如果我们这样实现,就节省一个不必要的线程转换(如果 调用者在一个不同的线程上)。事实上,调用者的线程总是可以调用对象的方法,只要保证没 有其他的线程已经调用该方法。这就是新型的中立线程单元在COM中所起的作用。 NTA确保一个COM对象的方法调用串行化,但是任何线程都可产生这些调用。这有两个 主要的优点 ·不要求跨线程的调度。 在NTA中的几个对象能同时激活
统组件,这些组件不能使用 C O M +提供的服务。举例来说,这些组件不能通过组件服务装配 到C O M +应用程序中。 一个进程能包含多个单元,单元能为其中的对象提供不同的相关线程服务。根据单元的 类型,每个单元与一个或多个线程相关联。 C O M +定义三种单元的类型。 • 单线程单元(Single-threaded Apartment)。 • 多线程单元(Multi-threaded Apartment)。 • 中立线程单元(Neutral-threaded Apartment)。 1. 单线程单元( S TA ) 一个单线程单元 ( S TA )或单元线程( A p a r t m e n t - T h r e a d e d )模型,在每个单元内基本上仅允 许一个单线程运行,该线程在其生存期中与单元相联系。一个进程可包括任意数目的 S TA。 S TA是为需要调用同步化和/或具有线程类似性 ( a ff i n i t y )的组件而设计的,前者意味着不 能并发调用对象的方法,必须一个完成后再调用另外的一个方法,后者确保在生存期中总由 同一线程调用一个对象的每一个方法。 对于C O M +,如果一个组件没有线程类似性,但是要求调用同步化,则可通过使用中立 线程模型,使性能有所提高。 C O M +提供调用同步化,而不必约束组件访问指定的线程。 目前,S TA是V B唯一支持的单元类型。 2. 多线程单元( M TA ) 相比较而言,M TA允许多个线程在同一个单元内运行,因此允许多个线程调用同一个对 象实例的方法。不同于S TA,每一个进程只能有一个M TA,如图1 5 - 1 0所示。 图15-10 线程、M TA与进程的关系 在M TA中运行的组件应考虑到它们能被多线程调用。每次调用可通过不同的线程进行, 而且可能出现并发调用。 3. 中立线程单元( N TA ) S TA和M TA允许对象可在适合于线程特性的执行环境中运行,但是如果对象的请求是调 用同步化的且不具有线程的类似性,则 S TA效率较低。这种情况下,对象不关心是什么线程 调用它,假设仅有一个线程调用它。如果我们这样实现,就节省一个不必要的线程转换 (如果 调用者在一个不同的线程上 )。事实上,调用者的线程总是可以调用对象的方法,只要保证没 有其他的线程已经调用该方法。这就是新型的中立线程单元在 C O M中所起的作用。 N TA确保一个C O M对象的方法调用串行化,但是任何线程都可产生这些调用。这有两个 主要的优点: • 不要求跨线程的调度。 • 在N TA中的几个对象能同时激活。 第1 5章 C O M +应用程序计计469 下载 进程空间 STA STA MTA
470Ap2高装程 Chinapub.com 下载 结果是一种更快速的应用程序 1523线程模型的属性 COM/COM+组件通过指定线程模型来表示所采用的线程的职责。这个线程模型向COM 运行期表明组件所涉及的线程情况,同时直接影响组件在其中创建的单元的类型。 在COM+中有五种线程模型: 单线程( Single- threaded):组件的实例总是在主STA中创建,主STA是在一个进程中产生 的第一个的STA。 单元线程( Apartment- threaded):组件的实例必须在STA中创建。 ·自由线程( Free-threaded):组件的实例必须在MTA中创建。 双线程(Both- threaded):组件的实例可在STA或MTA中创建,由COM+根据激活者的单 元类型决定 中立线程( Neutra- threaded):组件的实例只能在NTA中创建 1.线程模型 因而,COM有一系列的线程模型,组件开发人员可决定为了处理从一个或多个线程访问 组件而需担负的责任,组件负担的任务越重,就可能进一步优化组件的使用,提高使用它们 的应用程序的性能和可扩展性 VB线程模型不是真正的问题,在VB60中有两种选择: Single:对所有组件实例的所有访问通过单一线程串行进行 Apartment:对一个组件实例的所有访问通过单一线程串行进行。但不同的组件实例存 活在不同的线程中,使用的线程在组件的生存期中是静态的 单元线程模型对于大部分ASP组件类型的开发是适宜的。但是,如果在 ASP Session或 Application对象中存储组件(对象)的实例,从性能角度考虑,应使用自由的或双线程模型。这 意味着不得不使用ⅤC++,这些线程模型不适合VB,因为ⅤB不能用于编写多线程应用程序, 并对编程人员隐藏了线程概念。 (1)单线程模型 单线程模型有其不足之处,它起源于 Windows3.1下早期的COM,除非你正使用的环境指 明是使用单线程模型,否则没有必要考虑使用它。IS明确建议不使用单线程模型 假如在多线程应用程序(如IS)中使用了单线程组件,那么可能正在使此应用程序的较大 部分单线程化。使用单线程组件意味着,对每一个组件实例的每个方法调用都不得不从同 个线程进行。设想一下,假如有50个用户访问一些ASP网页,这些网页使用了单线程组件 每一个网页调用组件的方法。则第50个用户不得不在其调用执行之前等待第49个用户的调用 执行完毕;而第49个用户也不得不等待第48个用户的调用执行完毕;同理,第48个用户不得 不等待第47个用户的调用执行完毕,依次类推。可以设想第50个用户若想等待ASP页面显示 出来,会感到非常的漫长 单线程模型告诉COM,组件不能够有效地使用线程:实际上,它告诉COM存在着严重的 线程问题。若想让COM逐个调用组件的所有实例,那么组件可以访问全局或局部数据,而不 必同步。假如一个线程以不同步的方式访问全局或局部数据,另一个线程同时也做同样的工 作,其中一个的变化可能会丢失
结果是一种更快速的应用程序。 15.2.3 线程模型的属性 C O M/C O M +组件通过指定线程模型来表示所采用的线程的职责。这个线程模型向 C O M 运行期表明组件所涉及的线程情况,同时直接影响组件在其中创建的单元的类型。 在C O M +中有五种线程模型: • 单线程( S i n g l e - t h r e a d e d ):组件的实例总是在主 S TA中创建,主S TA是在一个进程中产生 的第一个的S TA。 • 单元线程( A p a r t m e n t - t h r e a d e d ):组件的实例必须在S TA中创建。 • 自由线程( F r e e - t h r e a d e d ):组件的实例必须在M TA中创建。 • 双线程( B o t h - t h r e a d e d ):组件的实例可在 S TA或M TA中创建,由C O M +根据激活者的单 元类型决定。 • 中立线程( N e u t r a l - t h r e a d e d ):组件的实例只能在N TA中创建。 1. 线程模型 因而,C O M有一系列的线程模型,组件开发人员可决定为了处理从一个或多个线程访问 组件而需担负的责任,组件负担的任务越重,就可能进一步优化组件的使用,提高使用它们 的应用程序的性能和可扩展性。 V B线程模型不是真正的问题,在 VB 6.0中有两种选择: • Single:对所有组件实例的所有访问通过单一线程串行进行。 • A p a r t m e n t:对一个组件实例的所有访问通过单一线程串行进行。但不同的组件实例存 活在不同的线程中,使用的线程在组件的生存期中是静态的。 单元线程模型对于大部分 A S P组件类型的开发是适宜的。但是,如果在 ASP Session或 A p p l i c a t i o n对象中存储组件(对象)的实例,从性能角度考虑,应使用自由的或双线程模型。这 意味着不得不使用 V C + +,这些线程模型不适合 V B,因为V B不能用于编写多线程应用程序, 并对编程人员隐藏了线程概念。 (1) 单线程模型 单线程模型有其不足之处,它起源于 Windows 3.1下早期的C O M,除非你正使用的环境指 明是使用单线程模型,否则没有必要考虑使用它。 I I S明确建议不使用单线程模型。 假如在多线程应用程序 (如I I S )中使用了单线程组件,那么可能正在使此应用程序的较大 部分单线程化。使用单线程组件意味着,对每一个组件实例的每个方法调用都不得不从同一 个线程进行。设想一下,假如有 5 0个用户访问一些 A S P网页,这些网页使用了单线程组件, 每一个网页调用组件的方法。则第 5 0个用户不得不在其调用执行之前等待第 4 9个用户的调用 执行完毕;而第 4 9个用户也不得不等待第 4 8个用户的调用执行完毕;同理,第 4 8个用户不得 不等待第4 7个用户的调用执行完毕,依次类推。可以设想第 5 0个用户若想等待 A S P页面显示 出来,会感到非常的漫长。 单线程模型告诉C O M,组件不能够有效地使用线程;实际上,它告诉 C O M存在着严重的 线程问题。若想让 C O M逐个调用组件的所有实例,那么组件可以访问全局或局部数据,而不 必同步。假如一个线程以不同步的方式访问全局或局部数据,另一个线程同时也做同样的工 作,其中一个的变化可能会丢失。 470计计ASP 3 高级编程 下载