CMPI中的内存管理及在Open Pegasus 中的实现
本文 CMPI(Common Manageability Programming Interface) 是由 Open Group(www.opengroup.org) 维护的一套规范.其中定义了一系列基于C语言的编程接口.基于这些编程接口, CMPI 隔离了 CIMOM(CIM Object Manager, 又称 Management Broker )和 CIM Provider (又称 Management Instrumentation, 以下简称 Provider )中的相关实现,从而使 Provider 的开发和运行不再依赖于某种特定的 CIMOM. 因此无需重新编译链接, Provider 可以发布到任何一种支持 CMPI 的 CIMOM 中. Open Pegasus(www.openpegasus.org, 以下简称 Pegasus )是一个开源的企业级的 CIMOM.它实现了对 CMPI 规范的支持.本文就以 Pegasus (2.7.1版)为例,研究了 CMPI 实现中的多线程内存管理的问题. 本文讨论的默认平台为 Linux. CMPI 中的线程与内存问题 CMPI 需要同时解决的两个问题就是其所驱动的 Provider 代码的线程安全与可重入性以及 CMPI 对象的内存管理. 线程安全及可重入 CMPI 规范要求 CMPI 的实现是线程安全以及是可重入的.这是 内存管理 Pegasus 中对 CMPI 多线程内存管理的实现 作为企业级的 CIMOM 实现, Pegasus 为了能够在多线程的环境下实现内存的管理,实现了若干数据结构.图1给出了这些数据结构的关系图.
其中关键的数据结构是 CMPI_ThreadContext . Pegasus 在启动每个响应 CIM 请求(例如 EnumerateInstances )的线程时,都会在栈上生成一个 CMPI_ThreadContext 对象,以维护对该 CIM 请求的处理过程中动态创建的 CMPI 对象. 一般来讲,一个线程只需要一个 CMPI_ThreadContext 对象就可以完成管理其生命周期内所有 CMPI 对象的任务.
CMPI_ThreadContext 数据结构 每个 CMPI_ThreadContext 对象都将绑定一个线程,并被线程内部所有的 CMPI 对象所共享.因此 CMPI_ThreadContext 实际上就是一个线程私有数据( Thread Specific Data, TSD ).基于 pthread 线程库所提供的支持, CMPI_ThreadContext 类包含一个 pthread_key_t 类型的静态变量.通过 pthread_setspecific 调用, CMPI_ThreadContext 将自身的地址与这个 key 绑定.而 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |