CN103150197B - 基于静态划分的代码Cache管理方法 - Google Patents
基于静态划分的代码Cache管理方法 Download PDFInfo
- Publication number
- CN103150197B CN103150197B CN201310048664.0A CN201310048664A CN103150197B CN 103150197 B CN103150197 B CN 103150197B CN 201310048664 A CN201310048664 A CN 201310048664A CN 103150197 B CN103150197 B CN 103150197B
- Authority
- CN
- China
- Prior art keywords
- size
- cache
- level cache
- code block
- max
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明涉及计算机应用领域的动态二进制翻译技术,公开了一种基于静态划分的代码Cache管理方法,在TB信息中增加表示基本块执行次数的execution_times和表示目标体系代码块大小的generated_size,增加变量L1_base和L1_ptr,增加变量L2_head和L2_rear,增加TB备份数组。本发明的优点在于,Cache管理灵活,管理开销较低,通过考虑程序的执行特征,降低了Cache中缓存的代码块的缺失率。
Description
技术领域
本发明涉及计算机应用领域的动态二进制翻译技术,特别涉及一种基于静态划分的代码Cache管理方法。
背景技术
动态二进制翻译技术是解决遗留代码和提高软件平台适应性的一种有效手段。它在不需要可执行程序源代码的情况下,动态地将源体系结构上的二进制程序经过转换,运行于其他目标体系结构上。动态二进制翻译基本上是这样工作的:以基本块为单位翻译源体系结构二进制代码,通过翻译生成相应的目标体系结构支持的代码块,并缓存在代码Cache中,这样当程序再次运行到这个基本块时,就直接从代码Cache中得到相应的目标体系结构代码并执行,从而提高程序执行速度。利用代码Cache加速翻译效率的同时,需要对翻译出来的代码块进行有效的管理,需要既节省本地内存空间,又不至于引起代码Cache由于空间不足导致频繁的替换操作以致性能下降。
代码Cache管理策略在动态二进制翻译中对提高翻译效率具有重要作用,它需要综合考虑管理开销、代码局部性、代码碎片等问题,然而现有的代码Cache管理策略依然存在着各种不足,特别是管理开销较大,从程序执行局部性的角度看,Cache中的代码块的缺失率仍然较高,因此,亟需提出一种更有效的代码Cache管理策略。
发明内容
本发明针对现有技术的缺点,提供了一种可以降低管理开销,提高Cache的命中率的新型的基于静态划分的代码Cache管理方法。
为实现上述目的,本发明可采取下述技术方案:
基于静态划分的代码Cache管理方法,包括TB数组和TB备份数组,包括以下具体步骤:
1)从配置文件中读取配置参数MAX_CACHE_SIZE和L1_PROPORTION的值,将代码Cache划分为L1级Cache和L2级Cache,计算L1级Cache的大小L1_MAX_SIZE=MAX_CACHE_SIZE*L1_PROPORTION,计算L2级Cache的大小L2_MAX_SIZE=MAX_CACHE_SIZE*(1-L1_PROPORTION),其中,MAX_CACHE_SIZE表示代码Cache的大小,L1_PROPORTION表示L1级Cache占代码Cache的比例,L1_PROPORTION≥50%;
2)根据所述配置参数计算阈值
3)读取一个基本块,判断所述基本块是否已被翻译,如果所述基本块未被翻译,则对所述基本块进行翻译,在L1级Cache申请空间,将翻译产生的目标体系代码块缓存至L1级Cache;所述申请空间步骤包括,如果L1_ptr–L1_base<L1_MAX_SIZE,将所述基本块的起始地址设置为L1_ptr,所述基本块翻译完成后,根据所述目标体系代码块的大小,更新L1_ptr和TB数组;如果L1_ptr–L1_base≥L1_MAX_SIZE,令L1_ptr=L1_base,清空所述L1级Cache,将所述TB数组清零,将所述TB备份数组复制到所述TB数组,所述L1_base指向所述L1级Cache的起始地址,所述L1_ptr指向所述L1级Cache的空闲区域;
4)执行所述目标体系代码块,如果所述目标体系代码块在所述L1级Cache中则execution_times加1;
5)如果所述execution_times达到所述阈值N,则将所述目标体系代码块转移至L2级Cache,同时将所述目标体系代码块的TB信息从所述TB数组复制到所述TB备份数组;
6)重复执行所述步骤3-5直至所有基本块执行完毕。
作为优选,所述L1级Cache采用全清空策略,所述L2级Cache采用FIFO策略。
作为优选,还包括记录所述目标体系代码块大小的generated_size。
作为优选,所述步骤5中将述目标体系代码块转移至L2级Cache的步骤具体为:从所述generated_size获得所述目标体系代码块的大小size,将所述目标体系代码块转移至L2_head所指向的内存空间,更新所述基本块TB信息和L2_head,如果(L2_head+size)%L2_MAX_SIZE≥L2_rear,则执行代码块换出操作,重复执行所述代码块换出操作直至L2级Cache的空闲区域满足所述目标体系代码块的大小,其中,所述L2_head指向L2级Cache的空闲区域,所述L2_rear指向最先进入L2级Cache的目标体系代码块;
所述代码块换出操作的步骤具体为:根据所述L2_rear查找TB备份数组,得到被换出的代码块的起始地址,清空所述TB数组和所述TB备份数组中所述被换出的代码块的TB信息,令L2_rear=(L2_rear+size)%L2_MAX_SIZE。
作为优选,如果所述L1_PROPORTION<50%,令L1_PROPORTION=MAX_CACHE_SIZE,L2_MAX_SIZE=0。
本发明由于采用了以上技术方案,具有显著的技术效果:
代码Cache管理灵活,L1级Cache和L2级Cache大小及各自占有比例可通过配置文件静态配置,以适应不同环境下不同应用程序的特性。
管理开销低。全清空策略和FIFO策略是常用Cache管理策略中开销最低的两种策略,本发明提出的方案将两种策略结合,以最低的管理开销降低Cache缺失率。
考虑程序的执行特征。本发明将执行次数多且最近执行的代码尽量驻留在代码Cache中,从程序执行局部性的角度降低Cache缺失率。
附图说明
图1为实施例1QEMU动态二进制翻译流程示意图。
图2为实施例1QEMU中的实现框架示意图。
图3为本发明的流程示意图。
具体实施方式
下面结合实施例对本发明作进一步的详细描述。
实施例1
本实施例中所采用的动态二进制翻译系统为开源的QEMU系统,但本方法也可以推广到其他二进制翻译系统中。QEMU系统将源目标体系结构(如ARM,X86,MIPS)的可执行文件翻译到中间代码,然后再翻译到目标体系结构ISA(InstructionSetArchitecture)(如X86,PowerPC,ARM,Sparc,Alpha,MIPS)上执行。翻译单位为基本块,TB(TranslationBlock,简称TB)数组保存了所有基本块的翻译信息,其元素数据结构为structTranslationBlock,表示一个基本块的翻译信息(或者称为TB信息)。QEMU采用TCG作为中间代码,每条源体系结构指令会在前端被翻译为一条或者多条TCG指令,后端会将这些TCG指令翻译为目标体系结构代码。TCG具有简单、清晰的语法结构。
QEMU的动态二进制翻译流程如图1所示。QEMU首先加载源体系结构二进制文件,并找到程序的入口地址,开始翻译。每次翻译前,QEMU会首先根据当前指令PC(即基本块的地址,该基本块的地址会在该基本块被加载前保存在CPU的程序计数器,简称PC中,因此,本实施例中直接以PC来指代基本块的地址,下同)在代码Cache中进行查找,若找到该基本块所对应的目标体系代码块,则表示该基本块已经翻译过,则取出相应的目标体系代码块进行执行,如果代码Cache中未找到该基本块所对应的目标体系代码块,则执行翻译过程。翻译前端针对当前指令PC,首先译码判断指令功能,然后将其翻译为对应的TCG指令,缓存在TCGCache中,然后继续翻译下一条指令,直至遇到基本块结束指令,则结束当前基本块翻译。后端将当前基本块对应的TCG指令翻译为目标体系结构代码,即目标体系代码块,并缓存在代码Cache中,同时执行该目标体系代码块。QEMU代码Cache管理采用全清空策略,Cache查找采用哈希表的方式。
为实现本发明的代码Cache管理方法,需要对QEMU进行如下几个方面的修改:
1、增加对目标体系代码块的执行次数的统计,即在TranslationBlock结构中添加execution_times一项,用以统计基本块的执行次数。
2、在TranslationBlock结构中增加generated_size,记录基本块所对应的目标体系代码块的大小。在进行代码提升时,需要根据目标体系代码块的大小进行拷贝。且每次对L2级Cache进行的代码换出操作均需要根据被换出代码块的大小确定指针的移动。
3、新增L1_base和L1_ptr,用于管理L1级Cache。L1_base指向L1级Cache的起始地址,L1_ptr指向L1级Cache当前空闲区域。
4、增加L2_head和L2_rear变量来模拟循环数组,从而实现L2级Cache的FIFO管理策略。L2_head指向L2级Cache的当前空闲区域,L2_rear则指向最先进入L2级Cache的代码块,用于代码块换出操作。
5、增加TB备份数组,用来备份缓存在L2级Cache中的目标体系代码块的TB信息。TB备份数组与TB数组类型相同,当目标体系代码块从L1级Cache提升到L2级Cache中时,需要将该目标体系代码块的TB信息在TB数组中进行备份。
本发明的代码Cache管理策略在QEMU中的实现框架如图2所示。当L1级Cache执行完清空操作后,将TB备份数组中所有的TB信息拷贝至TB数组,这样通过TB数组就可查找到缓存在L2级Cache中的代码,因此避免了这部分代码的重新翻译。本发明的整体实现流程如图3所示,包括如下几个部分:
流程1:将Cache配置参数写入配置文件。在QEMU启动前,写configure文件,指定MAX_CACHE_SIZE和L1_PROPORTION的值。
流程2:读取配置文件,根据配置参数将代码Cache划分为L1级Cache和L2级Cache。根据MAX_CACHE_SIZE和L1_PROPORTION的值计算L1_MAX_SIZE和L2_MAX_SIZE,并申请相应内存空间。计算公式分别为:
L1_MAX_SIZE=MAX_CACHE_SIZE*L1_PROPORTION,
L2_MAX_SIZE=MAX_CACHE_SIZE*(1-L1_PROPORTION);
L1_MAX_SIZE应大于等于L2_MAX_SIZE,否则管理开销过大,且不符合程序执行特性。因此,当L1_PROPORTION小于50%,则使L1_MAX_SIZE=MAX_CACHE_SIZE,L2_MAX_SIZE=0。
流程3:根据配置参数计算阈值N。只有当L1_PROPORTION大于等于50%才需要计算N,且L2的空间比例越小,代码提升的条件应越苛刻,即N的值越大。当L1_PROPORTION>=50%,本实施例采用的N的计算公式如下:
流程4:将新翻译产生的目标体系代码块缓存至L1级Cache。当遇到未翻译的基本块,需要在L1级Cache中申请空间保存基本块翻译后的结果。申请空间时,需要判断L1级Cache的空间是否满,即L1_ptr–L1_base是否大于L1_MAX_SIZE。若L1级Cache未满,则将基本块数据结构中代码块起始地址设为L1_ptr,然后进行基本块的翻译,翻译完成后根据产生的目标体系代码块大小,更新L1_ptr和TB数组。若L1级Cache满,则进行Cache清空操作。首先,使L1_ptr=L1_base,将L1级Cache清空;然后,将TB数组清零,清除所有的翻译信息;最后,将TB备份数组中的TB信息复制回TB数组,恢复L2级Cache中代码块的翻译信息。
流程:5:对缓存在L1级Cache中代码块的执行次数进行统计。当查找到基本块已经翻译,且翻译结果缓存在L1级Cache中时,将TranslationBlock数据结构中的execution_times加1。
流程6:代码块提升。当目标体系代码块执行次数达到阈值N时,需要将该目标体系代码块从L1级Cache拷贝至L2级Cache。L2级Cache采用FIFO管理策略,当有目标体系代码块插入时,需要判断L2级Cache的剩余空间是否能容纳将要插入的代码块。首先,从该目标体系代码块的TB信息的generated_size域获得该代码块的size,然后,计算(L2_head+size)%L2_MAX_SIZE,若其值小于L2_rear,则表示L2级Cache未满,则直接将该代码块拷贝至L2_head指向的空间,并更新该目标体系代码块的TB信息和L2_head,否则,需要进行代码块换出操作:首先,根据L2_rear的值查找TB备份数组,得到将被换出的代码块所对应的基本块信息;然后,从基本块信息中获得该目标体系代码块的起始地址,查找TB数组,将TB数组中该目标体系代码块的TB信息清空,同时将TB备份数组中该目标体系代码块的TB信息也清空;最后,更新L2_rear,即L2_rear=(L2_rear+size)%L2_MAX_SIZE。换出一个代码块后,L2级Cache的剩余空间仍无法满足插入代码块的需求,则重复执行上述代码块换出操作,直至L2级Cache的剩余空间足够。
总之,以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所作的均等变化与修饰,皆应属本发明专利的涵盖范围。
Claims (1)
1.一种基于静态划分的代码Cache管理方法,其特征在于,包括TB数组和TB备份数组,包括以下具体步骤:
1)从配置文件中读取配置参数MAX_CACHE_SIZE和L1_PROPORTION的值,将代码Cache划分为L1级Cache和L2级Cache,计算L1级Cache的大小L1_MAX_SIZE=MAX_CACHE_SIZE*L1_PROPORTION,计算L2级Cache的大小L2_MAX_SIZE=MAX_CACHE_SIZE*(1-l1_PROPORTION),其中,MAX_CACHE_SIZE表示代码Cache的大小,L1_PROPORTION表示L1级Cache占代码Cache的比例,L1_PROPORTION≥50%;
如果所述L1_PROPORTION<50%,令L1_PROPORTION=MAX_CACHE_SIZE,L2_MAX_SIZE=0;
2)根据所述配置参数计算阈值
3)读取一个基本块,判断所述基本块是否已被翻译,如果所述基本块未被翻译,则对所述基本块进行翻译,在L1级Cache申请空间,将翻译产生的目标体系代码块缓存至L1级Cache;所述申请空间步骤包括,如果L1_ptr–L1_base<L1_MAX_SIZE,将所述基本块的起始地址设置为L1_ptr,所述基本块翻译完成后,根据所述目标体系代码块的大小,更新L1_ptr和TB数组;如果L1_ptr–L1_base≥L1_MAX_SIZE,令L1_ptr=L1_base,清空所述L1级Cache,将所述TB数组清零,将所述TB备份数组复制到所述TB数组,所述L1_base指向所述L1级Cache的起始地址,所述L1_ptr指向所述L1级Cache的空闲区域;
4)执行所述目标体系代码块,如果所述目标体系代码块在所述L1级Cache中则execution_times加1;
5)如果所述execution_times达到所述阈值N,则将所述目标体系代码块转移至L2级Cache,同时将所述目标体系代码块的TB信息从所述TB数组复制到所述TB备份数组;
6)重复执行所述步骤3-5直至所有基本块执行完毕;
所述L1级Cache采用全清空策略,所述L2级Cache采用FIFO策略;
还包括记录所述目标体系代码块大小的generated_size;
所述步骤5中将述目标体系代码块转移至L2级Cache的步骤具体为:从所述generated_size获得所述目标体系代码块的大小size,将所述目标体系代码块转移至L2_head所指向的内存空间,更新所述基本块TB信息和L2_head,如果(L2_head+size)%L2_MAX_SIZE≥L2_rear,则执行代码块换出操作,重复执行所述代码块换出操作直至L2级Cache的空闲区域满足所述目标体系代码块的大小,其中,所述L2_head指向L2级Cache的空闲区域,所述L2_rear指向最先进入L2级Cache的目标体系代码块;
所述代码块换出操作的步骤具体为:根据所述L2_rear查找TB备份数组,得到被换出的代码块的起始地址,清空所述TB数组和所述TB备份数组中所述被换出的代码块的TB信息,令L2_rear=(L2_rear+size)%L2_MAX_SIZE。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310048664.0A CN103150197B (zh) | 2013-02-07 | 2013-02-07 | 基于静态划分的代码Cache管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310048664.0A CN103150197B (zh) | 2013-02-07 | 2013-02-07 | 基于静态划分的代码Cache管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103150197A CN103150197A (zh) | 2013-06-12 |
CN103150197B true CN103150197B (zh) | 2016-01-20 |
Family
ID=48548297
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310048664.0A Active CN103150197B (zh) | 2013-02-07 | 2013-02-07 | 基于静态划分的代码Cache管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103150197B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103870248A (zh) * | 2014-03-06 | 2014-06-18 | 北京神舟航天软件科技有限公司 | 一种指令集仿真缓冲区动态自适应技术 |
CN109829489A (zh) * | 2019-01-18 | 2019-05-31 | 刘凯欣 | 一种基于多层特征的文物碎片重组方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6112280A (en) * | 1998-01-06 | 2000-08-29 | Hewlett-Packard Company | Method and apparatus for distinct instruction pointer storage in a partitioned cache memory |
CN101482851A (zh) * | 2008-12-31 | 2009-07-15 | 中国科学院计算技术研究所 | 二进制翻译器中线程共享目标本地码缓存替换方法及系统 |
-
2013
- 2013-02-07 CN CN201310048664.0A patent/CN103150197B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6112280A (en) * | 1998-01-06 | 2000-08-29 | Hewlett-Packard Company | Method and apparatus for distinct instruction pointer storage in a partitioned cache memory |
CN101482851A (zh) * | 2008-12-31 | 2009-07-15 | 中国科学院计算技术研究所 | 二进制翻译器中线程共享目标本地码缓存替换方法及系统 |
Non-Patent Citations (2)
Title |
---|
《I386到Alpha动态二进制翻译中的代码缓存管理优化》;王楠 等;《信息工程大学学报》;20101231;第11卷(第6期);第688-691页 * |
《动态二进制翻译器中Code Cache管理策略的研究与分析》;潘丽君;《中国优秀硕士学位论文全文数据库信息科技辑》;20100715(第7期);正文第1-60页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103150197A (zh) | 2013-06-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10474369B2 (en) | Mapping guest pages to disk blocks to improve virtual machine management processes | |
KR101253012B1 (ko) | 이종 플랫폼에서 포인터를 공유시키는 방법 및 장치 | |
US11126536B2 (en) | Facilitating recording a trace file of code execution using index bits in a processor cache | |
US8856078B2 (en) | Dynamic time reversal of a tree of images of a virtual hard disk | |
US8327109B2 (en) | GPU support for garbage collection | |
US11200168B2 (en) | Caching data from remote memories | |
EP2455865A1 (en) | Memory management device | |
US10942849B2 (en) | Use of a logical-to-logical translation map and a logical-to-physical translation map to access a data storage device | |
JP5989908B2 (ja) | 不揮発性メモリにコードをキャッシュする方法、システムおよび装置 | |
US9262332B2 (en) | Memory management with priority-based memory reclamation | |
CN1517886A (zh) | 一种支持处理器的功率操作模式的高速缓存存储器 | |
US11442867B2 (en) | Using a second content-addressable memory to manage memory burst accesses in memory sub-systems | |
WO2016138785A1 (zh) | 一种运行进程的方法及装置 | |
TW202101230A (zh) | 資料儲存裝置與資料處理方法 | |
CN103150197B (zh) | 基于静态划分的代码Cache管理方法 | |
CN102521161B (zh) | 一种数据的缓存方法、装置和服务器 | |
US20100161934A1 (en) | Preselect list using hidden pages | |
CN116775507B (zh) | 固态硬盘控制器垃圾回收中的硬件加速选块方法及装置 | |
US7426612B2 (en) | Methods and apparatus for enforcing instruction-cache coherence | |
CN104156324A (zh) | 一种嵌入式系统的程序运行方法 | |
CN103207763B (zh) | 基于xen虚拟磁盘设备的前端缓存方法 | |
CN102880559B (zh) | 基于应用敏感的微处理器末端高速缓存控制方法及装置 | |
CN112860381B (zh) | 基于申威处理器的虚拟机内存扩容方法及系统 | |
US8214597B2 (en) | Cache tentative read buffer | |
JP4792065B2 (ja) | データ記憶方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |