欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種實(shí)現(xiàn)線程本地存儲(chǔ)的方法及裝置與流程

文檔序號(hào):12271043閱讀:305來(lái)源:國(guó)知局
一種實(shí)現(xiàn)線程本地存儲(chǔ)的方法及裝置與流程

本發(fā)明涉及計(jì)算機(jī)軟件技術(shù)領(lǐng)域,具體說(shuō)涉及一種實(shí)現(xiàn)線程本地存儲(chǔ)的方法及裝置。



背景技術(shù):

當(dāng)前主流的嵌入式操作系統(tǒng)基本上是采用C語(yǔ)言實(shí)現(xiàn)的多任務(wù)操作系統(tǒng),而且所有任務(wù)共享同一個(gè)地址空間。在這種系統(tǒng)中,變量或數(shù)據(jù)有2種基本的存儲(chǔ)方式:局部變量和全局變量。局部變量在函數(shù)中定義,使用時(shí)在各任務(wù)的函數(shù)調(diào)用堆棧中由編譯器自動(dòng)分配,局部變量不會(huì)再各任務(wù)間共享;而全局變量是全局的或者靜態(tài)的,所有任務(wù)訪問(wèn)的都是同一份數(shù)據(jù),如果某一個(gè)任務(wù)對(duì)其進(jìn)行了修改,也就會(huì)影響到其他所有的任務(wù),這會(huì)使得使用全局變量的函數(shù)不可重入,無(wú)法直接在多任務(wù)操作系統(tǒng)這種高度并發(fā)的環(huán)境下使用。

在嵌入式開(kāi)發(fā)領(lǐng)域經(jīng)常會(huì)使用到第三方的開(kāi)源代碼和庫(kù),這些源代碼經(jīng)常是針對(duì)Linux\Unix\Windows等具有進(jìn)程抽象的操作系統(tǒng)環(huán)境開(kāi)發(fā)的,代碼是為每一個(gè)進(jìn)程單獨(dú)編譯鏈接,存在進(jìn)程自己獨(dú)立的地址空間中,并沒(méi)有考慮到源代碼的并發(fā)訪問(wèn)問(wèn)題。

要在單一地址空間的多任務(wù)操作系統(tǒng)環(huán)境中使用這些代碼,需要新的變量實(shí)現(xiàn)機(jī)制,使得各個(gè)函數(shù)調(diào)用都能訪問(wèn)、但其它任務(wù)不能訪問(wèn)變量。業(yè)界一般稱作線程本地存儲(chǔ)(Thread Local Storage,簡(jiǎn)稱TLS)。

目前,線程本地存儲(chǔ)的實(shí)現(xiàn)方法有以下幾種:

1.靜態(tài)TLS。通過(guò)編譯器和操作系統(tǒng)共同支持。一般是在源代碼中需要使用TLS變量的地方插入特定的TLS變量聲明關(guān)鍵字(如Microsoft給Visual C++編譯器添加的__declspec(thread)關(guān)鍵字),然后擴(kuò)充編譯器,編譯時(shí)將聲明的TLS變量放到生成的目標(biāo)文件的特定的節(jié)中。在運(yùn)行時(shí),操作系統(tǒng)把帶有TLS節(jié)的程序加載到內(nèi)存中時(shí),尋找可執(zhí)行文件中的TLS節(jié),并且動(dòng)態(tài)地分配一個(gè)足夠大的內(nèi)存塊,以便存放所有的靜態(tài)TLS變量。應(yīng)用程序中的代碼每次引用其中的一個(gè)變量時(shí),就要轉(zhuǎn)換為已分配內(nèi)存塊中包含的一個(gè)內(nèi)存位置。因此,編譯器必須生成一些輔助代碼來(lái)引用該靜態(tài)TLS變量,這將使得程序變大且運(yùn)行的速度降低。

2.動(dòng)態(tài)TLS。通過(guò)專用的線程庫(kù)函數(shù)實(shí)現(xiàn)變量的動(dòng)態(tài)分配、訪問(wèn)和釋放。例如pthread線程庫(kù)可以通過(guò)pthread_key_create函數(shù)動(dòng)態(tài)創(chuàng)建TLS變量,Windows通過(guò)內(nèi)核提供接口函數(shù)TLSAlloc分配TLS變量。此種辦法的實(shí)現(xiàn)方式是為每個(gè)線程創(chuàng)建線程專享的TLS變量索引表,在線程訪問(wèn)TLS變量時(shí),通過(guò)查詢本線程的索引表獲得要訪問(wèn)的TLS變量的地址。

以上實(shí)現(xiàn)TLS的方法要么需要擴(kuò)充編譯器,要么需要提供專用的函數(shù)庫(kù),要么需要處理器做特殊的支持。在嵌入式開(kāi)發(fā)領(lǐng)域,上述實(shí)現(xiàn)TLS的方法具有很大的局限性。

因此,為了進(jìn)一步提高實(shí)現(xiàn)TLS的方法的應(yīng)用靈活性,擴(kuò)展TLS的應(yīng)用范圍,需要一種新的實(shí)現(xiàn)TLS的方法。



技術(shù)實(shí)現(xiàn)要素:

為了進(jìn)一步提高實(shí)現(xiàn)TLS的方法的應(yīng)用靈活性,擴(kuò)展TLS的應(yīng)用范圍,本發(fā)明提供了一種實(shí)現(xiàn)線程本地存儲(chǔ)的方法,將全局變量轉(zhuǎn)換為任務(wù)的線程本地存儲(chǔ)變量以實(shí)現(xiàn)線程本地存儲(chǔ),包括:

將源代碼中的所述全局變量修改為全局指針;

在操作系統(tǒng)的任務(wù)切換回調(diào)函數(shù)中增加全局指針地址切換操作;

為所述全局變量分配線程本地存儲(chǔ)任務(wù)局部存儲(chǔ)空間;

通過(guò)所述全局指針來(lái)完成對(duì)所述線程本地存儲(chǔ)變量的訪問(wèn)。

在一實(shí)施例中,將全局變量修改為全局指針,其中,將所有全局變量的類型收集到一個(gè)總的全局?jǐn)?shù)據(jù)結(jié)構(gòu)體中,并生成一個(gè)指向所述全局?jǐn)?shù)據(jù)結(jié)構(gòu)體的全局指針。

在一實(shí)施例中,對(duì)全局變量的定義進(jìn)行注釋,防止編譯器編譯時(shí)再分配靜態(tài)空間。

在一實(shí)施例中,將對(duì)全局變量的訪問(wèn),修改為通過(guò)全局指針的訪問(wèn),防止編譯器對(duì)全局變量的訪問(wèn)進(jìn)行靜態(tài)綁定。

在一實(shí)施例中,在操作系統(tǒng)的任務(wù)切換回調(diào)函數(shù)中增加所述全局指針地址切換操作,其中:

初始化時(shí),將線程本地存儲(chǔ)變量空間的指針切換函數(shù)掛接到操作系統(tǒng)系統(tǒng)中的切換回調(diào)函數(shù)中。

在一實(shí)施例中,為所述全局變量分配線程本地存儲(chǔ)任務(wù)局部存儲(chǔ)空間,其中:

所述任務(wù)在調(diào)用含有全局變量的函數(shù)前,調(diào)用線程本地存儲(chǔ)變量創(chuàng)建操作,為當(dāng)前線程分配一份所述全局變量的本地存儲(chǔ)空間。

在一實(shí)施例中,將當(dāng)前任務(wù)的任務(wù)標(biāo)識(shí)綁定到線程本地存儲(chǔ)變量本地存儲(chǔ)空間的首地址。

在一實(shí)施例中,通過(guò)所述全局指針來(lái)完成對(duì)所述線程本地存儲(chǔ)變量的訪問(wèn),其中:

在操作系統(tǒng)進(jìn)行任務(wù)切換時(shí),回調(diào)函數(shù)通過(guò)被切入任務(wù)的標(biāo)識(shí)找到其對(duì)應(yīng)的線程本地存儲(chǔ)變量本地存儲(chǔ)空間的首地址,將該地址賦值給所述全局指針。

在一實(shí)施例中,所述任務(wù)在不需要使用全局變量時(shí),調(diào)用線程本地存儲(chǔ)變量釋放操作,釋放之前分配的本地存儲(chǔ)空間。

本發(fā)明還提出了一種基于多任務(wù)操作系統(tǒng)的實(shí)現(xiàn)線程本地存儲(chǔ)的裝置,所述裝置配置為將全局變量轉(zhuǎn)換為任務(wù)的線程本地存儲(chǔ)變量以實(shí)現(xiàn)線程本地存儲(chǔ),所述裝置包括:

源程序修改單元,其配置為將源代碼中的所述全局變量修改為全局指針;

存儲(chǔ)空間分配單元,其配置為所述全局變量分配線程本地存儲(chǔ)任務(wù)局部存儲(chǔ)空間;

變量指針切換單元,其配置為在操作系統(tǒng)的任務(wù)切換回調(diào)函數(shù)中增加全局指針地址切換操作;

訪問(wèn)單元,其配置為通過(guò)所述全局指針來(lái)完成對(duì)所述線程本地存儲(chǔ)變量的訪問(wèn)。

根據(jù)本發(fā)明的方法和裝置,可以將全局變量轉(zhuǎn)換為任務(wù)的TLS變量從而實(shí)現(xiàn)TLS。本發(fā)明的方法不需要處理器、編譯器提供特殊支持,也不修改原有操作系統(tǒng),具有很高的應(yīng)用靈活度。本發(fā)明的方法大大降低了TLS的實(shí)施難度,擴(kuò)展了TLS的應(yīng)用范圍。

本發(fā)明的其它特征或優(yōu)點(diǎn)將在隨后的說(shuō)明書(shū)中闡述。并且,本發(fā)明的部分特征或優(yōu)點(diǎn)將通過(guò)說(shuō)明書(shū)而變得顯而易見(jiàn),或者通過(guò)實(shí)施本發(fā)明而被了解。本發(fā)明的目的和部分優(yōu)點(diǎn)可通過(guò)在說(shuō)明書(shū)、權(quán)利要求書(shū)以及附圖中所特別指出的步驟來(lái)實(shí)現(xiàn)或獲得。

附圖說(shuō)明

附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,并且構(gòu)成說(shuō)明書(shū)的一部分,與本發(fā)明的實(shí)施例共同用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的限制。在附圖中:

圖1是根據(jù)本發(fā)明一實(shí)施例的方法流程圖;

圖2是根據(jù)本發(fā)明一實(shí)施例的系統(tǒng)結(jié)構(gòu)簡(jiǎn)圖。

具體實(shí)施方式

以下將結(jié)合附圖及實(shí)施例來(lái)詳細(xì)說(shuō)明本發(fā)明的實(shí)施方式,借此本發(fā)明的實(shí)施人員可以充分理解本發(fā)明如何應(yīng)用技術(shù)手段來(lái)解決技術(shù)問(wèn)題,并達(dá)成技術(shù)效果的實(shí)現(xiàn)過(guò)程并依據(jù)上述實(shí)現(xiàn)過(guò)程具體實(shí)施本發(fā)明。需要說(shuō)明的是,只要不構(gòu)成沖突,本發(fā)明中的各個(gè)實(shí)施例以及各實(shí)施例中的各個(gè)特征可以相互結(jié)合,所形成的技術(shù)方案均在本發(fā)明的保護(hù)范圍之內(nèi)。

在現(xiàn)有技術(shù)環(huán)境下,實(shí)現(xiàn)TLS的方法要么需要擴(kuò)充編譯器,要么需要提供專用的函數(shù)庫(kù),要么需要處理器做特殊的支持。在嵌入式開(kāi)發(fā)領(lǐng)域,上述實(shí)現(xiàn)TLS的方法具有很大的局限性。

為了進(jìn)一步提高實(shí)現(xiàn)TLS的方法的應(yīng)用靈活性,擴(kuò)展TLS的應(yīng)用范圍,本發(fā)明的發(fā)明人首先分析了導(dǎo)致現(xiàn)有技術(shù)局限性的根本原因。

首先,在目標(biāo)機(jī)資源有限時(shí),一般不會(huì)在已有的操作系統(tǒng)上再增加一個(gè)線程庫(kù);

其次,現(xiàn)有的方法中所使用的處理器、操作系統(tǒng)和開(kāi)發(fā)工具都是根據(jù)具體的任務(wù)需求進(jìn)行專門(mén)選型,然而特定于編譯器、處理器和操作系統(tǒng)的技術(shù)往往需要對(duì)原技術(shù)進(jìn)行改動(dòng),很難通用;

再次,現(xiàn)有的方法都是針對(duì)新寫(xiě)的代碼而實(shí)施的,很難把已有代碼中的全局變量修改為T(mén)LS變量。

在把已有的全局全局變量修改為T(mén)LS變量的問(wèn)題上,有一種常用的手工做法是:將源代碼中的所有全局變量都變成函數(shù)指針參數(shù),在線程進(jìn)行函數(shù)調(diào)用前為每個(gè)全局變量分配空間,并將變量指針通過(guò)函數(shù)參數(shù)層層傳遞到需要使用了全局變量的位置。這種辦法在代碼量較少,函數(shù)調(diào)用關(guān)系簡(jiǎn)單的時(shí)候,是個(gè)簡(jiǎn)單而有效的辦法,但是一旦使用的代碼稍微復(fù)雜,全局變量一多,轉(zhuǎn)換的難度和出錯(cuò)的概率都很大,而且通過(guò)函數(shù)傳遞所有全局變量會(huì)極大的加深堆棧,影響程序效率(因?yàn)槿肿兞康闹羔樞枰獜捻攲雍瘮?shù)的棧幀一直傳遞到堆棧最底層。)

基于上述分析,本發(fā)明提出了一種實(shí)現(xiàn)TLS的方法。本發(fā)明的方法基于嵌入式多任務(wù)操作系統(tǒng)實(shí)現(xiàn),其主要操作是將全局變量轉(zhuǎn)換為任務(wù)的TLS變量。這樣,在不需要處理器、編譯器提供特殊支持,也不修改原有操作系統(tǒng)實(shí)現(xiàn)的基礎(chǔ)上實(shí)現(xiàn)TLS。從而克服現(xiàn)有技術(shù)在嵌入式開(kāi)發(fā)領(lǐng)域的不足。

具體的,在一實(shí)施例中,將全局變量轉(zhuǎn)換為任務(wù)的TLS變量的過(guò)程包括:將源代碼中的全局變量修改為全局指針;為全局變量分配線程本地存儲(chǔ)任務(wù)局部存儲(chǔ)空間;在操作系統(tǒng)的任務(wù)切換回調(diào)函數(shù)中增加全局指針地址切換操作。最后就可以通過(guò)全局指針來(lái)完成對(duì)線程本地存儲(chǔ)變量的訪問(wèn)。依照上述步驟,既可以為新代碼增加TLS支持,也可以方便的將已有代碼的全局變量修改為T(mén)LS變量,從而解決訪問(wèn)全局變量的并發(fā)問(wèn)題。

接下來(lái)基于附圖詳細(xì)描述本發(fā)明一實(shí)施例的具體執(zhí)行流程。附圖的流程圖中示出的步驟可以在包含諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行。雖然在流程圖中示出了各步驟的邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。

在本發(fā)明一實(shí)施例中,首先修改源代碼中的全局變量,將源程序中的全局變量修改為全局指針(步驟S110)。具體的,將所有全局變量的類型收集到一個(gè)總的全局?jǐn)?shù)據(jù)結(jié)構(gòu)體中,并生成一個(gè)指向該總的全局?jǐn)?shù)據(jù)結(jié)構(gòu)體的全局指針(global_tls_ptr)。

進(jìn)一步的,在一實(shí)施例中,在步驟S110中對(duì)全局變量的定義進(jìn)行注釋,防止編譯器編譯時(shí)再分配靜態(tài)空間;進(jìn)一步的,在一實(shí)施例中,對(duì)全局變量的訪問(wèn),修改為通過(guò)全局指針的訪問(wèn),防止編譯器對(duì)全局變量的訪問(wèn)進(jìn)行靜態(tài)綁定。

接下來(lái),初始化時(shí)增加指針切換操作(步驟S120)。具體的,將TLS變量空間的指針切換函數(shù)掛接到操作系統(tǒng)系統(tǒng)中的切換回調(diào)函數(shù)中。例如,在嵌入式領(lǐng)域常用的多任務(wù)操作系統(tǒng)(如VxWorks、RTEMS、μC/OS等)中,基本都提供了任務(wù)切換時(shí)的回調(diào)函數(shù)。

任務(wù)在調(diào)用含有全局變量的函數(shù)前,需要為線程分配本地存儲(chǔ)空間(步驟S130)。具體的,調(diào)用TLS變量創(chuàng)建操作,為當(dāng)前線程分配一份全局變量的本地存儲(chǔ)空間。同時(shí),將當(dāng)前任務(wù)的任務(wù)標(biāo)識(shí)(ID)綁定到TLS變量本地存儲(chǔ)空間的首地址。

進(jìn)一步的,在分配TLS任務(wù)本地存儲(chǔ)空間的過(guò)程中,TLS變量的本地存儲(chǔ)空間位置是與任務(wù)綁定的,實(shí)現(xiàn)時(shí)有3種選擇:全局靜態(tài)區(qū)、任務(wù)堆棧、任務(wù)控制塊。由于任務(wù)控制塊在已有操作系統(tǒng)的實(shí)現(xiàn)上,大小固定,不修改操作系統(tǒng)無(wú)法實(shí)現(xiàn),任務(wù)控制塊并不適合。因此在本發(fā)明一實(shí)施例中主要使用全局靜態(tài)數(shù)組或者任務(wù)堆棧。

在具體的開(kāi)發(fā)環(huán)境中,如果需要TLS變量的任務(wù)數(shù)量在運(yùn)行前就能確定,那么優(yōu)先選擇靜態(tài)區(qū),在嵌入式開(kāi)發(fā)領(lǐng)域這是很常見(jiàn)的一種情況。如果任務(wù)數(shù)量動(dòng)態(tài)變化,而且任務(wù)在退出后就TLS變量就不需要被別的程序訪問(wèn)了,那么也可以使用任務(wù)堆棧。

在操作系統(tǒng)進(jìn)行任務(wù)切換時(shí),查找線程本地存儲(chǔ)變量的本地存儲(chǔ)空間(步驟S140)。具體的,回調(diào)函數(shù)通過(guò)被切入任務(wù)的ID找到其對(duì)應(yīng)的TLS變量本地存儲(chǔ)空間的首地址,將該地址賦值給global_tls_ptr指針。因?yàn)橥ㄟ^(guò)第一步的操作,所有全局變量的使用都是通過(guò)指針進(jìn)行的,如此,通過(guò)切換指針,就能完成任務(wù)全局變量到本地存儲(chǔ)空間的轉(zhuǎn)換。

進(jìn)一步的,在本發(fā)明一實(shí)施例中,在任務(wù)切換時(shí),通過(guò)切入任務(wù)的ID查找對(duì)應(yīng)的存儲(chǔ)空間地址,通過(guò)一個(gè)hash函數(shù)對(duì)任務(wù)ID進(jìn)行hash,以提高查找速率。

此時(shí),就通過(guò)全局變量的指針來(lái)完成對(duì)TLS變量的訪問(wèn)(步驟S150)。要注意的是,不同于其余TLS變量的技術(shù)手段,需要通過(guò)特殊的API來(lái)訪問(wèn)TLS變量,本發(fā)明仍然是通過(guò)全局指針來(lái)訪問(wèn),不需要增加任何API,所以,即使不用在多任務(wù)環(huán)境,也不會(huì)影響程序的使用,具有很好的可移植性。

最后,當(dāng)任務(wù)在不需要使用全局變量時(shí),調(diào)用TLS變量釋放操作,釋放之前分配的本地存儲(chǔ)空間(步驟S160)。

根據(jù)本發(fā)明的方法,可以將全局變量轉(zhuǎn)換為任務(wù)的TLS變量從而實(shí)現(xiàn)TLS。本發(fā)明的方法不需要處理器、編譯器提供特殊支持,也不修改原有操作系統(tǒng),只需要操作系統(tǒng)提供一個(gè)任務(wù)切換回調(diào)函數(shù)接口就能實(shí)現(xiàn),對(duì)編譯器、操作系統(tǒng)的依賴很少,具有很高的應(yīng)用靈活度。

本發(fā)明的方法不需要在源代碼中使用特殊的TLS變量訪問(wèn)函數(shù),在其余操作系統(tǒng)上也能直接使用,大大降低了TLS的實(shí)施難度,擴(kuò)展了TLS的應(yīng)用范圍。進(jìn)一步的,根據(jù)本發(fā)明的方法,任務(wù)在切換TLS變量存儲(chǔ)空間時(shí),只需要修改一個(gè)指針就能完成切換操作,對(duì)原有系統(tǒng)的效率影響很小。

基于本發(fā)明的方法,本發(fā)明還提出了一種基于多任務(wù)操作系統(tǒng)的實(shí)現(xiàn)線程本地存儲(chǔ)的裝置。本發(fā)明的裝置配置為將全局變量轉(zhuǎn)換為任務(wù)的線程本地存儲(chǔ)變量以實(shí)現(xiàn)線程本地存儲(chǔ)。在一實(shí)施例中,如圖2所示,裝置200包括:

源程序修改單元220,其配置為將源代碼中的全局變量修改為全局指針;

存儲(chǔ)空間分配單元240,其配置為全局變量分配線程本地存儲(chǔ)任務(wù)局部存儲(chǔ)空間(線程本地存儲(chǔ)任務(wù)局部存儲(chǔ)空間被構(gòu)造在本地存儲(chǔ)空間202中);

變量指針切換單元230,其配置為在操作系統(tǒng)的任務(wù)切換回調(diào)函數(shù)201中增加全局指針地址切換操作;

訪問(wèn)單元210,其配置為通過(guò)全局指針來(lái)完成對(duì)線程本地存儲(chǔ)變量的訪問(wèn)。

在運(yùn)行過(guò)程中,源程序修改單元220對(duì)全局變量的定義進(jìn)行注釋,防止編譯器編譯時(shí)再分配靜態(tài)空間;并且將對(duì)全局變量的訪問(wèn),修改為通過(guò)全局指針的訪問(wèn),防止編譯器對(duì)全局變量的訪問(wèn)進(jìn)行靜態(tài)綁定;同時(shí),將所有全局變量的類型收集到一個(gè)總的全局?jǐn)?shù)據(jù)結(jié)構(gòu)體中,并生成一個(gè)指向全局?jǐn)?shù)據(jù)結(jié)構(gòu)體的全局指針。

初始化時(shí),變量指針切換單元230將線程本地存儲(chǔ)變量空間的指針切換函數(shù)掛接到操作系統(tǒng)系統(tǒng)中的切換回調(diào)函數(shù)中。

在任務(wù)在調(diào)用含有全局變量的函數(shù)前,存儲(chǔ)空間分配單元240調(diào)用線程本地存儲(chǔ)變量創(chuàng)建操作,為當(dāng)前線程分配一份全局變量的本地存儲(chǔ)空間(在本地存儲(chǔ)空間202中構(gòu)造線程本地存儲(chǔ)任務(wù)局部存儲(chǔ)空間)。同時(shí),存儲(chǔ)空間分配單元240構(gòu)造任務(wù)ID與TLS任務(wù)本地存儲(chǔ)空間地址的索引表。將當(dāng)前任務(wù)的任務(wù)標(biāo)識(shí)綁定到線程本地存儲(chǔ)變量本地存儲(chǔ)空間的首地址。

這樣,在操作系統(tǒng)進(jìn)行任務(wù)切換時(shí),回調(diào)函數(shù)通過(guò)被切入任務(wù)的標(biāo)識(shí)找到其對(duì)應(yīng)的線程本地存儲(chǔ)變量本地存儲(chǔ)空間的首地址,將該地址賦值給所述全局指針。從而使得訪問(wèn)單元210可以通過(guò)全局指針(基于任務(wù)ID與TLS任務(wù)本地存儲(chǔ)空間地址的索引表)來(lái)完成對(duì)線程本地存儲(chǔ)變量的訪問(wèn)。

最后,裝置200還包含釋放單元250。任務(wù)在不需要使用全局變量時(shí),釋放單元250調(diào)用線程本地存儲(chǔ)變量釋放操作,釋放之前分配的本地存儲(chǔ)空間。

接下來(lái)通過(guò)一個(gè)具體的應(yīng)用實(shí)例對(duì)本發(fā)明一實(shí)施例的方法以及裝置執(zhí)行流程做進(jìn)一步的描述(該應(yīng)用實(shí)例以圖2所示的裝置結(jié)構(gòu)為基礎(chǔ))。

A)源程序修改單元220完成源代碼的預(yù)處理,將全局變量修改為全局指針。

具體的,取源程序中的2個(gè)全局變量為例:

通過(guò)第一步修改全局變量為全局指針后,將產(chǎn)生如下的代碼:

其中的全局變量id和desc_cr的定義被注釋掉,新生成了一個(gè)包含所有全局變量類型的結(jié)構(gòu)體struct task_tls_space,id和desc_cr的訪問(wèn)函數(shù)被替換為global_tls_ptr->id和global_tls_ptr->desc_cr.cmd。由于這種變換是很有規(guī)律性的,因此在本發(fā)明一實(shí)施例中,可以通過(guò)手工或者預(yù)處理器方便的實(shí)現(xiàn)。

這樣就可以構(gòu)造出TLS全局變量指針。所有的全局變量都通過(guò)指針尋址。

如例中的全局指針就是:

Struct task_tls_space*global_tls_ptr;

B)存儲(chǔ)空間分配單元240分配TLS任務(wù)本地存儲(chǔ)空間。

在本實(shí)施例中,使用靜態(tài)數(shù)組存儲(chǔ)TLS變量地址空間,實(shí)現(xiàn)如下:

Struct task_tls_space task_tls_index[MAX_TASK_SUPPORTED];

進(jìn)一步的,為了分配TLS任務(wù)本地存儲(chǔ)空間,存儲(chǔ)空間分配單元240包含TLS任務(wù)本地存儲(chǔ)空間的申請(qǐng)函數(shù)。任務(wù)在調(diào)用含有全局變量的函數(shù)前,調(diào)用void task_tls_space_create(int taskid);函數(shù)為T(mén)LS變量創(chuàng)建操作,為當(dāng)前線程分配一份全局變量的本地存儲(chǔ)空間。

進(jìn)一步的,為了通過(guò)全局指針來(lái)完成對(duì)線程本地存儲(chǔ)變量的訪問(wèn)還要構(gòu)造任務(wù)ID與TLS任務(wù)本地存儲(chǔ)空間地址的索引表。具體的,在本實(shí)施例中,使用靜態(tài)數(shù)組存儲(chǔ)TLS變量地址空間,實(shí)現(xiàn)如下:

struct task_tls_space task_tls_index[MAX_TASK_SUPPORTED];

C)變量指針切換單元230增加全局指針地址切換操作,切換TLS變量指針。具體包括:

int task_tls_space_hook_Init(void);

void task_tls_space_swap_hook(int oldtaskid,int newtaskid);

初始化時(shí),變量指針切換單元230通過(guò)調(diào)用函數(shù)int task_tls_space_hook_Init(void);將TLS變量空間的指針切換函數(shù)task_tls_space_swap_hook掛接到操作系統(tǒng)系統(tǒng)中的切換回調(diào)函數(shù)中。

D)在操作系統(tǒng)進(jìn)行任務(wù)切換時(shí),

調(diào)用void task_tls_space_swap_hook(int oldtaskid,int newtaskid);

通過(guò)newtaskid作為索引在task_tls_index中查找將要切入的任務(wù)的taskid,然后將global_tls_ptr賦值為數(shù)組中對(duì)應(yīng)位置的struct task_tls_space指針。

這樣,訪問(wèn)單元200就可以通過(guò)全局指針來(lái)完成對(duì)線程本地存儲(chǔ)變量的訪問(wèn)。

E)最后,釋放單元250包含TLS任務(wù)本地存儲(chǔ)空間的釋放函數(shù)。具體的,在本實(shí)施例中,當(dāng)不再使用本地存儲(chǔ)空間時(shí),釋放單元250調(diào)用

void task_tls_space_destroy(int taskid);

函數(shù)銷(xiāo)毀TLS變量的存儲(chǔ)空間。

進(jìn)一步的,本技術(shù)既可以用在新寫(xiě)代碼中,也可以用在已有的代碼中,使得可以支持TLS變量存儲(chǔ)。如果將本發(fā)明的方法應(yīng)用在將已有代碼轉(zhuǎn)化為支持TLS的代碼,需要將源代碼中的全局變量轉(zhuǎn)換為全局指針。在本發(fā)明一實(shí)施例中,實(shí)現(xiàn)代碼轉(zhuǎn)換時(shí)有2種選擇:手工轉(zhuǎn)換以及代碼預(yù)處理。

如果代碼量和全局變量都比較少,手工使用字符串搜索/替換就能方便的完成轉(zhuǎn)換。

如果代碼量和全局變量多比較多,則使用一個(gè)代碼預(yù)處理器。代碼預(yù)處理器實(shí)現(xiàn)為一個(gè)簡(jiǎn)單的C語(yǔ)言語(yǔ)法分析器,因?yàn)橹恍枰R(shí)別出C代碼中的全局變量的定義和訪問(wèn),該預(yù)處理器比一個(gè)完整的C語(yǔ)法分析器要簡(jiǎn)單的多。主要實(shí)現(xiàn)步驟是:掃描源代碼,找到全局變量,如果是變量的定義語(yǔ)句,則收集全局變量的定義結(jié)構(gòu),注釋掉已有的全局變量定義防止編譯器為全局變量分配內(nèi)存;如果是全局變量的使用語(yǔ)句,則將變量的訪問(wèn)結(jié)構(gòu)修改為一個(gè)全局指針的訪問(wèn)結(jié)果。最后根據(jù)收集到的所有全局變量定義,生成一個(gè)總的全局?jǐn)?shù)據(jù)結(jié)構(gòu)體,包含所有源代碼中的全局變量定義,并生成一個(gè)指向該全局?jǐn)?shù)據(jù)結(jié)構(gòu)體的全局指針。這個(gè)指針就是任務(wù)切換是需要根據(jù)被切入的任務(wù)修改的唯一的數(shù)據(jù)。

進(jìn)一步的,在本發(fā)明一實(shí)施例中,將全局變量轉(zhuǎn)換為全局指針時(shí),有2種選擇:

一是為每個(gè)全局變量使用一個(gè)全局指針。這樣在訪問(wèn)全局變量時(shí),通過(guò)對(duì)應(yīng)的全局指針進(jìn)行一次跳轉(zhuǎn)就能找到變量地址。但是任務(wù)切換時(shí)必須為每個(gè)全局指針重新賦值為新任務(wù)的TLS變量地址,會(huì)降低任務(wù)切換時(shí)間。因此如果全局變量少,任務(wù)切換不頻繁,切換時(shí)間要求不苛刻,可以使用這種辦法。

二是為所有全局變量使用一個(gè)全局指針。這樣在訪問(wèn)全局變量時(shí),通過(guò)對(duì)應(yīng)的全局指針進(jìn)行一次跳轉(zhuǎn)就能找到變量地址。但是任務(wù)切換時(shí)只需要為這一個(gè)全局指針重新賦值為新任務(wù)的TLS變量本地存儲(chǔ)空間的首地址即可。如果任務(wù)切換頻繁,切換時(shí)間要求苛刻,可以使用這種辦法。在很多嵌入式開(kāi)發(fā)環(huán)境里,這種選擇更可取。

綜上,根據(jù)本發(fā)明的方法和裝置,可以將全局變量轉(zhuǎn)換為任務(wù)的TLS變量從而實(shí)現(xiàn)TLS。本發(fā)明的方法不需要處理器、編譯器提供特殊支持,也不修改原有操作系統(tǒng),具有很高的應(yīng)用靈活度。本發(fā)明的方法大大降低了TLS的實(shí)施難度,擴(kuò)展了TLS的應(yīng)用范圍。

雖然本發(fā)明所公開(kāi)的實(shí)施方式如上,但所述的內(nèi)容只是為了便于理解本發(fā)明而采用的實(shí)施方式,并非用以限定本發(fā)明。本發(fā)明所述的方法還可有其他多種實(shí)施例。在不背離本發(fā)明實(shí)質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變或變形,但這些相應(yīng)的改變或變形都應(yīng)屬于本發(fā)明的權(quán)利要求的保護(hù)范圍。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
西和县| 锡林浩特市| 双鸭山市| 文昌市| 依兰县| 新蔡县| 华阴市| 乐亭县| 永仁县| 西林县| 岐山县| 上高县| 长海县| 房产| 南江县| 新建县| 高雄市| 麻江县| 新田县| 新龙县| 新余市| 兴文县| 西吉县| 梨树县| 林甸县| 灌阳县| 兴山县| 上虞市| 永新县| 辽源市| 平顺县| 塘沽区| 千阳县| 黎川县| 丰台区| 台山市| 土默特右旗| 视频| 房山区| 锡林浩特市| 礼泉县|