一種臨界區(qū)訪問方法及裝置的制造方法
【專利摘要】本發(fā)明公開了一種臨界區(qū)訪問方法及裝置,在本方案中,在互斥鎖的信息區(qū)內(nèi)增加CPU ID信息,該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖。任務(wù)訪問臨界區(qū)時(shí),首先檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài);若是,則讀取互斥鎖的信息區(qū)內(nèi)存儲的中央處理器CPU標(biāo)識ID;若讀取的CPU ID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)。這樣,可以使得同CPU內(nèi)的任務(wù)直接進(jìn)入休眠狀態(tài),不必進(jìn)行輪詢,從而由于減少了輪詢的次數(shù),從而達(dá)到節(jié)約處理資源的目的。
【專利說明】
一種臨界區(qū)訪問方法及裝置
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及臨界區(qū)訪問技術(shù)領(lǐng)域,尤其涉及一種臨界區(qū)訪問方法及裝置。
【背景技術(shù)】
[0002]臨界區(qū)無法同時(shí)被多個(gè)任務(wù)(一個(gè)任務(wù)指一個(gè)線程或進(jìn)程)訪問。當(dāng)有任務(wù)訪問臨界區(qū)時(shí),其他任務(wù)必須等待,以確保臨界區(qū)同一時(shí)間僅被一個(gè)任務(wù)訪問,任務(wù)之間對臨界區(qū)的訪問互斥的。
[0003]現(xiàn)有技術(shù)同通過為臨界區(qū)設(shè)置互斥鎖的方法,實(shí)現(xiàn)臨界區(qū)同一時(shí)間僅被一個(gè)任務(wù)訪問。具體的,針對任何任務(wù)A,當(dāng)該任務(wù)A訪問臨界區(qū)時(shí),必須首先鎖定互斥鎖(即獲得臨界區(qū)的訪問權(quán)限);若另一個(gè)任務(wù)B也需要訪問臨界區(qū),而互斥鎖又被其它任務(wù)鎖定時(shí),該任務(wù)B由于不知道任務(wù)A什么時(shí)候能夠釋放互斥鎖,則需要不停的輪詢以便于獲知互斥鎖是否被釋放,然后通過鎖定被任務(wù)A釋放的互斥鎖來獲得訪問臨界區(qū)的權(quán)限。任務(wù)B若輪詢的次數(shù)到達(dá)一定次數(shù),則將會進(jìn)入休眠狀態(tài)。
[0004]現(xiàn)有技術(shù)中由于當(dāng)互斥鎖被其他任務(wù)鎖定時(shí),需要不斷的輪詢競爭獲取互斥鎖,造成處理資源的浪費(fèi)。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實(shí)施例提供了一種臨界區(qū)訪問方法及裝置,用以解決目前存在的由于不斷的輪詢互斥鎖,造成處理資源浪費(fèi)的問題。
[0006]本發(fā)明實(shí)施例提供了一種臨界區(qū)訪問方法,包括:
[0007]訪問臨界區(qū)時(shí),檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài);
[0008]若是,貝Ij讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU(Central Processing Unit,中央處理器)ID(Identity,標(biāo)識);該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖;
[0009]若讀取的CPU ID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)。
[0010]進(jìn)一步地,所述方法還包括:
[0011 ]若檢測到臨界區(qū)的互斥鎖是處于未鎖定狀態(tài),則鎖定互斥鎖;并,
[0012]將互斥鎖的信息區(qū)內(nèi)的CPUID更改為自身所在CPU的CPU ID;并,
[0013]對臨界區(qū)進(jìn)行訪問。
[0014]進(jìn)一步地,所述對臨界區(qū)進(jìn)行訪問之后,所述方法還包括:
[0015]釋放互斥鎖之前,將互斥鎖的信息區(qū)內(nèi)的CPUID更改為預(yù)設(shè)無效值,該預(yù)設(shè)無效值用于表示互斥鎖未被任何CHJ上的任務(wù)鎖定;
[0016]所述若讀取的CPUID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)之前,所述方法還包括:
[0017]確定讀取的CPUID不是預(yù)設(shè)無效值。
[0018]進(jìn)一步地,所述方法還包括:
[0019]若讀取的CPUID為預(yù)設(shè)無效值,則繼續(xù)讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU ID;
[0020]若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPUID均為預(yù)設(shè)無效值,則進(jìn)入休眠狀態(tài)。
[0021]進(jìn)一步地,所述方法還包括:
[0022]若讀取的CPUID與自身的CPU ID不相同,將記錄的輪詢次數(shù)加一;
[0023]判斷輪詢次數(shù)是否大于或等于第二預(yù)設(shè)次數(shù);
[0024]若輪詢次數(shù)大于或等于第二預(yù)設(shè)次數(shù),則進(jìn)入休眠狀態(tài);
[0025]若輪詢次數(shù)小于第二預(yù)設(shè)次數(shù),則返回執(zhí)行檢測臨界區(qū)的互斥鎖是否處于被鎖定狀態(tài)的步驟。
[0026]本發(fā)明還提供一種臨界區(qū)訪問裝置,包括:
[0027]鎖定狀態(tài)檢測模塊,用于訪問臨界區(qū)時(shí),檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài);
[0028]CPU ID讀取模塊,用于若互斥鎖處于鎖定狀態(tài),則讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU ID;該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖;
[0029]第一休眠模塊,用于若讀取的CPUID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀
??τ O
[0030]進(jìn)一步地,所述裝置還包括:
[0031]鎖定模塊,用于若檢測到臨界區(qū)的互斥鎖是處于未鎖定狀態(tài),則鎖定互斥鎖;
[0032]第一CPUID修改模塊,用于將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為自身所在CPU的CPU ID;
[0033]訪問模塊,用于對臨界區(qū)進(jìn)行訪問。
[0034]進(jìn)一步地,所述裝置還包括:
[0035]第二CPUID修改模塊,用于所述訪問模塊對臨界區(qū)進(jìn)行訪問之后,釋放互斥鎖之前,將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為預(yù)設(shè)無效值,該預(yù)設(shè)無效值用于表示互斥鎖未被任何CPU上的任務(wù)鎖定;
[0036]預(yù)設(shè)無效值確定模塊,用于所述第一休眠模塊若讀取的CPUID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)之前,確定讀取的CPU ID不是預(yù)設(shè)無效值。
[0037]進(jìn)一步地,所述裝置還包括:
[0038]繼續(xù)讀取模塊,用于若讀取的CPUID為預(yù)設(shè)無效值,則繼續(xù)讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU ID;
[0039]第二休眠模塊,用于若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPUID均為預(yù)設(shè)無效值,則進(jìn)入休眠狀態(tài)。
[0040]進(jìn)一步地,所述裝置還包括:
[0041 ]記錄模塊,用于若讀取的CPU ID與自身的CPU ID不相同,將記錄的輪詢次數(shù)加一;
[0042]判斷模塊,用于判斷輪詢次數(shù)是否大于或等于第二預(yù)設(shè)次數(shù);
[0043]第三休眠模塊,用于若輪詢次數(shù)大于或等于第二預(yù)設(shè)次數(shù),則進(jìn)入休眠狀態(tài);
[0044]返回模塊,用于若輪詢次數(shù)小于第二預(yù)設(shè)次數(shù),則觸發(fā)鎖定狀態(tài)檢測模塊檢測臨界區(qū)的互斥鎖是否處于被鎖定狀態(tài)。
[0045]本發(fā)明有益效果如下:在本發(fā)明實(shí)施例所述技術(shù)方案中,在互斥鎖的信息區(qū)內(nèi)增加CPU ID信息,該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖。任務(wù)訪問臨界區(qū)時(shí),首先檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài);若是,則讀取互斥鎖的信息區(qū)內(nèi)存儲的中央處理器CPU標(biāo)識ID;若讀取的CPU ID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)。這樣,可以使得同CPU內(nèi)的任務(wù)直接進(jìn)入休眠狀態(tài),不必進(jìn)行輪詢,從而由于減少了輪詢的次數(shù),從而達(dá)到節(jié)約處理資源的目的。
【附圖說明】
[0046]為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0047]圖1所示為本發(fā)明實(shí)施例一中所述臨界區(qū)訪問方法的流程示意圖;
[0048]圖2所示為本發(fā)明實(shí)施例二中所述臨界區(qū)訪問方法的流程示意圖;
[0049]圖3所示為本發(fā)明實(shí)施例三中所述臨界區(qū)訪問裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0050]發(fā)明人在研究中發(fā)現(xiàn),同一 CPU在同一時(shí)間僅有一個(gè)任務(wù)(即一個(gè)線程或進(jìn)程)可以請求獲取互斥鎖。故此,對于同一CPU內(nèi),若已經(jīng)有一個(gè)任務(wù)鎖定互斥鎖,則該CPU內(nèi)的其他任務(wù)輪詢嘗試獲取互斥鎖是沒有意義的(因?yàn)樵揅PU內(nèi)已經(jīng)有任務(wù)鎖定了互斥鎖)。故此,本發(fā)明實(shí)施例提供了一種臨界區(qū)訪問方法及裝置,在本發(fā)明實(shí)施例所述技術(shù)方案中,在互斥鎖的信息區(qū)內(nèi)增加CPU ID信息,該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖。任務(wù)訪問臨界區(qū)時(shí),首先檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài);若是,則讀取互斥鎖的信息區(qū)內(nèi)存儲的中央處理器(PU標(biāo)識ID;若讀取的CPU ID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)。這樣,可以使得同CPU內(nèi)的任務(wù)直接進(jìn)入休眠狀態(tài),不必進(jìn)行輪詢,從而由于減少了輪詢的次數(shù),從而達(dá)到節(jié)約處理資源的目的。
[0051]為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明作進(jìn)一步地詳細(xì)描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0052]實(shí)施例一:
[0053]如圖1所示,其為本發(fā)明實(shí)施例一中臨界區(qū)訪問方法的流程示意圖,該臨界區(qū)訪問方法可包括以下步驟:
[0054]步驟101:訪問臨界區(qū)時(shí),檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài)。
[0055]其中,在一個(gè)實(shí)施例中,本發(fā)明實(shí)施例的執(zhí)行主體可以為任一任務(wù)(即任一進(jìn)程或線程)。
[0056]其中,在一個(gè)實(shí)施例中,互斥鎖可以具有鎖定狀態(tài)參數(shù),故此,可以通過以下方法檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài),包括:
[0057]步驟Al:讀取互斥鎖的鎖定狀態(tài)參數(shù)值。
[0058]例如,可以使用I表示互斥鎖處于鎖定狀態(tài),用O表示互斥鎖處于未鎖定狀態(tài)。
[0059]步驟A2:若讀取的鎖定狀態(tài)參數(shù)值為表示處于鎖定狀態(tài)的參數(shù)值,則確定互斥鎖處于鎖定狀態(tài);若讀取的鎖定狀態(tài)參數(shù)值為表示處于未鎖定狀態(tài)的參數(shù)值,則確定互斥鎖處于未鎖定狀態(tài)。
[0060]需要說明的是,可以通過現(xiàn)有技術(shù)中的其他方法檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài),本發(fā)明實(shí)施例對此不一一列舉。
[0061 ]步驟102:若是,則讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU ID;該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖。
[0062]其中,信息區(qū)內(nèi)存儲的CPUID,是由鎖定了互斥鎖的任務(wù)寫入互斥鎖的信息區(qū)的。
[0063]步驟103:若讀取的CPU ID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)。
[0064]這樣,本發(fā)明實(shí)施例中,當(dāng)前請求互斥鎖的任務(wù)若當(dāng)確定讀取的CPUID與自身所在CPU的CPU ID相同(即同一CPU已經(jīng)有其它任務(wù)鎖定互斥鎖時(shí)),則進(jìn)入休眠狀態(tài),不再進(jìn)行輪詢,這樣,便能夠解決由于輪詢而造成的處理資源的浪費(fèi)。
[0065]為便于進(jìn)一步理解,下面對本發(fā)明實(shí)施例進(jìn)行進(jìn)一步詳細(xì)的說明,包括以下內(nèi)容。
[0066]其中,在一個(gè)實(shí)施例中,為便于能夠盡快的訪問臨界區(qū),本發(fā)明實(shí)施例中還包括以下步驟:
[0067]步驟Al:若檢測到臨界區(qū)的互斥鎖是處于未鎖定狀態(tài),則鎖定互斥鎖。
[0068]步驟A2:將互斥鎖的信息區(qū)內(nèi)的CPUID更改為自身所在CPU的CPU ID。
[0069]步驟A3:對臨界區(qū)進(jìn)行訪問。
[0070]這樣,本發(fā)明實(shí)施例中,鎖定互斥鎖后,通過將互斥鎖的信息區(qū)內(nèi)的CPUID更改為自身所在CPU的CPU ID,以便于其它任務(wù)能夠根據(jù)互斥鎖的信息區(qū)內(nèi)的CPU ID決定繼續(xù)輪詢還是進(jìn)入休眠狀態(tài)。
[0071]其中,在一個(gè)實(shí)施例中,在執(zhí)行步驟Al和步驟A2之間可能會有一些時(shí)間間隔(即步驟Al執(zhí)行完后,會再過一段時(shí)間步驟A2才執(zhí)行完)。而在這個(gè)時(shí)間間隔內(nèi),可能還有其他任務(wù)在進(jìn)行輪詢以期獲得訪問臨界區(qū)的權(quán)限。而若在這個(gè)時(shí)間間隔內(nèi),互斥鎖的信息區(qū)存儲的CPU ID若還未來得及修改(即步驟Al已執(zhí)行完畢,而步驟A2尚未執(zhí)行完),那么互斥鎖的信息區(qū)存儲的CPU ID可能與實(shí)際情況不符,這會造成其他任務(wù)由于獲取了錯(cuò)誤的CPU ID而造成誤判。例如,任務(wù)A運(yùn)行在CPU_0l,任務(wù)B運(yùn)行在CPU_0l,任務(wù)C運(yùn)行在在CPU_1上(CPU_O與CPU_1表示不同的CPU)。若通過競爭,任務(wù)A首先鎖定互斥鎖,并將信息區(qū)的CPU ID寫為CPU_0。任務(wù)A釋放互斥鎖之后,任務(wù)C鎖定互斥鎖,若任務(wù)C還未將信息區(qū)的CPU ID改寫為CPlLl時(shí),任務(wù)B進(jìn)行輪詢并讀取信息區(qū)的CPU ID,則讀取的結(jié)果會是CPU_0(而實(shí)際上信息區(qū)的CPU ID應(yīng)該為CPU_1),這便導(dǎo)致任務(wù)B讀取的CPU ID與實(shí)際不符,容易使得任務(wù)B造成誤判而進(jìn)入休眠狀態(tài)。
[0072]本發(fā)明實(shí)施例中,為了避免讀取的CPUID與實(shí)際不符而導(dǎo)致誤判,可以在執(zhí)行步驟A3(即對臨界區(qū)進(jìn)行訪問)之后,在釋放互斥鎖之前,將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為預(yù)設(shè)無效值,該預(yù)設(shè)無效值用于表示互斥鎖未被任何CHJ上的任務(wù)鎖定;然后再釋放互斥鎖。這樣,在執(zhí)行步驟103之前,本發(fā)明實(shí)時(shí)例中還可以確定讀取的CPU ID不是預(yù)設(shè)無效值。這樣,通過預(yù)設(shè)無效值,可以使得為鎖定互斥鎖的其他任務(wù),在輪詢時(shí),可以得知互斥鎖處于鎖定狀態(tài),但是具體哪個(gè)CPU ID并不清楚,可以繼續(xù)輪詢等待,以決定自身是否進(jìn)入休眠狀態(tài)。
[0073]其中,在一個(gè)實(shí)施例中,步驟A2與步驟A3之間的時(shí)間間隔越長,則可能是由于出現(xiàn)了故障,這時(shí)候,往往故障恢復(fù)需要一定的時(shí)間。而在故障期間任務(wù)輪詢互斥鎖是一種處理資源的浪費(fèi),故此,本發(fā)明實(shí)施例中,為了進(jìn)一步節(jié)約處理資源,在執(zhí)行步驟102之后,若讀取的CPU ID為預(yù)設(shè)無效值,則繼續(xù)讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU ID;并,若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPU ID均為預(yù)設(shè)無效值,則進(jìn)入休眠狀態(tài)。這樣,本發(fā)明實(shí)施例中若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPU ID均為預(yù)設(shè)無效值則視為出現(xiàn)了需要長時(shí)間處理修復(fù)的故障,而在次數(shù)進(jìn)入休眠狀態(tài),以避免故障期間輪詢造成的處理資源浪費(fèi)。
[0074]其中,在一個(gè)實(shí)施例中,為了便于盡快的鎖定互斥鎖,在執(zhí)行步驟102之后,還可以包括以下步驟:
[0075]步驟B1:若讀取的CPUID與自身的CPU ID不相同,將記錄的輪詢次數(shù)加一。
[0076]步驟B2:判斷輪詢次數(shù)是否大于或等于第二預(yù)設(shè)次數(shù)。
[0077]步驟B3:若輪詢次數(shù)大于或等于第二預(yù)設(shè)次數(shù),則進(jìn)入休眠狀態(tài);若輪詢次數(shù)小于第二預(yù)設(shè)次數(shù),則返回執(zhí)行檢測臨界區(qū)的互斥鎖是否處于被鎖定狀態(tài)的步驟。
[0078]其中,在一個(gè)實(shí)施例中進(jìn)入休眠狀態(tài)的任務(wù),在進(jìn)入休眠狀態(tài)之前,可以將自身的任務(wù)ID記錄在預(yù)存的休眠任務(wù)記錄里,以便于等待接收到操作系統(tǒng)發(fā)送的喚醒指令后,結(jié)束休眠并執(zhí)行步驟101。具體實(shí)施時(shí),可以由鎖定互斥鎖的任務(wù)在釋放互斥鎖之后,查看休眠任務(wù)記錄里是否有處于休眠狀態(tài)的任務(wù),若有,則通知操作系統(tǒng)喚醒處于休眠狀態(tài)的任務(wù)。
[0079]其中,在一個(gè)實(shí)施例中休眠任務(wù)記錄可以以文件形式存儲,也可以以數(shù)據(jù)庫形式存儲,本發(fā)明實(shí)施例對此不做限定。
[0080]其中,在一個(gè)實(shí)施例中休眠任務(wù)記錄中還可以包括各處于休眠狀態(tài)的任務(wù)的優(yōu)先級,則操作系統(tǒng)可以根據(jù)優(yōu)先級確定喚醒哪些處于休眠狀態(tài)的任務(wù)。例如喚醒優(yōu)先級最高的任務(wù),以使優(yōu)先級低的任務(wù)繼續(xù)處于休眠狀態(tài),而減少優(yōu)先級低的任務(wù)繼續(xù)輪詢的次數(shù)。
[0081]需要說明的是,喚醒哪些任務(wù)可以根據(jù)其他現(xiàn)有技術(shù)的算法確定,本發(fā)明實(shí)施例對此不做限定。
[0082]實(shí)施例二
[0083]為便于理解,舉例說明如何訪問臨界區(qū),假設(shè)開始時(shí),可以由操作系統(tǒng)對互斥鎖進(jìn)行初始化(即將互斥鎖設(shè)置為處于未鎖定狀態(tài),并將互斥鎖的信息區(qū)的CPU ID設(shè)置為預(yù)設(shè)無效值)。若通過競爭,任務(wù)A首先鎖定了互斥鎖,并將互斥鎖信息區(qū)的CPU ID設(shè)置為任務(wù)A所在CPU的CPU ID,則如圖2所示,任務(wù)B可以執(zhí)行以下步驟:
[0084]步驟201:訪問臨界區(qū)時(shí),檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài),若是,則執(zhí)行步驟202,若否,則執(zhí)行步驟209。
[0085]步驟202:讀取互斥鎖的信息區(qū)內(nèi)存儲的CPUID。
[0086]步驟203:判斷讀取的CPU ID是否為預(yù)設(shè)無效值;若是,則執(zhí)行步驟204;若否,則執(zhí)行步驟206。
[0087]步驟204:繼續(xù)讀取互斥鎖的信息區(qū)內(nèi)存儲的CPUID;若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPU ID均為預(yù)設(shè)無效值,則進(jìn)入休眠狀態(tài)。
[0088]步驟205:判斷讀取的CPUID是否與自身所在CPU的CPU ID相同;若是,則執(zhí)行步驟206 ;若否,則執(zhí)行步驟207。
[0089]步驟206:進(jìn)入休眠狀態(tài)。
[0090]步驟207:將記錄的輪詢次數(shù)加一。
[0091 ]步驟208:判斷輪詢次數(shù)是否大于或等于第二預(yù)設(shè)次數(shù);若是,則執(zhí)行步驟206;若否,則執(zhí)行步驟201。
[0092]步驟209:鎖定互斥鎖。
[0093]步驟210:將互斥鎖的信息區(qū)內(nèi)的CPUID更改為自身所在CPU的CPU ID;并對臨界區(qū)進(jìn)行訪問。
[0094]步驟211:釋放互斥鎖之前,將互斥鎖的信息區(qū)內(nèi)的CPUID更改為預(yù)設(shè)無效值。
[0095]步驟212:釋放互斥鎖。
[0096]其中,在一個(gè)實(shí)施例中,本發(fā)明實(shí)施例中還可以在釋放互斥鎖之后,由任務(wù)B查看休眠任務(wù)記錄里是否有處于休眠狀態(tài)的任務(wù),若有,則通知操作系統(tǒng)喚醒處于休眠狀態(tài)的任務(wù)。具體的方法,已在實(shí)施例一種說明,在此不再贅述。
[0097]實(shí)施例三
[0098]基于相同的發(fā)明構(gòu)思,本發(fā)明實(shí)施例還提供一種臨界區(qū)訪問裝置,如圖3所示,為該裝置的結(jié)構(gòu)示意圖,包括:
[0099]鎖定狀態(tài)檢測模塊301,用于訪問臨界區(qū)時(shí),檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài);
[0100]CPU ID讀取模塊302,用于若互斥鎖處于鎖定狀態(tài),則讀取互斥鎖的信息區(qū)內(nèi)存儲的中央處理器CPU標(biāo)識ID;該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖;
[0101]第一休眠模塊303,用于若讀取的CPU ID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)。
[0102]其中,在一個(gè)實(shí)施例中,臨界區(qū)訪問裝置還包括:
[0103]鎖定模塊,用于若檢測到臨界區(qū)的互斥鎖是處于未鎖定狀態(tài),則鎖定互斥鎖;
[0104]第一CPUID修改模塊,用于將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為自身所在CPU的CPU ID;
[0105]訪問模塊,用于對臨界區(qū)進(jìn)行訪問。
[0106]其中,在一個(gè)實(shí)施例中,臨界區(qū)訪問裝置還包括:
[0107]第二CPUID修改模塊,用于訪問模塊對臨界區(qū)進(jìn)行訪問之后,釋放互斥鎖之前,將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為預(yù)設(shè)無效值,該預(yù)設(shè)無效值用于表示互斥鎖未被任何CPU上的任務(wù)鎖定;
[0108]預(yù)設(shè)無效值確定模塊,用于第一休眠模塊若讀取的CPUID與自身所在CPU的CPUID相同,則進(jìn)入休眠狀態(tài)之前,確定讀取的CPU ID不是預(yù)設(shè)無效值。
[0109]其中,在一個(gè)實(shí)施例中,臨界區(qū)訪問裝置還包括:
[0110]繼續(xù)讀取模塊,用于若讀取的CPUID為預(yù)設(shè)無效值,則繼續(xù)讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU ID;
[0111]第二休眠模塊,用于若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPUID均為預(yù)設(shè)無效值,則進(jìn)入休眠狀態(tài)。
[0112]其中,在一個(gè)實(shí)施例中,臨界區(qū)訪問裝置還包括:
[0113]記錄模塊,用于若讀取的CPUID與自身的CPU ID不相同,將記錄的輪詢次數(shù)加一;
[0114]判斷模塊,用于判斷輪詢次數(shù)是否大于或等于第二預(yù)設(shè)次數(shù);
[0115]第三休眠模塊,用于若輪詢次數(shù)大于或等于第二預(yù)設(shè)次數(shù),則進(jìn)入休眠狀態(tài);
[0116]返回模塊,用于若輪詢次數(shù)小于第二預(yù)設(shè)次數(shù),則觸發(fā)鎖定狀態(tài)檢測模塊檢測臨界區(qū)的互斥鎖是否處于被鎖定狀態(tài)。
[0117]關(guān)于上述實(shí)施例中的裝置,其中各個(gè)模塊執(zhí)行操作的具體方式已經(jīng)在有關(guān)該方法的實(shí)施例中進(jìn)行了詳細(xì)描述,此處將不做詳細(xì)闡述說明。
[0118]本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、裝置、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學(xué)存儲器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
[0119]本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、裝置(裝置)和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理裝置的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理裝置的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
[0120]這些計(jì)算機(jī)程序指令也可存儲在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理裝置以特定方式工作的計(jì)算機(jī)可讀存儲器中,使得存儲在該計(jì)算機(jī)可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
[0121 ]這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理裝置上,使得在計(jì)算機(jī)或其他可編程裝置上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程裝置上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
[0122]盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。
[0123]顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
【主權(quán)項(xiàng)】
1.一種臨界區(qū)訪問方法,其特征在于,包括: 訪問臨界區(qū)時(shí),檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài); 若是,則讀取互斥鎖的信息區(qū)內(nèi)存儲的中央處理器CHJ標(biāo)識ID;該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖; 若讀取的CHJ ID與自身所在CRJ的CRJ ID相同,則進(jìn)入休眠狀態(tài)。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法還包括: 若檢測到臨界區(qū)的互斥鎖是處于未鎖定狀態(tài),則鎖定互斥鎖;并, 將互斥鎖的信息區(qū)內(nèi)的CRJ ID更改為自身所在CRJ的CRJ ID;并, 對臨界區(qū)進(jìn)行訪問。3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述對臨界區(qū)進(jìn)行訪問之后,所述方法還包括: 釋放互斥鎖之前,將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為預(yù)設(shè)無效值,該預(yù)設(shè)無效值用于表示互斥鎖未被任何CPU上的任務(wù)鎖定; 所述若讀取的CPU ID與自身所在CPU的CPU ID相同,則進(jìn)入休眠狀態(tài)之前,所述方法還包括: 確定讀取的CHJ ID不是預(yù)設(shè)無效值。4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述方法還包括: 若讀取的CHJ ID為預(yù)設(shè)無效值,則繼續(xù)讀取互斥鎖的信息區(qū)內(nèi)存儲的CRJ ID; 若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPU ID均為預(yù)設(shè)無效值,則進(jìn)入休眠狀態(tài)。5.根據(jù)權(quán)利要求1-4中任一所述的方法,其特征在于,所述方法還包括: 若讀取的CHJ ID與自身的CRJ ID不相同,將記錄的輪詢次數(shù)加一; 判斷輪詢次數(shù)是否大于或等于第二預(yù)設(shè)次數(shù); 若輪詢次數(shù)大于或等于第二預(yù)設(shè)次數(shù),則進(jìn)入休眠狀態(tài); 若輪詢次數(shù)小于第二預(yù)設(shè)次數(shù),則返回執(zhí)行檢測臨界區(qū)的互斥鎖是否處于被鎖定狀態(tài)的步驟。6.—種臨界區(qū)訪問裝置,其特征在于,包括: 鎖定狀態(tài)檢測模塊,用于訪問臨界區(qū)時(shí),檢測臨界區(qū)的互斥鎖是否處于鎖定狀態(tài); CPU ID讀取模塊,用于若互斥鎖處于鎖定狀態(tài),則讀取互斥鎖的信息區(qū)內(nèi)存儲的中央處理器CPU標(biāo)識ID;該CPU ID表示運(yùn)行在該CPU ID對應(yīng)的CPU上的任務(wù)鎖定了互斥鎖;第一休眠模塊,用于若讀取的CHJ ID與自身所在CRJ的CRJ ID相同,則進(jìn)入休眠狀態(tài)。7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置還包括: 鎖定模塊,用于若檢測到臨界區(qū)的互斥鎖是處于未鎖定狀態(tài),則鎖定互斥鎖; 第一CPU ID修改模塊,用于將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為自身所在CPU的CPUID; 訪問模塊,用于對臨界區(qū)進(jìn)行訪問。8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括: 第二CPU ID修改模塊,用于所述訪問模塊對臨界區(qū)進(jìn)行訪問之后,釋放互斥鎖之前,將互斥鎖的信息區(qū)內(nèi)的CPU ID更改為預(yù)設(shè)無效值,該預(yù)設(shè)無效值用于表示互斥鎖未被任何CPU上的任務(wù)鎖定; 預(yù)設(shè)無效值確定模塊,用于所述第一休眠模塊若讀取的CPU ID與自身所在CHJ的CPUID相同,則進(jìn)入休眠狀態(tài)之前,確定讀取的CPU ID不是預(yù)設(shè)無效值。9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述裝置還包括: 繼續(xù)讀取模塊,用于若讀取的CPU ID為預(yù)設(shè)無效值,則繼續(xù)讀取互斥鎖的信息區(qū)內(nèi)存儲的CPU ID; 第二休眠模塊,用于若連續(xù)第一預(yù)設(shè)次數(shù)讀取的CPU ID均為預(yù)設(shè)無效值,則進(jìn)入休眠狀態(tài)。10.根據(jù)權(quán)利要求6-9中任一所述的裝置,其特征在于,所述裝置還包括: 記錄模塊,用于若讀取的CRJ ID與自身的CRJ ID不相同,將記錄的輪詢次數(shù)加一; 判斷模塊,用于判斷輪詢次數(shù)是否大于或等于第二預(yù)設(shè)次數(shù); 第三休眠模塊,用于若輪詢次數(shù)大于或等于第二預(yù)設(shè)次數(shù),則進(jìn)入休眠狀態(tài); 返回模塊,用于若輪詢次數(shù)小于第二預(yù)設(shè)次數(shù),則觸發(fā)鎖定狀態(tài)檢測模塊檢測臨界區(qū)的互斥鎖是否處于被鎖定狀態(tài)。
【文檔編號】G06F9/52GK105824709SQ201610140580
【公開日】2016年8月3日
【申請日】2016年3月11日
【發(fā)明人】吳惠敏
【申請人】浙江大華技術(shù)股份有限公司