用于动态二进制翻译的对象管理方法

文档序号:6469410阅读:143来源:国知局
专利名称:用于动态二进制翻译的对象管理方法
技术领域
本发明涉及一种用于动态二进制翻译的对象管理方法,用于在动态二进制翻 译器中采用多层次状态字方式对大量同类对象的状态进行管理。本发明属于二 进制翻译技术领域。
背景技术
动态二进制翻译是虚拟执行技术中应用最为广泛的方法,是为遗留代码提供 移植可能性和提高软件的平台适应性的一种有效手段,它在不需要可执行程序 的源代码的情况下,可以动态地将源机器平台上的二进制程序经过转换,运行 于其他目标机器平台上。对于动态二进制翻译器自身而言,性能和健壮性是两 个重要的衡量指标。所谓性能是指,以源程序在原架构下运行的效率为参照, 其在动态二进制翻译器提供的运行环境下的效率损失度越低,翻译器的性能越 好。所谓健壮性是指,在源程序出现崩溃等突发情况下,动态二进制翻译器自 身的健壮程度。
动态二进制翻译器采用何种内部对象管理方法对上述两个指标都有明显的 影响。因为在动态二进制翻译过程中,翻译器不仅要产生各种对象来维护自身 的状态和运行过程,同时翻译器会根据源程序的可执行文件,将源程序指令以 指令块为单位进行翻译和即时运行,即将源程序指令块翻译成现体系架构下可 执行的指令块,随后运行翻译好的指令块。在这一过程中翻译器需要生成大量 的对象来维护这些指令块的状态和对应关系等信息。在真正实现时,情况远比 上述复杂,现时的各种动态二进制翻译器中,都会在主存中维护一段连续的空 间,称之为目标指令块缓存,这一块固定大小的地址空间主要是用来存放翻译 器在之前已经翻译完成的指令块,并由一类对象对这些指令块一对一的进行状 态维护。当执行过程在某个目标指令块结束,需要跳转到下一个指令块时,如果翻译器发现之后要运行的指令块已经存在与目标指令块缓存中,则马上运行 对应的目标指令块,而无需进行重复翻译,由此大大提高了翻译性能,而对目 标指令块的查找过程就是对相应对象群的检索过程。此外,由于这一目标指令 块缓存大小固定,当翻译完成的指令块较多,缓存空间不够时,就必须采用某 种替换算法对目标指令块缓存进行空间释放和刷新。此时,维护指令块的对象
也必须做出相应的状态更改,比如,对象释放或重用。可见,对象管理方法的 选用,特别是目标指令块的维护对象的管理方法,对翻译器性能有较大影响。
动态二进制翻译器在执行源程序时,无法获知源程序的具体功能、实现情况 和可靠程度,也不应对源程序提出除了运行架构之外的任何假设。所以,在实 际翻译运行时,当源程序发生崩溃或灾难性操作时,动态二进制翻译器应有对 应的防范措施。因此,翻译器必须拥有足够强大的控制力,实时掌握源程序的 运行情况,而其前提是翻译器能有效的控制和了解各种对象的状态,特别是目 标指令块对象。所以,翻译器必须采用一种有效、可靠的对象管理方法,提高 自身的健壮性。
现今己实现的动态二进制翻译器中,并未对翻译器中的对象管理方法给予足 够的重视。多数动态二进制翻译器采用一种常用的对象管理方法,即,直接在 堆空间中自由申请对象,并运用链表将同类对象联系在一起。这一方式,严重 制约了对象检索和释放等操作的效率,并降低了翻译器的控制力度。
因此需要发明一种新的用于动态二进制翻译的对象管理方法,提高动态二进 制翻译器的性能和健壮性。

发明内容
本发明的目的在于针对现有技术的不足和动态二进制翻译器的特点,提供一 种用于动态二进制翻译的对象管理方法,提高动态二进制翻译器的性能和健壮 性,以期减少源程序运行效率的损失,并为之后动态二进制翻译器增加自身的 内存对象空间管理提供前提。
为实现上述目的,本发明摈弃常用的对象管理方法,重新设计了一种采用多 层次状态字方式的对象管理方法。采用多层次状态字方式,用连续的二进制位的值标识同类对象状态,其中每位二进制位标识一个对象的两个状态。用多个 状态字层标识数量庞大的同类对象的状态,即将状态字层分成上区段和下区段, 下区段包含标识对象状态的状态字集合,由多个状态字连续横向排列实现;上 区段可以由多个状态字层实现,是标识状态字状态的状态字集合,每个状态字 层都由多个状态字连续横向排列组成,再将每个状态字层纵向排列。由此将对 象的存储空间完全置于动态二进制翻译器的控制之下,运用连续空间存放同类 对象,有效提高翻译器对空间利用和对象操作的控制,降低性能损失。 本发明的用于动态二进制翻译的对象管理方法的具体步骤如下
1、 多层次状态字管理架构
用连续的二进制位的值标识同类对象状态,其中每位二进制位标识一个对 象的两个状态,从二进制位的第一位开始,每32个连续位组成一个字,称为状 态字;用多个状态字层标识同类对象的状态,将状态字层分成上区段和下区段, 下区段包含一个状态字层,是标识对象状态的状态字集合,称之为底层状态字, 由多个状态字连续横向排列实现,其中,每个状态字的一个二进制位标识一个 对象的状态;上区段由多个状态字层实现,是标识状态字状态的状态字集合, 每个状态字层都由多个状态字连续横向排列组成,再将每个状态字层纵向排列, 每层中状态字的个数由下至上以32为倍数逐层递减,其中,每一层状态字的每 一位用来标识紧邻的下层状态字中对应的单个状态字的两个状态。
2、 采用多层次状态字管理方法的对象初始化 为了提高对象检索和释放等操作的效率,增强动态二进制翻译器对自身对象
的控制力,可在翻译器启动时开辟一块连续的主存空间用于存放各种对象,并 将同类对象连续存放在一起。
在初始化对象之前,由于状态字数量不大且赋值简单,可将各层次状态字事 先全部初始化为0。对象并不需要一次性全部初始化完成,而是每次不够用时才 初始化一定数量的同类对象。需要注意的是,每次初始化一定数量的对象时, 都要保证对象的连续性,即,每次初始化的对象必须紧跟在之前的同类对象后 面。3、 根据多层次状态字检索和重用对象 当翻译器需要一个空闲对象来标识和管理某些信息时,可以通过检索此类对
象的状态字来快速地找到一个已经初始化完成的空闲对象。翻译器就可以从上 区段的最上层状态字开始检索,找到其中第一个值为0的二进制位,并根据这 个值为o的位所在位置的索引号确定紧邻的下层状态字中那个值不全为1的状 态字。然后,对这一状态字进行移位操作,从这个32位字中找到第一个值为0 的二进制位。之后,重复上述过程,直到在底层状态字中找到对应的一位值为O 的二进制位。由此,可根据此二进制位在底层状态字的位置索引号,确定空闲 对象在此类对象连续空间中的位置。如果,发现最上层状态字中,无法找到值 为O的二进制位,则需要继续初始化一定数量的对象,并返回第一个空闲对象 的地址。如果,此类对象的连续空间己经被使用完毕,则需要调用替换算法进 行释放和整理。
4、 根据多层次状态字释放对象
由于同类对象在其类型空间中是连续存放的,所以某个对象与其同类空间中 首位置对象的相对位置偏移,就是此对象状态位在底层状态字的位置索弓I号。 对象的释放操作就是根据对象的相对位置偏移,将对应位置的状态位翻转为0。 然后,查看此状态位所在状态字在更改之前是否为全l,对紧邻的上层状态字进 行维护即可。
本发明的对象管理方法具有实质性进步和显著的优点
① 本发明将对象的存储空间完全置于动态二进制翻译器的控制之下,运用连
续空间存放同类对象,有效提高了翻译器对空间利用和对象操作的控制,为之 后提高翻译器的健壮度提供了前提;
② 本发明使用多层次状态字的方式进行对象的管理,明显提高了对象的检 索、释放和重用等操作的效率,为翻译器降低了大量的性能损失;
③ 本发明实现简单,只需额外提供少量的辅助空间存放若干层状态字,在其 基础上实现少量算法即可;④本发明形式自由,可以根据实际应用场景,采用最为合适的状态字层次数, 达到空间与时间的平衡,并获得最好的性能表现。


图1为本发明采用的两层状态字对象管理方法架构图。
具体实施例方式
为更好地理解本发明的技术方案,以下结合附图并通过具体的实施例作进一 步描述。以下实施例不构成对本发明的限定。
动态二进制翻译器中的对象管理方法一般包括对象的初始化、检索和重用、 以及释放等功能。为凸显本发明的可行性和有效性,本实施例在动态二进制翻 译器中实现了针对目标指令块对象的两层状态字对象管理方法,如图l所示。 因为,对动态二进制翻译器而言,目标指令块对象的数量庞大,利用率高,能 很好的显示出本发明的效果,而两层状态字的实施方式,实现简单,效果明显, 又不失一般性。由于本实施例总共只有两层状态字,即上区段的状态字只有一 层,为更清晰的阐述实施过程,称上区段的状态字为顶层状态字,称下区段的 状态字为底层状态字,同时将目标指令块对象简称为对象,将目标指令块缓存 简称为缓存。具体步骤如下
1、多层次状态字管理架构
所谓状态字对象管理方法,是指用连续的二进制位的值标识某种数量庞大的 同类对象状态的方法,其中每位二进制位可标识一个对象的两个状态(如l表 示使用中,0表示空闲)。所谓状态字,是指将连续的二进制位,从第一位开始, 每32个连续位组成一个字进行保存,每个字即称为状态字。所谓状态字层,是 指将若干个连续的状态字视为 一个整体,用于标识某类对象或其下层状态字的 状态。所谓多层次状态字,是指采用层次结构,用多个状态字层标识数量庞大 的同类对象的状态,以期提高状态字的检索效率,即,将若干个状态字层分成 两个区段上区段和下区段。下区段一般只包含一个状态字层,是标识对象状 态的状态字集合,可称之为底层状态字,由多个状态字连续横向排列实现,其 中,每个状态字的一个二进制位标识一个对象的状态。上区段可以由多个状态字层实现,是标识状态字状态的状态字集合,每个状态字层都由多个状态字连 续横向排列组成,再将每个状态字层纵向排列,每层中状态字的个数由下至上 以32为倍数逐层递减,其中,每一层状态字的每一位用来标识紧邻的下层状态 字中对应的单个状态字的两个状态(如上层状态字中一个二进制位为1表示 紧邻的下层状态字32位全为1,否则表示不全为1)。 2、采用两层状态字管理方法的对象初始化
在翻译器启动时,根据缓存的大小和统计得到的每个块的基本大小得出对象 的最大可能数量。为了简化后续维护两层状态字的操作过程,需要事先将对象
最大可能数量做一定的修改,即将其与1024对齐。将对象最大可能数量乘以单 个对象大小,可得存储所有对象所需的最大可能空间大小,并为其预留这一大 小的连续空间,称之为对象空间。
在初始化对象之前,由于状态字数量不大且赋值简单,可将两层次状态字事 先全部初始化为O,如图1中的顶层状态字和底层状态字。由于两层状态字结构 相同,占用空间少,可以将两层状态字以32位字组成数组的形式存放在一起。 假设这一数组的前n个32位字是顶层状态字,则根据上层状态字个数是其紧邻 的下层状态字个数的三十二分之一的原则,可得数组的后32n个32位字是底层 状态字。显而易见,对象最大可能数量必是32X32n二1024n。
对象并不需要一次性全部初始化完成,而是每次不够用时才初始化一定数量 的对象。这一数量可选取为32的倍数,比如32、 128或1024等,如此可与状 态字结构保持一致,并有效利用x86等32位平台的计算能力,此处选取128作 为每次同时进行初始化的对象数量。需要注意的是,每次初始化一定数量的对 象时,都要保证对象的连续性,即,每次初始化的对象必须紧跟在之前已经过 初始化对象之后。
在上述过程中对象连续存储于对象空间既保证了对象操作的高效性,又提 高了翻译器对空间的控制力。对象的分批初始化,分散了大量对象同时初始化 带来的巨大延迟,降低了初始化过多对象造成浪费的风险。整个过程都以32的 倍数为单位进行,完全符合32位系统的计算习惯,提高了运算效率。3、根据两层状态字检索和重用对象
当一个未被翻译过的源指令块需要翻译时,翻译器必须首先获得一个空闲的 对象。此时,翻译器就可以从顶层状态字(如图l)开始检索,由上至下,直到 底层状态字(如图l),并最终确定空闲对象的位置。具体过程如下
1) 如果最近一次初始化的128个对象还未被全部使用过,则按照对象空间 的前后次序返回一个从未被使用过的空闲对象。同时,根据此对象在对象空间 的偏移位置,将标识这一对象的底层状态字的相应位翻转为1,之后査看此状态 字值,如果等于OxFFFFFFFF,则需根据此状态字在底层状态字的总体偏移位置, 将相应的顶层状态字的二进制位翻转为1;
2) 如果最近一次初始化的128个对象已经全部被使用过,则从第一个顶层 状态字(如图l)开始检索,査找到第一个值不等于OxFFFFFFFF的状态字。如 果无法找到,则需重新初始化128个新对象,并返回步骤l)。如果此时对象空 间已满,则需调用替换算法,并重复步骤2);
3) 对上述状态字进行移位操作,找到第一个值为0的二进制位。具体过程 如下将此状态字与0x80000000比较,如果大于或等于,则将状态字左移一位, 循环执行,否则停止移位,记录下来的移位次数即为第一个值为0的二进制位 所在位置;
4) 根据上述二进制位在顶层状态字的总体偏移位置,确定其对应的底层状 态字,并同样进行移位操作,査找出此状态字的第一个值为O的二进制位的位 置,并将此二进制位翻转为l,随后重复步骤l)中对顶层状态字进行维护的过 程;
5) 根据上述二进制位在底层状态字的总体偏移位置,确定其对应的空闲对 象,并返回此对象。
从上述过程可以看出,整个检索过程将相当迅速。因为,每次査找一个空闲 对象的过程只需对顶层状态字进行一次査询并移位,然后,根据获得的位置索 引号对底层状态字进行32次以下的移位操作,确定位置即可找到一个空闲对象。此外,每个已初始化过的对象都将得到重用,省去了重复初始化对象的时间损 失。
4、根据两层状态字释放对象
由于对象在对象空间中是连续存放的(如图l),所以某个对象与其对象空 间中首位置对象的相对偏移,就是此对象状态位在底层状态字的总位置索引号。 对象的释放操作就是根据对象的相对位置偏移,将对应位置的状态位翻转为0, 并进行顶层状态字维护的过程。具体过程如下
1) 根据需要释放对象在对象空间的偏移位置,确定相应状态字在底层状态 字中的位置,和相应状态位在此状态字中的位置,将此状态位翻转为l。
2) 査看此状态字在翻转之前的值,如果等于OxFFFFFFFF,则需根据此状态 字在底层状态字的总体偏移位置,将相应的顶层状态字的二进制位翻转为0。
对象的释放过程相对简单,整个执行过程只需对两层状态字在常数时间内进 行维护,使其与对象空间保持一致即可。
本发明实现过程的每一步都需要对两层状态字进行精准的位操作, 一旦出现 一次错误,就会引起连锁反应。本发明适合于数量庞大的同类对象的管理,可 获得性能上的较大提升。
权利要求
1、一种用于动态二进制翻译的对象管理方法,其特征在于包括如下步骤1)用连续的二进制位的值标识同类对象状态,其中每位二进制位标识一个对象的两个状态,从二进制位的第一位开始,每32个连续位组成一个字,称为状态字;用多个状态字层标识同类对象的状态,将状态字层分成上区段和下区段,下区段包含一个状态字层,是标识对象状态的状态字集合,称之为底层状态字,由多个状态字连续横向排列实现,其中,每个状态字的一个二进制位标识一个对象的状态;上区段由多个状态字层实现,是标识状态字状态的状态字集合,每个状态字层都由多个状态字连续横向排列组成,再将每个状态字层纵向排列,每层中状态字的个数由下至上以32为倍数逐层递减,其中,每一层状态字的每一位用来标识紧邻的下层状态字中对应的单个状态字的两个状态;2)在翻译器启动时,针对不同类型的对象分别在主存空间中开辟连续空间,将同类对象连续存放在一起;先将各层次状态字全部初始化为0,然后根据对象类型初始化一定数量的同类对象;3)当翻译器需要一个空闲对象来标识和管理某些信息时,翻译器从上区段的最上层状态字开始检索,找到其中第一个值为0的二进制位,并根据这个值为0的位所在位置的索引号确定紧邻的下层状态字中那个值不全为1的状态字,然后对该状态字进行移位操作,从中找到第一个值为0的二进制位,之后重复上述过程,直到在底层状态字中找到对应的一位值为0的二进制位,根据此二进制位在底层状态字的位置索引号,确定一个空闲对象在此类对象连续空间中的位置;如果,在最上层状态字中无法找到值为0的二进制位,则继续初始化一定数量的同类对象,并保证对象的连续性,即,继续初始化的对象必须紧跟在之前已初始化的同类对象后面,由此确定一个空闲对象的地址;如果,此类对象的连续空间已经被使用完毕,则需要调用替换算法进行释放和整理;4)当翻译器不再需要某个对象时,根据多层次状态字释放该对象,即根据该对象与在其连续空间中首位置的对象的相对位置偏移,确定该对象状态位在底层状态字的位置索引号,将对应位置的状态位翻转为0,然后,查看此状态位所在状态字在更改之前是否为全1,对紧邻的上层状态字进行维护。
全文摘要
本发明涉及一种用于动态二进制翻译的对象管理方法,采用多层次状态字方式,用连续的二进制位的值标识同类对象状态,其中每位二进制位标识一个对象的两个状态。用多个状态字层标识数量庞大的同类对象的状态,即将状态字层分成上区段和下区段,下区段包含标识对象状态的状态字集合,由多个状态字连续横向排列实现;上区段可以由多个状态字层实现,是标识状态字状态的状态字集合,每个状态字层都由多个状态字连续横向排列组成,再将每个状态字层纵向排列。本发明将对象的存储空间完全置于动态二进制翻译器的控制之下,运用连续空间存放同类对象,有效提高了翻译器对空间利用和对象操作的控制,降低性能损失。
文档编号G06F9/45GK101408848SQ20081020303
公开日2009年4月15日 申请日期2008年11月20日 优先权日2008年11月20日
发明者梁阿磊, 管海兵, 顾静辉 申请人:上海交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1