一种实现线程本地存储的方法及装置制造方法及图纸

技术编号:14707278 阅读:141 留言:0更新日期:2017-02-25 18:34
本发明专利技术公开了一种实现线程本地存储的方法及装置。本发明专利技术的方法将全局变量转换为任务的线程本地存储变量以实现线程本地存储,包括:将源代码中的所述全局变量修改为全局指针;在操作系统的任务切换回调函数中增加全局指针地址切换操作;为所述全局变量分配线程本地存储任务局部存储空间;通过所述全局指针来完成对所述线程本地存储变量的访问。根据本发明专利技术的方法和装置,可以将全局变量转换为任务的TLS变量从而实现TLS。本发明专利技术的方法不需要处理器、编译器提供特殊支持,也不修改原有操作系统,具有很高的应用灵活度。本发明专利技术的方法大大降低了TLS的实施难度,扩展了TLS的应用范围。

【技术实现步骤摘要】

本专利技术涉及计算机软件
,具体说涉及一种实现线程本地存储的方法及装置
技术介绍
当前主流的嵌入式操作系统基本上是采用C语言实现的多任务操作系统,而且所有任务共享同一个地址空间。在这种系统中,变量或数据有2种基本的存储方式:局部变量和全局变量。局部变量在函数中定义,使用时在各任务的函数调用堆栈中由编译器自动分配,局部变量不会再各任务间共享;而全局变量是全局的或者静态的,所有任务访问的都是同一份数据,如果某一个任务对其进行了修改,也就会影响到其他所有的任务,这会使得使用全局变量的函数不可重入,无法直接在多任务操作系统这种高度并发的环境下使用。在嵌入式开发领域经常会使用到第三方的开源代码和库,这些源代码经常是针对Linux\\Unix\\Windows等具有进程抽象的操作系统环境开发的,代码是为每一个进程单独编译链接,存在进程自己独立的地址空间中,并没有考虑到源代码的并发访问问题。要在单一地址空间的多任务操作系统环境中使用这些代码,需要新的变量实现机制,使得各个函数调用都能访问、但其它任务不能访问变量。业界一般称作线程本地存储(ThreadLocalStorage,简称TLS)。目前,线程本地存储的实现方法有以下几种:1.静态TLS。通过编译器和操作系统共同支持。一般是在源代码中需要使用TLS变量的地方插入特定的TLS变量声明关键字(如Microsoft给VisualC++编译器添加的__declspec(thread)关键字),然后扩充编译器,编译时将声明的TLS变量放到生成的目标文件的特定的节中。在运行时,操作系统把带有TLS节的程序加载到内存中时,寻找可执行文件中的TLS节,并且动态地分配一个足够大的内存块,以便存放所有的静态TLS变量。应用程序中的代码每次引用其中的一个变量时,就要转换为已分配内存块中包含的一个内存位置。因此,编译器必须生成一些辅助代码来引用该静态TLS变量,这将使得程序变大且运行的速度降低。2.动态TLS。通过专用的线程库函数实现变量的动态分配、访问和释放。例如pthread线程库可以通过pthread_key_create函数动态创建TLS变量,Windows通过内核提供接口函数TLSAlloc分配TLS变量。此种办法的实现方式是为每个线程创建线程专享的TLS变量索引表,在线程访问TLS变量时,通过查询本线程的索引表获得要访问的TLS变量的地址。以上实现TLS的方法要么需要扩充编译器,要么需要提供专用的函数库,要么需要处理器做特殊的支持。在嵌入式开发领域,上述实现TLS的方法具有很大的局限性。因此,为了进一步提高实现TLS的方法的应用灵活性,扩展TLS的应用范围,需要一种新的实现TLS的方法。
技术实现思路
为了进一步提高实现TLS的方法的应用灵活性,扩展TLS的应用范围,本专利技术提供了一种实现线程本地存储的方法,将全局变量转换为任务的线程本地存储变量以实现线程本地存储,包括:将源代码中的所述全局变量修改为全局指针;在操作系统的任务切换回调函数中增加全局指针地址切换操作;为所述全局变量分配线程本地存储任务局部存储空间;通过所述全局指针来完成对所述线程本地存储变量的访问。在一实施例中,将全局变量修改为全局指针,其中,将所有全局变量的类型收集到一个总的全局数据结构体中,并生成一个指向所述全局数据结构体的全局指针。在一实施例中,对全局变量的定义进行注释,防止编译器编译时再分配静态空间。在一实施例中,将对全局变量的访问,修改为通过全局指针的访问,防止编译器对全局变量的访问进行静态绑定。在一实施例中,在操作系统的任务切换回调函数中增加所述全局指针地址切换操作,其中:初始化时,将线程本地存储变量空间的指针切换函数挂接到操作系统系统中的切换回调函数中。在一实施例中,为所述全局变量分配线程本地存储任务局部存储空间,其中:所述任务在调用含有全局变量的函数前,调用线程本地存储变量创建操作,为当前线程分配一份所述全局变量的本地存储空间。在一实施例中,将当前任务的任务标识绑定到线程本地存储变量本地存储空间的首地址。在一实施例中,通过所述全局指针来完成对所述线程本地存储变量的访问,其中:在操作系统进行任务切换时,回调函数通过被切入任务的标识找到其对应的线程本地存储变量本地存储空间的首地址,将该地址赋值给所述全局指针。在一实施例中,所述任务在不需要使用全局变量时,调用线程本地存储变量释放操作,释放之前分配的本地存储空间。本专利技术还提出了一种基于多任务操作系统的实现线程本地存储的装置,所述装置配置为将全局变量转换为任务的线程本地存储变量以实现线程本地存储,所述装置包括:源程序修改单元,其配置为将源代码中的所述全局变量修改为全局指针;存储空间分配单元,其配置为所述全局变量分配线程本地存储任务局部存储空间;变量指针切换单元,其配置为在操作系统的任务切换回调函数中增加全局指针地址切换操作;访问单元,其配置为通过所述全局指针来完成对所述线程本地存储变量的访问。根据本专利技术的方法和装置,可以将全局变量转换为任务的TLS变量从而实现TLS。本专利技术的方法不需要处理器、编译器提供特殊支持,也不修改原有操作系统,具有很高的应用灵活度。本专利技术的方法大大降低了TLS的实施难度,扩展了TLS的应用范围。本专利技术的其它特征或优点将在随后的说明书中阐述。并且,本专利技术的部分特征或优点将通过说明书而变得显而易见,或者通过实施本专利技术而被了解。本专利技术的目的和部分优点可通过在说明书、权利要求书以及附图中所特别指出的步骤来实现或获得。附图说明附图用来提供对本专利技术的进一步理解,并且构成说明书的一部分,与本专利技术的实施例共同用于解释本专利技术,并不构成对本专利技术的限制。在附图中:图1是根据本专利技术一实施例的方法流程图;图2是根据本专利技术一实施例的系统结构简图。具体实施方式以下将结合附图及实施例来详细说明本专利技术的实施方式,借此本专利技术的实施人员可以充分理解本专利技术如何应用技术手段来解决技术问题,并达成技术效果的实现过程并依据上述实现过程具体实施本专利技术。需要说明的是,只要不构成冲突,本专利技术中的各个实施例以及各实施例中的各个特征可以相互结合,所形成的技术方案均在本专利技术的保护范围之内。在现有技术环境下,实现TLS的方法要么需要扩充编译器,要么需要提供专用的函数库,要么需要处理器做特殊的支持。在嵌入式开发领域,上述实现TLS的方法具有很大的局限性。为了进一步提高实现TLS的方法的应用灵活性,扩展TLS的应用范围,本专利技术的专利技术人首先分析了导致现有技术局限性的根本原因。首先,在目标机资源有限时,一般不会在已有的操作系统上再增加一个线程库;其次,现有的方法中所使用的处理器、操作系统和开发工具都是根据具体的任务需求进行专门选型,然而特定于编译器、处理器和操作系统的技术往往需要对原技术进行改动,很难通用;再次,现有的方法都是针对新写的代码而实施的,很难把已有代码中的全局变量修改为TLS变量。在把已有的全局全局变量修改为TLS变量的问题上,有一种常用的手工做法是:将源代码中的所有全局变量都变成函数指针参数,在线程进行函数调用前为每个全局变量分配空间,并将变量指针通过函数参数层层传递到需要使用了全局变量的位置。这种办法在代码量较少,函数调用关系简单的时候,是个简单而有效的办法,但是本文档来自技高网
...
一种实现线程本地存储的方法及装置

【技术保护点】
一种实现线程本地存储的方法,其特征在于,将全局变量转换为任务的线程本地存储变量以实现线程本地存储,包括:将源代码中的所述全局变量修改为全局指针;在操作系统的任务切换回调函数中增加全局指针地址切换操作;为所述全局变量分配线程本地存储任务局部存储空间;通过所述全局指针来完成对所述线程本地存储变量的访问。

【技术特征摘要】
1.一种实现线程本地存储的方法,其特征在于,将全局变量转换为任务的线程本地存储变量以实现线程本地存储,包括:将源代码中的所述全局变量修改为全局指针;在操作系统的任务切换回调函数中增加全局指针地址切换操作;为所述全局变量分配线程本地存储任务局部存储空间;通过所述全局指针来完成对所述线程本地存储变量的访问。2.根据权利要求1所述的方法,其特征在于,将全局变量修改为全局指针,其中,将所有全局变量的类型收集到一个总的全局数据结构体中,并生成一个指向所述全局数据结构体的全局指针。3.根据权利要求2所述的方法,其特征在于,对全局变量的定义进行注释,防止编译器编译时再分配静态空间。4.根据权利要求2或3所述的方法,其特征在于,将对全局变量的访问,修改为通过全局指针的访问,防止编译器对全局变量的访问进行静态绑定。5.根据权利要求1-4中任一项所述的方法,其特征在于,在操作系统的任务切换回调函数中增加所述全局指针地址切换操作,其中:初始化时,将线程本地存储变量空间的指针切换函数挂接到操作系统系统中的切换回调函数中。6.根据权利要求5所述的方法,其特征在于,为所述全局变量分配线程本地存储任务局部存储空间,其中:所述...

【专利技术属性】
技术研发人员:邝坚刘健培卞佳丽
申请(专利权)人:北京邮电大学
类型:发明
国别省市:北京;11

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

1