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