线程局部存储实现方法和装置制造方法及图纸

技术编号:4026643 阅读:258 留言:0更新日期:2012-04-11 18:40
本发明专利技术提供了一种线程局部存储实现方法和装置。涉及计算机领域;解决了TLS实现过程中系统内在访问压力大和工作效率低的问题。该方法包括:从处理器的通用寄存器中,选择至少一个通用寄存器作为TLS寄存器;通过专用操作命令管理所述TLS寄存器。本发明专利技术提供的技术方案,适用于多线程执行环境。

【技术实现步骤摘要】

本专利技术涉及计算机领域,尤其涉及一种线程局部存储(Thread Local Storage,简 称TLS)实现方法和装置。
技术介绍
线程局部存储是多线程执行环境中,用于保存线程私有数据的存储区域。多线程 技术是为了同步完成多个任务,其中多个任务以更加灵活的方式来运行,通过提高资源的 使用效率来提高系统的效率。如网络编程中,当监听到外部连接请求时,主线程会首先产 生一个新线程,由新线程来处理具体的数据收发和数据包的解析;而主线程自身则继续监 听数据的收发。如果我们使用单线程来实现数据的监听和收发,由于代码的顺序执行,当线 程在进行数据收发时就不能处理外部连接请求。此时网卡缓冲区中填满了数据,但其没有 得到处理器的响应,那么网卡无法继续工作。显然,用多线程来实现网络请求的监听和数据 收发,即使CPU在处理数据收发,仍能被打断并在响应网络请求后继续处理数据收发。这样 让计算机系统中的多个部件在同一时刻都处于工作状态,以提高系统的效率。多个线程在执行时往往需要保存线程私有数据。如线程在调用库函数,库函数返 回时会对errno变量进行设置,表示该调用是否成功。当多个线程均会调用库函数时,需要 为每个线程提供一个私有的数据存储区域,以保errno变量仅仅代表本线程调用库函数的 结果,而不是表示整个进程中库函数的调用结果。如果errno是全局变量,那么某个线程读 取errno时很可能会获取到其它线程调用库函数的结果,导致程序执行错误。目前,许多系统通过在硬件上增加特殊的存储结构和特殊的指令来实现TLS。譬 如ARM中增加了 TLS寄存器,并加入了相应的协处理器指令,可以直接对TLS寄存器进行 访问,即线程的私有数据都是存储在TLS寄存器所指向的一片内存中。X86体系结构使用 LDT中的一个表项来存放线程的TLS。此外,在某些未加入特殊硬件支持的处理器中,还可以通过纯软件的方式来实现 TLS0例如在每个线程创建之初,由库函数通过操作系统提供的API为每个线程开辟一段 固定的存储空间,并由进程统一维护这些地址空间。当一个线程需要获取TLS中存放数据 的时,首先需要通过线程号索引线程私有存储空间的基地址,然后再用偏移加基地址的方 式访问私有数据。
技术实现思路
本专利技术提供了一种TLS实现方法和装置,解决了 TLS实现过程中系统内在访问压 力大和工作效率低的问题。一种TLS实现方法,包括从处理器的通用寄存器中,选择至少一个通用寄存器作为TLS寄存器;通过专用操作命令管理所述TLS寄存器。进一步的,所述专用操作命令包括写入命令(set_tls)和读取命令(get_tls),所3述写入命令用于向所述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为本专利技术的实施例的应用环境示意图;图2为本专利技术的实施例一提供的一种TLS实现方法的流程图;图3为本专利技术的实施例中寄存器使用情况示意图;图4为本专利技术的实施例二提供的一种TLS实现方法的流程图;图5为本专利技术的实施例提供的一种TLS实现装置的结构示意图6为图5中TLS管理模块的结构示意图;图7为本专利技术的又一实施例提供的一种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 (BP set_tls和get_tls),直接作用于处理器107并访问与TLS寄存器102 ;其次, 应用程序103通过库函数封装的API,并利用操作系统内核的上下文保存机制,将TLS的值 保存于线程控制块中。本专利技术的实施例一提供了一种TLS实现方法,无需添加额外的硬件TLS寄存器,利 用现有的硬件资源,为计算机系统提供了灵活、高效的线程局部数据存储机制。结合上述应用环境,使用本专利技术实施例一提供的TLS实现方法在计算机系统中实 现TLS的流程如图2所示,包括步骤201、从处理器的通用寄存器中,选择至少一个通用寄存器作为TLS寄存器;本专利技术实施例中,处理器的通用寄存器具有多种用本文档来自技高网
...

【技术保护点】
一种线程局部存储实现方法,其特征在于,包括:从处理器的通用寄存器中,选择至少一个通用寄存器作为线程局部存储(TLS)寄存器;通过专用操作命令管理所述TLS寄存器。

【技术特征摘要】

【专利技术属性】
技术研发人员:程旭管雪涛钟祺吴栋霞高海斌
申请(专利权)人:北京北大众志微系统科技有限责任公司
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1