亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種數(shù)據(jù)庫中自旋鎖的實(shí)現(xiàn)方法

文檔序號(hào):6355947閱讀:219來源:國知局
專利名稱:一種數(shù)據(jù)庫中自旋鎖的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域
本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,尤其涉及到并發(fā)控制過程中對(duì)自旋鎖的改進(jìn)實(shí)現(xiàn) 方法。
背景技術(shù)
在基于鎖的事務(wù)并發(fā)控制技術(shù)中,數(shù)據(jù)庫經(jīng)常使用自旋鎖來保護(hù)數(shù)據(jù)結(jié)構(gòu)及在其 上的操作。自旋鎖開銷極小,但是自旋鎖只能保護(hù)數(shù)據(jù)結(jié)構(gòu)的輕量訪問,在自旋鎖保護(hù)期 間,不能有系統(tǒng)調(diào)用或系統(tǒng)中斷,保護(hù)的時(shí)間非常短,一般只為幾十個(gè)處理器周期。因?yàn)樽?旋鎖原理簡(jiǎn)單,死鎖的解決方法也很簡(jiǎn)單,通常采用固定時(shí)長(zhǎng)的計(jì)時(shí)器對(duì)任務(wù)計(jì)時(shí),一旦任 務(wù)的計(jì)時(shí)時(shí)間到,緊接著的后續(xù)任務(wù)將直接自動(dòng)解鎖。正是因?yàn)檫@個(gè)原理,當(dāng)存在多個(gè)任務(wù) 競(jìng)爭(zhēng)某一個(gè)自旋鎖時(shí),如果鎖超時(shí),則多個(gè)任務(wù)將同時(shí)認(rèn)為鎖超時(shí),并各自對(duì)該自旋鎖進(jìn)行 解鎖并試圖加鎖,導(dǎo)致多個(gè)任務(wù)對(duì)同一個(gè)自旋鎖加鎖從而出現(xiàn)死鎖的情況。由于存在該問 題,導(dǎo)致自旋鎖無法適應(yīng)更加復(fù)雜的應(yīng)用場(chǎng)景。

發(fā)明內(nèi)容
為了擴(kuò)展自旋鎖的適用范圍,允許任務(wù)在持鎖期間進(jìn)行較復(fù)雜、執(zhí)行時(shí)間較為彈 性的操作,本發(fā)明提供一種改進(jìn)的自旋鎖加鎖和死鎖判決方法。本發(fā)明的技術(shù)方案為
一種數(shù)據(jù)庫中自旋鎖的實(shí)現(xiàn)方法,其特征在于,在共享內(nèi)存中存儲(chǔ)兩個(gè)全局變量,一個(gè) 是自旋鎖變量,另一個(gè)是ID變量,即用于產(chǎn)生ID值的變量,所有要使用此自旋鎖的線程均 要訪問這兩個(gè)變量,系統(tǒng)初始化時(shí)兩個(gè)變量被初始化為0。在加鎖操作時(shí),按如下步驟
步驟101,用原子操作讀取ID變量中的值并將其值加1 ;
步驟102,將第101步中獲取的ID值與加鎖后的狀態(tài)值合成一個(gè)自旋鎖變量值N,合成 方法是低位存儲(chǔ)鎖變量狀態(tài),高位存儲(chǔ)ID值;
步驟103,以原子操作訪問自旋鎖變量,嘗試加鎖操作;
步驟104,若自旋鎖狀態(tài)為未占用,則加鎖成功,將步驟102合成的鎖變量值以原子操 作存入自旋鎖變量,對(duì)自旋鎖變量的訪問和將值存于自旋鎖變量是原子的;
步驟105,若自旋鎖狀態(tài)為已占用,加鎖不成功則進(jìn)入死鎖判決流程,如果未出現(xiàn)死鎖, 則處理器自旋等待,轉(zhuǎn)入步驟103進(jìn)行加鎖嘗試;如果判斷出現(xiàn)死鎖;則轉(zhuǎn)入步驟106解自 旋鎖,并重新轉(zhuǎn)入步驟103。當(dāng)加鎖過程中需要判定是否發(fā)生死鎖時(shí),按如下步驟
步驟201,將自旋鎖變量的高位ID值存儲(chǔ)于線程的一個(gè)臨時(shí)變量中,記為L(zhǎng)hold ; 步驟202,將分配給此線程的ID值與自旋鎖變量已加鎖狀態(tài)值合成一個(gè)新自旋鎖變量 值N ;合成方法如下新值N低位存儲(chǔ)鎖變量狀態(tài),高位存儲(chǔ)ID值; 步驟203,原子操作探測(cè)自旋鎖變量狀態(tài)值,判斷是否可以加鎖;步驟204,如果自旋鎖可以加鎖,則將值N存于自旋鎖變量,其中對(duì)自旋鎖變量的探測(cè) 和存儲(chǔ)是原子的,自旋鎖加鎖成功并返回;
步驟205,如果自旋鎖不能被加鎖,處理器空轉(zhuǎn)一次;對(duì)空轉(zhuǎn)次數(shù)累加計(jì)數(shù); 步驟206,如果空轉(zhuǎn)次數(shù)不超過設(shè)定閾值,則轉(zhuǎn)入步驟203 ;否則轉(zhuǎn)入步驟207 ; 步驟207,對(duì)休眠次數(shù)累計(jì)加1,判斷休眠次數(shù)是否超過設(shè)定閾值,如果超過設(shè)定閾值 則轉(zhuǎn)入步驟208 ;否則轉(zhuǎn)入步驟211 ;
步驟208,將LHold與自旋鎖加鎖后狀態(tài)值合成一個(gè)新自旋鎖變量值Y,合成方法如下 Y的低位存儲(chǔ)加鎖后狀態(tài)值,高位存儲(chǔ)LHold值;
步驟209,原子操作比較自旋鎖變量值與Y值是否相等,如果相等,則判定自旋鎖死鎖, 并將自旋鎖解鎖,其中判定鎖變量值與Y值相等的操作與自旋鎖解鎖的操作是原子的;
步驟210,重新獲取自旋鎖變量的高位ID值,存儲(chǔ)于LhW,并將休眠計(jì)數(shù)清零,線程休 眠一段隨機(jī)時(shí)間,轉(zhuǎn)入步驟211 ;
步驟211,線程休眠一次,休眠一段隨機(jī)時(shí)間,隨機(jī)時(shí)間在1毫秒到1秒之間,并將空轉(zhuǎn) 次數(shù)計(jì)數(shù)清零。本發(fā)明采用將自旋鎖變量以比特為單位分為兩部分,高位和低位。自旋鎖變量的 高位bit中存儲(chǔ)一個(gè)標(biāo)識(shí)值,記為ID。ID為一個(gè)整數(shù),用來映射加鎖的線程。當(dāng)自旋鎖加 鎖不成功并且等鎖超時(shí)的時(shí)候,通過獲取自旋鎖變量高位ID,來判斷在超時(shí)前后是否是同 一個(gè)ID值存儲(chǔ)在自旋鎖變量里,如果是同一個(gè)ID,則認(rèn)為此ID對(duì)應(yīng)的線程已經(jīng)異常退出, 發(fā)生了死鎖,則對(duì)自旋鎖進(jìn)行解鎖操作。自旋鎖變量高位與低位的分配方式如下選取低位的Ibit來標(biāo)識(shí)自旋鎖的狀態(tài); 在剩余的bit中選擇若干位存儲(chǔ)ID。ID的分配方法如下設(shè)計(jì)一個(gè)無符號(hào)全局共享變量, 取值范圍與ID的范圍相同,加鎖線程請(qǐng)求自旋鎖前先使用原子操作對(duì)此變量做累計(jì)加1操 作,返回變量的值即為此線程要使用的ID值。由于變量累計(jì)加1操作,時(shí)間上相近的線程 不會(huì)獲取相同的ID,保證了 ID與線程的一一映射關(guān)系。本發(fā)明的有益效果是通過擴(kuò)展自旋鎖的存儲(chǔ)空間,不僅存儲(chǔ)自旋鎖狀態(tài),并且保 存最后加鎖成功的任務(wù)標(biāo)識(shí)符,從而避免出現(xiàn)上述多個(gè)任務(wù)競(jìng)爭(zhēng)同一個(gè)自旋鎖時(shí)可能出現(xiàn) 的死鎖情況。此外,改進(jìn)加鎖流程及死鎖判決流程,使自旋鎖能夠保護(hù)在數(shù)據(jù)結(jié)構(gòu)上一段較 長(zhǎng)時(shí)間的操作,并能處理期間加鎖線程的異常結(jié)束導(dǎo)致的死鎖問題。


下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明的技術(shù)方案作進(jìn)一步具體說明。圖1為自旋鎖加鎖流程。圖2為自旋鎖死鎖判決流程。
具體實(shí)施例方式在共享內(nèi)存中存儲(chǔ)兩個(gè)全局變量,一個(gè)是自旋鎖變量,另一個(gè)是用于產(chǎn)生ID值的 變量,我們稱其為ID變量。所有要使用此自旋鎖的線程均要訪問這兩個(gè)變量,系統(tǒng)初始化 時(shí)兩個(gè)變量被初始化為0。自旋鎖加鎖步驟如下步驟101,線程從ID變量中獲取ID值。ID值產(chǎn)生方法如下用原子操作讀取ID變量 中的值并將其值加1。由于讀值操作與加1操作是原子的,因此多線程相近時(shí)間內(nèi)訪問此 ID變量時(shí),不會(huì)獲取相同的ID值。步驟102,將第101步中獲取的ID值與加鎖后的狀態(tài)值合成一個(gè)自旋鎖變量值當(dāng) 加鎖過程中需要判定是否發(fā)生死鎖時(shí),按如下步驟
步驟103,以原子操作訪問自旋鎖變量,嘗試加鎖操作。步驟104,若自旋鎖狀態(tài)為未占用,則加鎖成功,將步驟102合成的鎖變量值以原 子操作存入自旋鎖變量,對(duì)自旋鎖變量的訪問和將值存于自旋鎖變量是原子的;
步驟105,若自旋鎖狀態(tài)為已占用,加鎖不成功則進(jìn)入死鎖判決流程。如果未出現(xiàn)死鎖, 則處理器自旋等待,轉(zhuǎn)入步驟103進(jìn)行加鎖嘗試;如果判斷出現(xiàn)死鎖;則轉(zhuǎn)入步驟106解自 旋鎖,并重新轉(zhuǎn)入步驟103。死鎖判決步驟如下
步驟201,將自旋鎖變量的高位ID值存儲(chǔ)于線程的一個(gè)臨時(shí)變量中,記為L(zhǎng)hold ; 步驟202,將分配給此線程的ID值與自旋鎖變量已加鎖狀態(tài)值合成一個(gè)新自旋鎖變量 值N ;合成方法如下新值N低位存儲(chǔ)鎖變量狀態(tài),高位存儲(chǔ)ID值; 步驟203,原子操作探測(cè)自旋鎖變量狀態(tài)值,判斷是否可以加鎖; 步驟204,如果自旋鎖可以加鎖,則將值N存于自旋鎖變量,其中對(duì)自旋鎖變量的探測(cè) 和存儲(chǔ)是原子的,自旋鎖加鎖成功并返回;
步驟205,如果自旋鎖不能被加鎖,處理器空轉(zhuǎn)一次;對(duì)空轉(zhuǎn)次數(shù)累加計(jì)數(shù); 步驟206,如果空轉(zhuǎn)次數(shù)不超過設(shè)定閾值,則轉(zhuǎn)入步驟203 ;否則轉(zhuǎn)入步驟207 ; 步驟207,對(duì)休眠次數(shù)累計(jì)加1,判斷休眠次數(shù)是否超過設(shè)定閾值,如果超過設(shè)定閾值 則轉(zhuǎn)入步驟208 ;否則轉(zhuǎn)入步驟211 ;
步驟208,將LHold與自旋鎖加鎖后狀態(tài)值合成一個(gè)新自旋鎖變量值Y,合成方法如下 Y的低位存儲(chǔ)加鎖后狀態(tài)值,高位存儲(chǔ)LHold值;
步驟209,原子操作比較自旋鎖變量值與Y值是否相等,如果相等,則判定自旋鎖死鎖, 并將自旋鎖解鎖,其中判定鎖變量值與Y值相等的操作與自旋鎖解鎖的操作是原子的;
步驟210,重新獲取自旋鎖變量的高位ID值,存儲(chǔ)于LhW,并將休眠計(jì)數(shù)清零,線程休 眠一段隨機(jī)時(shí)間,轉(zhuǎn)入步驟211 ;
步驟211,線程休眠一次,休眠一段隨機(jī)時(shí)間,隨機(jī)時(shí)間在1毫秒到1秒之間,并將空轉(zhuǎn) 次數(shù)計(jì)數(shù)清零。合成方法是低位存儲(chǔ)鎖變量狀態(tài),高位存儲(chǔ)ID值。最后所應(yīng)說明的是,以上具體實(shí)施方式
僅用以說明本發(fā)明的技術(shù)方案而非限制, 盡管參照較佳實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對(duì) 本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍,其均 應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種數(shù)據(jù)庫中自旋鎖的實(shí)現(xiàn)方法,其特征在于,在共享內(nèi)存中存儲(chǔ)兩個(gè)全局變量,一 個(gè)是自旋鎖變量,另一個(gè)是ID變量,系統(tǒng)初始化時(shí)兩個(gè)變量被初始化為0 ;在加鎖操作時(shí),按如下步驟步驟101,用原子操作讀取ID變量中的值并將其值加1 ;步驟102,將第101步中獲取的ID值與加鎖后的狀態(tài)值合成一個(gè)自旋鎖變量值N,合成 方法是低位存儲(chǔ)鎖變量狀態(tài),高位存儲(chǔ)ID值;步驟103,以原子操作訪問自旋鎖變量,嘗試加鎖操作;步驟104,若自旋鎖狀態(tài)為未占用,則加鎖成功,將步驟102合成的鎖變量值以原子操 作存入自旋鎖變量,對(duì)自旋鎖變量的訪問和將值存于自旋鎖變量是原子的;步驟105,若自旋鎖狀態(tài)為已占用,加鎖不成功則進(jìn)入死鎖判決流程,如果未出現(xiàn)死鎖, 則處理器自旋等待,轉(zhuǎn)入步驟103進(jìn)行加鎖嘗試;如果判斷出現(xiàn)死鎖;則轉(zhuǎn)入步驟106解自 旋鎖,并重新轉(zhuǎn)入步驟103。
2.根據(jù)權(quán)利要求1所述的一種數(shù)據(jù)庫中自旋鎖的實(shí)現(xiàn)方法,其特征在于,當(dāng)加鎖過程 中需要判定是否發(fā)生死鎖時(shí),按如下步驟步驟201,將自旋鎖變量的高位ID值存儲(chǔ)于線程的一個(gè)臨時(shí)變量中,記為L(zhǎng)hold ; 步驟202,將分配給此線程的ID值與自旋鎖變量已加鎖狀態(tài)值合成一個(gè)新自旋鎖變量 值N ;合成方法如下新值N低位存儲(chǔ)鎖變量狀態(tài),高位存儲(chǔ)ID值; 步驟203,原子操作探測(cè)自旋鎖變量狀態(tài)值,判斷是否可以加鎖; 步驟204,如果自旋鎖可以加鎖,則將值N存于自旋鎖變量,其中對(duì)自旋鎖變量的探測(cè) 和存儲(chǔ)是原子的,自旋鎖加鎖成功并返回;步驟205,如果自旋鎖不能被加鎖,處理器空轉(zhuǎn)一次;對(duì)空轉(zhuǎn)次數(shù)累加計(jì)數(shù); 步驟206,如果空轉(zhuǎn)次數(shù)不超過設(shè)定閾值,則轉(zhuǎn)入步驟203 ;否則轉(zhuǎn)入步驟207 ; 步驟207,對(duì)休眠次數(shù)累計(jì)加1,判斷休眠次數(shù)是否超過設(shè)定閾值,如果超過設(shè)定閾值 則轉(zhuǎn)入步驟208 ;否則轉(zhuǎn)入步驟211 ;步驟208,將LHold與自旋鎖加鎖后狀態(tài)值合成一個(gè)新自旋鎖變量值Y,合成方法如下 Y的低位存儲(chǔ)加鎖后狀態(tài)值,高位存儲(chǔ)LHold值;步驟209,原子操作比較自旋鎖變量值與Y值是否相等,如果相等,則判定自旋鎖死鎖, 并將自旋鎖解鎖,其中判定鎖變量值與Y值相等的操作與自旋鎖解鎖的操作是原子的;步驟210,重新獲取自旋鎖變量的高位ID值,存儲(chǔ)于LhW,并將休眠計(jì)數(shù)清零,線程休 眠一段隨機(jī)時(shí)間,轉(zhuǎn)入步驟211 ;步驟211,線程休眠一次,休眠一段隨機(jī)時(shí)間,隨機(jī)時(shí)間在1毫秒到1秒之間,并將空轉(zhuǎn) 次數(shù)計(jì)數(shù)清零。
全文摘要
本發(fā)明公開了一種數(shù)據(jù)庫中自旋鎖的實(shí)現(xiàn)方法,其特征在于,一種數(shù)據(jù)庫中自旋鎖的實(shí)現(xiàn)方法,其特征在于,在共享內(nèi)存中存儲(chǔ)兩個(gè)全局變量,一個(gè)是自旋鎖變量,另一個(gè)是ID變量,系統(tǒng)初始化時(shí)兩個(gè)變量被初始化為0;采用自旋鎖變量高位存儲(chǔ)值來記憶當(dāng)前已持自旋鎖線程,并根據(jù)該存儲(chǔ)值在持鎖線程異常退出導(dǎo)致死鎖時(shí),實(shí)現(xiàn)自旋鎖自動(dòng)解鎖。本發(fā)明避免出現(xiàn)上述多個(gè)任務(wù)競(jìng)爭(zhēng)同一個(gè)自旋鎖時(shí)可能出現(xiàn)的死鎖情況,并通過改進(jìn)加鎖流程及死鎖判決流程,使自旋鎖能夠保護(hù)在數(shù)據(jù)結(jié)構(gòu)上一段較長(zhǎng)時(shí)間的操作,并能處理期間加鎖線程的異常結(jié)束導(dǎo)致的死鎖問題。
文檔編號(hào)G06F9/46GK102129391SQ20111006057
公開日2011年7月20日 申請(qǐng)日期2011年3月14日 優(yōu)先權(quán)日2011年3月14日
發(fā)明者劉維, 王非, 鄧?yán)? 黃本雄 申請(qǐng)人:華中科技大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1