热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

(翻译)《Expert.NET2.0ILAssembler》第五章元数据表的组织5.1什么是元数据?

返回目录本章对元数据及其构造方式进行了概述。也还描述了元数据验证。后面的章节将会分析单独的元数据项——基于这里所表示的基础。我理解你可能的急躁——“这个家伙不要拖延时间,什么时候才能进入正题

返回目录

 

本章对元数据及其构造方式进行了概述。也还描述了元数据验证。后面的章节将会分析单独的元数据项——基于这里所表示的基础。我理解你可能的急躁——“这个家伙不要拖延时间,什么时候才能进入正题?”——但是我仍然奉劝你不要跳过本章。远远不是拖时,我只是系统地接近这个对象。这看上去可能是一样的,但是动机是完全不同的,而这正是我所关心的。

 

什么是元数据?

元数据的定义:描述数据的数据。然而,就像每个通常的定义一样,这个定义并没有丰富的信息。在CLR的上下文中,元数据表示由描述符组成的一套体系,这些操作符包括了在一个模块中被声明或引用的所有项。由于CLR模型天生就是面向对象的,因此在元数据中描述的项是类和它们的成员,以及它们伴随着的特性、属性和关联。

译注:这里的关联,举例而言,如继承。

从实用的观点看,元数据所扮演的角色类似于COM世界中的类库所扮演的角色。可是,在这个普通的级别上,这些类似之处只有这些,接下来则是不同点。元数据,从细枝末节上描述了模块或程序集的结构化方面,比由类库提供的数据要极大的丰富,这些类库只携带了将COM接口视为由模块所暴露的信息。重要的区别是,元数据是一个托管模块的完整部分,这意味着每个托管模块总是携带着一个关于它的逻辑结构的完全的、高级别的、正式的描述。

从结构上说,元数据是一个正规的关系型数据库。这意味着元数据被组织为一组交叉引用的二维表——而不是,例如,一个带有一棵树状结构的层联级数据库。元数据表的每一列包括了数据或者指向另一个表中的一行的引用。元数据并不包括任何重复的数据字段,数据的每个类别都只位于元数据的数据库的一个表中。如果另一个表也需要使用这个相同的数据,它将引用保存着这个数据的表。

例如,正如第一章所述,一个类定义携带了特定的二进制特性(标记)。这个类的方法的行为和特性受这个类的标记影响,因此,在一条描述了其中一个方法的元数据记录中,复制这个类的一些特性,包括标记,是非常诱人的。但是数据定义不仅导致数据库大小的增长,也会导致保持这些复制体相容的问题。

替代的,方法描述符按照这样的方式存储:父类总是能从一个给定的方法描述符中被发现。这种参考方案确实需要一定数量的搜索,而这是非常昂贵的,如果不是这种典型的基于.NET的应用程序,处理器的速度也不会是一个问题——包括通信带宽和数据完整性。

       如果这样的布局对你而言看起来并不是那么有效,想一想如果你是运行时的类加载器,你通常将如何访问元数据。作为一个类加载器,你会想加载一个完整的类,包括它的所有方法、字段和其它成员。而且,正如我之前谈到的,这个类的描述符(记录)携带了指向这个方法表的记录的一个引用,这个方法表表示了这个类的第一个方法。属于这个类的方法记录的末端是定义在下一个类的方法记录的开始部分,或者(对于最后一个类)是定义在这个方法表的末端。对于字段数据也是这样的。

显然,这种技术需要方法表中的记录存储在它们的父类中。这同样应用于其它表映射到表的关系(类映射到字段,方法映射到参数等等)。如果这种需求被满足,元数据就被认为“优化的”(optimized)或“压缩的”(compressed)。图5-1显示了这样的元数据的一个示例。ILAsm编译器总是生成优化的元数据。

 

5-1 优化的元数据的一个示例

 

然而,臃肿的元数据发布或可增长的编译,导致了这样的结果:将这些子表插入到它们所拥有的类中是可能的。例如,类记录A可能被首先发布,紧跟其后的是类记录B,类B的方法记录,然后是类A的方法记录;或者这个顺序可能是类记录A,然后是类A的一些方法记录,紧跟其后的是类记录B,类B的方法记录,然后是类A的剩余的方法记录。

在这种情形中,额外的中间元数据表会被预定,提供了非插入式的检索表,这些表按照它拥有的类进行排序。取代以引用这些方法记录,类的记录引用了一个中间表(指针表)的记录,而且这些记录依次引用了这些方法记录,正如图5-2中列出的表格。使用了这种中间检索表的元数据被称为未优化的或未压缩的。

两种场景经常导致发布非压缩的元数据结构:“编辑和继续”场景,当一个模块被加载到内存的时候,该模块的元数据和IL代码会在这种场景中被修改,而另一种是增长的编译场景,元数据和IL代码在“安装”时被修改。

 

5-1 一个未优化的元数据的例子

 

 

 


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 脑机接口(BCI)技术正逐步将科幻变为现实,从帮助听障人士恢复听力到使瘫痪者重新站立,甚至可能将多年的学习过程压缩至瞬间。本文探讨了这一前沿技术的现状、挑战及其未来前景。 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 获取Jedis和Commons Pool JAR包的两种方法及详细步骤
    本文介绍如何通过网盘链接或官方网站获取Jedis和Commons Pool的JAR包,并提供详细的图文教程。同时,还附有导入JAR包到项目的相关建议。 ... [详细]
author-avatar
love乄鮰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有