发明内容
本发明提供了一种TLS实现方法和装置,解决了TLS实现过程中系统内在访问压力大和工作效率低的问题。
一种TLS实现方法,包括:
从处理器的通用寄存器中,选择至少一个通用寄存器作为TLS寄存器;
通过专用操作命令管理所述TLS寄存器。
进一步的,所述专用操作命令包括写入命令(set_tls)和读取命令(get_tls),所述写入命令用于向所述TLS寄存器写入数据,所述读取命令用于从所述TLS寄存器读取数据。
进一步的,所述通过专用操作命令管理所述TLS寄存器包括:
通过所述写入命令将当前线程的线程私有数据写入所述TLS寄存器;
通过所述读取命令从所述TLS寄存器中读取当前线程的线程私有数据。
进一步的,上述TLS实现方法还包括:
在当前线程换出或进行异常处理时,从所述TLS寄存器中读取所述当前线程的线程私有数据,将所述当前线程的线程私有数据存储在该线程对应的线程控制块中。
进一步的,上述TLS实现方法还包括:
在线程恢复时,读取所述线程的线程控制块中存储的线程私有数据,将所述线程私有数据写入所述TLS寄存器中。
本发明还提供了一种TLS实现装置,包括:
寄存器指定模块,用于从处理器的通用寄存器中,选择至少一个通用寄存器作为TLS寄存器;
TLS管理模块,用于通过专用操作命令管理所述TLS寄存器。
进一步的,所述专用操作命令包括写入命令和读取命令,所述写入命令用于向所述TLS寄存器写入数据,所述读取命令用于从所述TLS寄存器读取数据,所述TLS管理模块包括:
写入单元,用于通过所述写入命令将当前线程的线程私有数据写入所述TLS寄存器;
读取单元,用于通过所述读取命令从所述TLS寄存器中读取当前线程的线程私有数据。
进一步的,上述TLS实现装置还包括:
数据转移模块,用于在当前线程换出或进行异常处理时,从所述TLS寄存器中读取所述当前线程的线程私有数据,将所述当前线程的线程私有数据存储在该线程对应的线程控制块中。
进一步的,所述数据转移模块,还用于在线程恢复时,读取所述线程的线程控制块中存储的线程私有数据,将所述线程私有数据写入所述TLS寄存器中。
本发明提供的TLS实现方法和装置,本发明的主要思想是选择一个通用寄存器作为TLS寄存器,通过专用操作命令管理所述TLS寄存器,不需要添加额外的硬件寄存器,也不需要占用计算机系统内存,解决了TLS实现过程中系统内在访问压力大和工作效率低的问题。
具体实施方式
纯软件实现TLS的方式需要调用额外的库函数,并且需要额外地维护每个线程的私有存储区域;相比之下,具有硬件支持的处理器,可直接从寄存器中读取TLS的基地址,并通过偏移访问线程局部数据。所以,具有硬件支持的TLS机制,可以减少通过线程号索引线程局部存储空间的开销,免除进程对这些线程局部地址空间的维护。此外直接对寄存器进行访问,也能够一定程度上减少内存的访问压力。
虽然具有特殊硬件支持的TLS机制,能够减少TLS操作时的开销,但是需要专有的存储结构和特殊的操作指令,即需要修改体系结构加入相应的硬件逻辑。所以,一些较老的体系结构,无法有效地直接使用硬件TLS机制保证多线程执行环境的高效性。
为了解决软件实现TLS时内存访问压力大和硬件实现TLS时系统工作效率低的问题,本发明的实施例提供了一种TLS实现方法。
下面结合附图,对本发明的实施例提供的一种TLS实现方法进行详细介绍。
图1所示为本发明的实施例的应用环境,包括:
编译器101,TLS寄存器102,应用程序103,操作系统104以及由set_tls和get_tls组成的对TLS进行操作的TLS库函数105。
其中,TLS寄存器为处理器的一个通用寄存器。操作系统104和处理器107共同对上下文106进行管理,如上下文切换等。
应用程序103工作在两种不同类型的系统接口上:首先应用程序103可以使用库函数105(即set_tls和get_tls),直接作用于处理器107并访问与TLS寄存器102;其次,应用程序103通过库函数封装的API,并利用操作系统内核的上下文保存机制,将TLS的值保存于线程控制块中。
本发明的实施例一提供了一种TLS实现方法,无需添加额外的硬件TLS寄存器,利用现有的硬件资源,为计算机系统提供了灵活、高效的线程局部数据存储机制。
结合上述应用环境,使用本发明实施例一提供的TLS实现方法在计算机系统中实现TLS的流程如图2所示,包括:
步骤201、从处理器的通用寄存器中,选择至少一个通用寄存器作为TLS寄存器;
本发明实施例中,处理器的通用寄存器具有多种用途,如图3中的R0这一通用寄存器即为传参寄存器。即,当函数的参数的个数为一个时,该参数的值被放在R0中,函数内部可以直接读取R0获取参数。
处理器的通用寄存器可以为来自于caller save的寄存器,也可以为来自于callee save的寄存器。
本步骤选择的TLS寄存器为R16。被选作TLS寄存器的通用寄存器将不再接受函数库之外命令的操作。
操作系统通过应用程序,对TLS寄存器进行操作。为保证TLS寄存器的专用性,可对操作系统的编译器进行修改,在编译器生成应用程序时,TLS寄存器对其他应用不可见(编译器在生成二进制代码时,对于普通的函数而言,被选出作为TLS寄存器不参与寄存器的分配),只有TLS专用操作命令可以管理操作所述TLS寄存器。
本发明实施例所选择的TLS寄存器可能为一个,也可以为多个,如果只选择一个TLS寄存器,则可在该TLS寄存器中存放指向私有数据内存位置的指针;如果选择多个TLS寄存器,更可以将私有数据直接存储于TLS寄存器中,进一步提高访问效率。
步骤202、通过专用操作命令管理所述TLS寄存器;
本发明实施例中,专用操作命令具体指TLS库函数,包括写入命令(set_tls)和读取命令(get_tls)。set_tls,使用一条mov指令,将R0的内容写入R16;同理,get_tls也是使用一条mov指令,将R16的内容写入R0。
本发明实施例提供了一种TLS实现方法,选择一个通用寄存器作为TLS寄存器,通过专用操作命令管理所述TLS寄存器,在编译器生成应用程序时,应用程序中除了TLS库函数能够显式地操作TLS寄存器外,其余所有与TLS无关的函数均不会使用到TLS寄存器;应用程序中对TLS寄存器的操作均由库中提供的两个函数set_tls和get_tls来实现,不需要添加额外的硬件寄存器,也不需要占用计算机系统内存,解决了TLS实现过程中系统内在访问压力大和工作效率低的问题。
下面结合附图,对本发明的实施例二进行说明。
在上下文切换或进行异常处理时,都需要对TLS寄存器进行操作,使用本发明实施例提供的TLS实现方法完成上下文切换过程中线程私有数据处理的过程如图4所示,包括:
步骤401、在当前线程换出或进行异常处理时,从所述TLS寄存器中读取所述当前线程的线程私有数据,将所述当前线程的线程私有数据存储在该线程对应的线程控制块中。
在线程换出时或进行异常处理时,由于TLS寄存器(R16)也属于通用寄存器的范畴,操作系统可以使用store指令,依次将所有R16中的全部数据写入当前线程的线程控制块中。
本步骤中,还需要对相应的上下文进行保存。
步骤402、在线程恢复时,读取所述线程的线程控制块中存储的线程私有数据,将所述线程私有数据写入所述TLS寄存器中。
在线程恢复换入时,操作系统依次将该线程的线程控制块中保存的私有线程数据,使用load指令依次写回到TLS寄存器中。
本步骤中,还需要恢复相应的上下文。
本发明的实施例提供了一种TLS实现方法,首先由编译器生成应用程序,应用程序中除了库函数能够显示地操作TLS寄存器外,其余所有与TLS无关的函数均不会使用到TLS寄存器;应用程序中对TLS寄存器的操作均由库中提供的两个函数set_tls和get_tls来实现;在上下文切换时保存并恢复TLS寄存器的内容,确保当前正在执行的线程的线程私有数据一定存放在TLS寄存器中。其中对线程私有数据的保存和恢复操作,都附属与线程上下文的保存和恢复。
所述编译器在基于通用寄存器的轻量级TLS机制中,负责以下功能:控制TLS寄存器的使用。编译器编译并链接所有高级语言的代码,并在汇编时保证TLS寄存器不参与寄存器的分配。即将某个通用寄存器的功能加以限定,其他非TLS相关的指令中的源操作数和目的操作数,都不会使用与TLS绑定的寄存器。
在应用被实例化为线程时,TLS寄存器必须被赋予初值,可以与创建线程私有线程数据一致,也可以在进程创建时由编程人员手动指定。两种方式均是直接对线程控制块进行操作,当某个线程被调度执行时,以线程控制块中的信息初始化TLS寄存器。
本发明的实施例提供的TLS实现方法,引入了基于通用寄存器的轻量级TLS机制,可以高效、灵活地支持多线程的执行环境,特别是对于某些未能在硬件上对TLS直接提供支持的处理器,减少了不必要的索引,避免软件TLS的维护开销。
本发明的实施例还提供了一种TLS实现装置,其结构如图5所示,包括:
寄存器指定模块501,用于从处理器的通用寄存器中,选择至少一个通用寄存器作为TLS寄存器;
TLS管理模块502,用于通过专用操作命令管理所述TLS寄存器。
进一步的,所述专用操作命令包括写入命令和读取命令,所述写入命令用于向所述TLS寄存器写入数据,所述读取命令用于从所述TLS寄存器读取数据,所述TLS管理模块502的结构如图6所示,包括:
写入单元601,用于通过所述写入命令将当前线程的线程私有数据写入所述TLS寄存器;
读取单元602,用于通过所述读取命令从所述TLS寄存器中读取当前线程的线程私有数据。
进一步的,该装置如图7还包括:
数据转移模块503,用于在当前线程换出或进行异常处理时,从所述TLS寄存器中读取所述当前线程的线程私有数据,将所述当前线程的线程私有数据存储在该线程对应的线程控制块中。
进一步的,所述数据转移模块503,还用于在线程恢复时,读取所述线程的线程控制块中存储的线程私有数据,将所述线程私有数据写入所述TLS寄存器中。
上述TLS实现装置,可集成于计算机的操作系统中,由处理器控制该TLS实现装置的开启和关闭,以在适当的时候启动使用通用寄存器实现TLS的机制。与本发明的实施例提供的一种TLS实现方法相结合,从处理器的至少一个通用寄存器中,选择一个通用寄存器作为TLS寄存器,通过专用操作命令管理所述TLS寄存器,不需要添加额外的硬件寄存器,也不需要占用计算机系统内存,解决了TLS实现过程中系统内在访问压力大和工作效率低的问题。
本领域普通技术人员可以理解上述实施例的全部或部分步骤可以使用计算机程序流程来实现,所述计算机程序可以存储于一计算机可读存储介质中,所述计算机程序在相应的硬件平台上(如系统、设备、装置、器件等)执行,在执行时,包括方法实施例的步骤之一或其组合。
可选地,上述实施例的全部或部分步骤也可以使用集成电路来实现,这些步骤可以被分别制作成一个个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
上述实施例中的各装置/功能模块/功能单元可以采用通用的计算装置来实现,它们可以集中在单个的计算装置上,也可以分布在多个计算装置所组成的网络上。
上述实施例中的各装置/功能模块/功能单元以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。上述提到的计算机可读取存储介质可以是只读存储器,磁盘或光盘等。