CN109240702B - 一种多线程模式下的快速段式编址配置和访问方法 - Google Patents
一种多线程模式下的快速段式编址配置和访问方法 Download PDFInfo
- Publication number
- CN109240702B CN109240702B CN201810929684.1A CN201810929684A CN109240702B CN 109240702 B CN109240702 B CN 109240702B CN 201810929684 A CN201810929684 A CN 201810929684A CN 109240702 B CN109240702 B CN 109240702B
- Authority
- CN
- China
- Prior art keywords
- data segment
- program
- storage
- variable
- thread
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种多线程模式下的快速段式编址配置和访问方法,包括如下步骤:S101、用户程序中使用存储层次关键字;S102、编译器识别并处理用户程序中的关键字;S103、链接器处理重定位信息及多层次数据段;S104、加载器内存加载;S105、程序运行时读取内部寄存器。本发明在编译链接阶段识别和处理多层次存储关键字,程序加载阶段识别和处理多层次存储数据段,程序运行时充分利用CPU提供的内部寄存器获取本线程多层次存储数据段基址,提高了访存效率和灵活性。
Description
技术领域
本发明涉及计算机软件编译领域,尤其涉及一种多线程模式下的快速段式编址配置和访问方法。
背景技术
程序开发者在编写多线程程序的时候都希望存储一些线程私有的数据,这一需求由线程局部存储(TLS,Thread Local Storage)机制来支持,一旦一个全局变量被定义成TLS类型的,那么每个线程都会拥有这个变量的一个副本,任何线程对该变量的修改都不会影响其他线程中该变量的副本。如果要定义一个全局变量为TLS类型的,只需要在它定义前加上相应的关键字即可,对于GCC来说,这个关键字就是__thread。正常情况下一个全局变量或静态变量会被放到“.data”或“.bss”段中,但当我们使用__thread定义一个线程私有变量的时候,编译器会把这些变量放到可执行文件的“.tbss”数据段中。当系统启动一个新的线程时,它会从进程的堆中分配一块足够大小的空间,然后把“.tbss”数据段中的内容复制到这块空间中,于是每个线程都有自己独立的一个“.tbss”数据段副本。所以对于用__thread定义的同一个变量,它们在不同线程中的地址都是不一样的。然而,现有的TLS机制存在着如下缺陷:一方面,线程自有“.tbss”数据段副本的地址与线程号一一对应,程序运行过程中或依赖操作系统获取线程号进而得到本线程“.tbss”数据段副本的地址,或开辟内存空间用于存储本线程“.tbss”数据段副本的地址,程序运行开销较大。另一方面,现有TLS机制可以支持多线程单一存储层次的线程局部存储模型,但是应对多存储层次模式则无能为力。上文中,多线程(multithread)是指计算机硬件或软件支持多个线程并发执行,每个线程有自己的上下文环境和私有数据空间,能大幅提高程序性能。线程局部存储(TLS,Thread Local Storage)是指每个线程私有的存储空间,线程之间的存储空间不相互重叠。
发明内容
本发明的目的在于通过一种多线程模式下的快速段式编址配置和访问方法,来解决以上背景技术部分提到的问题。
为达此目的,本发明采用以下技术方案:
一种多线程模式下的快速段式编址配置和访问方法,该方法包括如下步骤:
S101、用户程序中使用存储层次关键字;
S102、编译器识别并处理用户程序中的关键字;
S103、链接器处理重定位信息及多层次数据段;
S104、加载器内存加载;
S105、程序运行时读取内部寄存器。
特别地,所述步骤S101具体包括:用户程序中在存储层次类型定义前面加上相应的关键字。
特别地,所述步骤S102具体包括:编译器识别用户程序中存储层次相应的关键字,不同存储层次变量放到不同的数据段;用户程序中使用存储层次变量时,编译器生成读取内部寄存器指令,获取对应的数据段基址。
特别地,所述步骤S103具体包括:链接器将多层次存储类型变量放到对应的数据段,根据变量地址处理寻址指令的重定位信息。
特别地,所述步骤S104具体包括:加载器加载程序时识别出存储层次相应数据段,将不同的数据段基址存储到对应的CPU内部寄存器。
特别地,所述步骤S105具体包括:程序运行中遇到存储层次类型变量时,读取内部寄存器,获取变量对应的数据段基址。
本发明提出的多线程模式下的快速段式编址配置和访问方法在编译链接阶段识别和处理多层次存储关键字,程序加载阶段识别和处理多层次存储数据段,程序运行时充分利用CPU提供的内部寄存器获取本线程多层次存储数据段基址,提高了访存效率和灵活性。
附图说明
图1为本发明实施例提供的多线程模式下的快速段式编址配置和访问方法流程图;
图2为本发明实施例提供的多线程模式下的快速段式编址配置和访问方法具体应用流程图。
具体实施方式
下面结合附图和实施例对本发明作进一步说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容,除非另有定义,本文所使用的所有技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述具体地实施例,不是旨在于限制本发明。
请参照图1所示,图1为本发明实施例提供的多线程模式下的快速段式编址配置和访问方法流程图。
本实施例中多线程模式下的快速段式编址配置和访问方法包括如下步骤:
S101、用户程序中使用存储层次关键字。
S102、编译器识别并处理用户程序中的关键字。
S103、链接器处理重定位信息及多层次数据段。
S104、加载器内存加载。
S105、程序运行时读取内部寄存器。
具体地,在本实施例中所述步骤S101具体包括:用户程序中在存储层次类型定义前面加上相应的关键字。所述步骤S102具体包括:编译器识别用户程序中存储层次相应的关键字,不同存储层次变量放到不同的数据段;用户程序中使用存储层次变量时,编译器生成读取内部寄存器指令,获取对应的数据段基址。所述步骤S103具体包括:链接器将多层次存储类型变量放到对应的数据段,根据变量地址处理寻址指令的重定位信息。所述步骤S104具体包括:加载器加载程序时识别出存储层次相应数据段,将不同的数据段基址存储到对应的CPU内部寄存器。所述步骤S105具体包括:程序运行中遇到存储层次类型变量时,读取内部寄存器,获取变量对应的数据段基址。
以__thread类型变量的处理为例。__thread类型表示线程私有变量,一般的处理是程序运行中或依赖操作系统获取线程号进而得到本线程“.tbss”数据段基址,或开辟内存空间用于存储本线程“.tbss”数据段基址。在本实施例中,利用CPU提供的0xc4号内部寄存器用于记录线程“.tbss”数据段基址,可有效减少访存次数,提高程序性能。如图2所示,在本实施例中多线程模式下的快速段式编址配置和访问方法包括如下步骤:
S201、用户程序中使用__thread关键字声明变量。
具体地,用户程序声明变量时使用__thread关键字,如__thread int a,表示a为整型线程私有变量。
S202、编译器识别并处理__thread关键字。
具体地,编译器前端识别__thread关键字,将变量a放到“.tbss”数据段。我们规定0xc4号内部寄存器用于存放“.tbss”数据段的基址,因此编译器后端生成“rcsr 0xc4”指令获取“.tbss”数据段的基址,然后生成“tprelhi+tprello”指令进行变量a的寻址。
S203、链接器处理重定位信息及“.tbss”数据段。
具体地,链接器将变量a放到目标程序的“.tbss”数据段,然后根据变量a的地址将重定位信息填入“tprelhi+tprello”指令。
S204、加载器加载内存。
具体地,在程序加载阶段,加载器将变量a布局在“.tbss”数据段,并将“.tbss”数据段的基址写入0xc4号内部寄存器。
S205、程序运行时读取内部寄存器。
具体地,程序运行中遇到变量a时,读取0xc4号内部寄存器,获取“.tbss”数据段基址,然后通过“tprelhi+tprello”指令进行变量a的寻址。
本发明通过编译器识别程序中多种存储层次数据进行分段存储编址,在程序加载阶段识别出关键数据段后进行内存加载,并记录该数据段基址存于硬件提供的可用于快速存取的内部寄存器,在程序运行中访问本线程所需存储层次数据时读取相应的内部寄存器即可获取对应的数据段基址。本发明支持多线程模式下的多层次存储,程序可以不局限于常规数据段的命名规范限制,不用依赖操作系统参与线程取址,也不用将各数据段基址存于内存中,该发明能够通过对CPU内部寄存器的访问快速取得本线程所需存储层次数据的段基址,提高访存效率和灵活性。
本领域普通技术人员可以理解实现上述实施例中的全部部分是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (2)
1.一种多线程模式下的快速段式编址配置和访问方法,其特征在于,包括如下步骤:
S101、用户程序中使用存储层次关键字;
S102、编译器识别并处理用户程序中的关键字;
S103、链接器处理重定位信息及多层次数据段;
S104、加载器内存加载;
S105、程序运行时读取内部寄存器;
步骤S102具体包括:编译器识别用户程序中存储层次相应的关键字,不同存储层次变量放到不同的数据段;用户程序中使用存储层次变量时,编译器生成读取内部寄存器指令,获取对应的数据段基址;
步骤S103具体包括:链接器将多层次存储类型变量放到对应的数据段,根据变量地址处理寻址指令的重定位信息;
步骤S104具体包括:加载器加载程序时识别出存储层次相应数据段,将不同的数据段基址存储到对应的CPU内部寄存器;
步骤S105具体包括:程序运行中遇到存储层次类型变量时,读取内部寄存器,获取变量对应的数据段基址。
2.根据权利要求1所述的多线程模式下的快速段式编址配置和访问方法,其特征在于,步骤S101具体包括:用户程序中在存储层次类型定义前面加上相应的关键字。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810929684.1A CN109240702B (zh) | 2018-08-15 | 2018-08-15 | 一种多线程模式下的快速段式编址配置和访问方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810929684.1A CN109240702B (zh) | 2018-08-15 | 2018-08-15 | 一种多线程模式下的快速段式编址配置和访问方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109240702A CN109240702A (zh) | 2019-01-18 |
CN109240702B true CN109240702B (zh) | 2022-06-14 |
Family
ID=65071620
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810929684.1A Active CN109240702B (zh) | 2018-08-15 | 2018-08-15 | 一种多线程模式下的快速段式编址配置和访问方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109240702B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112445724B (zh) * | 2019-08-29 | 2022-09-13 | 无锡江南计算技术研究所 | 针对片上存储器重用的链接时地址分配方法 |
CN116483545B (zh) * | 2023-06-19 | 2023-09-29 | 支付宝(杭州)信息技术有限公司 | 一种多任务执行方法、装置以及设备 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7412710B2 (en) * | 2004-11-12 | 2008-08-12 | Red Hat, Inc. | System, method, and medium for efficiently obtaining the addresses of thread-local variables |
CN101882091A (zh) * | 2010-06-22 | 2010-11-10 | 北京北大众志微系统科技有限责任公司 | 线程局部存储实现方法和装置 |
US8832672B2 (en) * | 2011-01-28 | 2014-09-09 | International Business Machines Corporation | Ensuring register availability for dynamic binary optimization |
CN102207882B (zh) * | 2011-05-27 | 2013-07-24 | 杭州中天微系统有限公司 | 一种risc处理器应用程序编译中立即数的锚地址装载方法 |
CN105426226B (zh) * | 2015-11-24 | 2018-07-06 | 无锡江南计算技术研究所 | 一种异构代码融合的编译和生成方法 |
CN106445656B (zh) * | 2016-09-06 | 2019-10-11 | 北京邮电大学 | 一种实现线程本地存储的方法及装置 |
-
2018
- 2018-08-15 CN CN201810929684.1A patent/CN109240702B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN109240702A (zh) | 2019-01-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9563446B2 (en) | Binary file generation | |
KR100518584B1 (ko) | 공유 라이브러리 시스템 및 상기 시스템 구축 방법 | |
US9727471B2 (en) | Method and apparatus for stream buffer management instructions | |
US5581768A (en) | Method and apparatus for executing applications in place from write once/seldom memories | |
US8244775B1 (en) | Using map objects to access object properties in a dynamic object-oriented programming language | |
US7412710B2 (en) | System, method, and medium for efficiently obtaining the addresses of thread-local variables | |
US9507613B2 (en) | Methods and apparatus for dynamically preloading classes | |
RU2509347C2 (ru) | Гибкое увеличение страниц памяти | |
CN111399990B (zh) | 解释执行智能合约指令的方法及装置 | |
US20070233766A1 (en) | System and method for compiling scalar code for a single instruction multiple data (simd) execution engine | |
US20140115585A1 (en) | String cache file for optimizing memory usage in a java virtual machine | |
US9058192B2 (en) | Handling pointers in program code in a system that supports multiple address spaces | |
US9477588B2 (en) | Method and apparatus for allocating memory for immutable data on a computing device | |
CN109240702B (zh) | 一种多线程模式下的快速段式编址配置和访问方法 | |
US8726248B2 (en) | Method and apparatus for enregistering memory locations | |
RU2510073C2 (ru) | Управление дескриптором типа для замороженных объектов | |
KR20090029798A (ko) | 멀티태스킹 가상 머신을 위한 힙 구성 | |
US6782446B2 (en) | Method to prevent corruption of page tables during flash EEPROM programming | |
US9086933B2 (en) | System and method for launching callable functions | |
CN107391190B (zh) | 一种程序模块动态装载方法 | |
US8327122B2 (en) | Method and system for providing context switch using multiple register file | |
US20040205303A1 (en) | System and method to track changes in memory | |
US20120005460A1 (en) | Instruction execution apparatus, instruction execution method, and instruction execution program | |
US9298460B2 (en) | Register management in an extended processor architecture | |
US20150128113A1 (en) | Allocate instruction and api call that contain a sybmol for a non-memory resource |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |