[發(fā)明專利]一種無鎖化內(nèi)存申請(qǐng)釋放方法有效
| 申請(qǐng)?zhí)枺?/td> | 201310336094.5 | 申請(qǐng)日: | 2013-08-05 |
| 公開(公告)號(hào): | CN103399825A | 公開(公告)日: | 2013-11-20 |
| 發(fā)明(設(shè)計(jì))人: | 趙暢 | 申請(qǐng)(專利權(quán))人: | 武漢郵電科學(xué)研究院 |
| 主分類號(hào): | G06F12/08 | 分類號(hào): | G06F12/08 |
| 代理公司: | 武漢科皓知識(shí)產(chǎn)權(quán)代理事務(wù)所(特殊普通合伙) 42222 | 代理人: | 嚴(yán)彥 |
| 地址: | 430074 湖*** | 國省代碼: | 湖北;42 |
| 權(quán)利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關(guān)鍵詞: | 一種 無鎖化 內(nèi)存 申請(qǐng) 釋放 方法 | ||
技術(shù)領(lǐng)域
本發(fā)明涉及嵌入式系統(tǒng)技術(shù)領(lǐng)域,尤其是涉及多線程系統(tǒng)的內(nèi)存申請(qǐng)釋放方法。
背景技術(shù)
嵌入式系統(tǒng)往往使用多線程來完成不同的任務(wù),而線程間相互聯(lián)系,使用消息互相通信。通過使用共享內(nèi)存,線程間的通信,目的線程可以直接讀取源線程的消息而不需要拷貝。但是這導(dǎo)致申請(qǐng)和釋放消息使用的內(nèi)存時(shí)需要使用互斥鎖,影響效率。目前申請(qǐng)和釋放堆內(nèi)存的方法一般有兩種,一種是直接調(diào)用通用函數(shù)庫(glibc)的內(nèi)存申請(qǐng)接口(ptmalloc)和釋放接口(free),另外一種是建立自己的內(nèi)存池進(jìn)行管理。
通用函數(shù)庫(glibc)申請(qǐng)和釋放內(nèi)存的邏輯非常復(fù)雜,包括了內(nèi)存塊的分割與合并,歸還到系統(tǒng)還是保留等等。但是可以發(fā)現(xiàn)其主要的耗時(shí)花費(fèi)在鎖的使用上:
內(nèi)存申請(qǐng)的第一步就是獲取分配區(qū)的鎖,如果加鎖成功,使用該分配區(qū)分配內(nèi)存。否則,該線程搜索分配區(qū)循環(huán)鏈表試圖獲得一個(gè)沒有加鎖的分配區(qū)。當(dāng)然,如果系統(tǒng)沒有空閑的分配區(qū)了,申請(qǐng)的線程只能等待。釋放函數(shù)首先需要獲取內(nèi)存塊所屬的分配區(qū)的鎖,來保證線程安全。
如果系統(tǒng)只有單個(gè)線程,那么分配區(qū)長(zhǎng)期被一個(gè)線程占據(jù),不存在鎖的開銷。但是如果是多線程的情況下,內(nèi)存塊往往承載著消息,由一個(gè)線程申請(qǐng),而由另一個(gè)線程歸還。分配區(qū)可能被申請(qǐng)線程占據(jù),而歸還線程則只能等待。所以在系統(tǒng)測(cè)試時(shí),往往發(fā)現(xiàn)調(diào)用內(nèi)存釋放接口(free)的時(shí)間往往比調(diào)用內(nèi)存申請(qǐng)接口(malloc)的時(shí)間花得還要長(zhǎng)。
理論上講,內(nèi)存池的管理方法會(huì)節(jié)省內(nèi)存申請(qǐng)釋放時(shí)間,因?yàn)樗枰膬?nèi)存都被事先申請(qǐng),釋放只是歸還到內(nèi)存池而不歸還給系統(tǒng)。這時(shí),鎖的開銷更加首當(dāng)其沖的成為了內(nèi)存分配與釋放的首要開銷。且不說多線程競(jìng)爭(zhēng)獲取全局共享內(nèi)存池的鎖,即使為每個(gè)線程定義了獨(dú)立的緩存池,鎖的開銷也是無法避免。多線程系統(tǒng)環(huán)境下,內(nèi)存的使用往往是由一個(gè)線程申請(qǐng),將內(nèi)存填上內(nèi)容后,作為消息發(fā)送給另一個(gè)線程。當(dāng)另一個(gè)線程歸還內(nèi)存到原線程的緩存時(shí),不可避免的與消息源線程搶緩存區(qū)的鎖。
綜上所述,目前多線程系統(tǒng)的內(nèi)存申請(qǐng)釋放優(yōu)化的方向主要是減少和避免鎖的開銷。
發(fā)明內(nèi)容
本發(fā)明提出了一種內(nèi)存申請(qǐng)和釋放的技術(shù)方案,其目的在于避免內(nèi)存申請(qǐng)和釋放時(shí)對(duì)鎖的開銷,縮短申請(qǐng)和釋放釋放時(shí)間。
本發(fā)明的技術(shù)方案為一種無鎖化內(nèi)存申請(qǐng)釋放方法,每個(gè)線程單獨(dú)占有一塊內(nèi)存池作為緩存,所有從該緩存中申請(qǐng)的內(nèi)存塊,最終釋放回該緩存;
進(jìn)行內(nèi)存申請(qǐng)時(shí),申請(qǐng)線程從緩存獲取一塊內(nèi)存,并在分配好的內(nèi)存塊上標(biāo)記申請(qǐng)線程的線程號(hào),申請(qǐng)完成;?
內(nèi)存塊使用完畢時(shí),釋放線程查看內(nèi)存塊標(biāo)記的申請(qǐng)線程的線程號(hào),如果是自己申請(qǐng)的,歸還內(nèi)存塊到緩存,釋放完成;否則通過比較并替換,掛載內(nèi)存塊到申請(qǐng)線程的單向鏈表,釋放完成。
而且,每當(dāng)任務(wù)發(fā)送消息或者接收到消息時(shí),申請(qǐng)線程進(jìn)行周期性檢測(cè),將單向鏈表上每一個(gè)內(nèi)存塊歸還到緩存。
而且,單向鏈表采用“后地址”記錄下一節(jié)點(diǎn)的地址,而尾節(jié)點(diǎn)的“后地址”置為空;所述通過比較并替換,掛載內(nèi)存塊到申請(qǐng)線程的單向鏈表,實(shí)現(xiàn)方式包括如下步驟,
步驟3.1,將單向鏈表頭的“后地址”所存的地址拷貝到一個(gè)本地地址變量;
步驟3.2,將本地地址變量拷貝到要掛載的內(nèi)存塊的“后地址”;
步驟3.3,讀取單向鏈表頭的“后地址”,當(dāng)且僅當(dāng)單向鏈表頭的“后地址”等于本地地址變量時(shí),將單向鏈表頭的“后地址”賦值為將要掛載的內(nèi)存塊地址使單向鏈表頭指向了要掛載的內(nèi)存塊;否則回到步驟3.1。
而且,每次進(jìn)行周期性檢測(cè),將單向鏈表上每一個(gè)內(nèi)存塊歸還到緩存的實(shí)現(xiàn)方式如下,
將單向鏈表頭與本地的空鏈表頭替換,從單向鏈表頭開始輪尋單向鏈表,將每一個(gè)內(nèi)存塊歸還到緩存,輪尋完畢時(shí)檢測(cè)完畢。
本發(fā)明所提供一種用于多線程嵌入式系統(tǒng)的無鎖化內(nèi)存申請(qǐng)釋放方法的創(chuàng)新點(diǎn)在于:
1.????將原先共享區(qū)域由分配區(qū)/緩存雙向鏈表轉(zhuǎn)移到了線程的一條單向鏈表,而分配區(qū)/緩存鏈表轉(zhuǎn)變?yōu)榫€程獨(dú)享,這樣直接避免了緩存區(qū)或者內(nèi)存分配區(qū)的鎖的沖突。;
2.????因?yàn)楣蚕韰^(qū)域簡(jiǎn)單化為單向鏈表,利用比較并替換(CAS)和替換兩個(gè)原子操作代替了互斥鎖;
3.????基于嵌入式系統(tǒng)線程的周期性,利用實(shí)時(shí)性任務(wù)周期性處理消息,在處理消息結(jié)束時(shí)觸發(fā)檢測(cè),歸還單向鏈表里的內(nèi)存。
附圖說明
圖1為本發(fā)明實(shí)施例中線程掛載的鏈表結(jié)構(gòu)圖;
圖2為本發(fā)明實(shí)施例中內(nèi)存塊狀態(tài)變化圖;
該專利技術(shù)資料僅供研究查看技術(shù)是否侵權(quán)等信息,商用須獲得專利權(quán)人授權(quán)。該專利全部權(quán)利屬于武漢郵電科學(xué)研究院,未經(jīng)武漢郵電科學(xué)研究院許可,擅自商用是侵權(quán)行為。如果您想購買此專利、獲得商業(yè)授權(quán)和技術(shù)合作,請(qǐng)聯(lián)系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201310336094.5/2.html,轉(zhuǎn)載請(qǐng)聲明來源鉆瓜專利網(wǎng)。
- 同類專利
- 專利分類





