本發(fā)明涉及計算機技術(shù)領(lǐng)域,尤其涉及一種執(zhí)行臨界區(qū)操作的方法及裝置。
背景技術(shù):
無內(nèi)部互鎖流水級的微處理器(microprocessorwithoutinterlockedpipedstages,mips)是一種精簡指令集(reducedinstructionsetcomputer,risc)體系中央處理器(centralprocessingunit,cpu)。其中,mips逐漸發(fā)展為多核處理器。
多核mips的多個物理核之間通常通過使用共享內(nèi)存的方式進行通信。其中,不同的物理核雖然可以同時讀取同一塊內(nèi)存中的同一個數(shù)據(jù),同一塊內(nèi)存中的同一個數(shù)據(jù)稱為共享數(shù)據(jù);但是,當不同的物理核同時對共享數(shù)據(jù)進行寫操作時,會同時產(chǎn)生多個對該共享數(shù)據(jù)執(zhí)行寫操作的指令;此時,cpu無法保證這些指令的時序。如此,在執(zhí)行上述多個指令后,共享數(shù)據(jù)則會被破壞,并影響臨界區(qū)操作的安全性。臨界區(qū)操作是指一個物理核對共享數(shù)據(jù)進行的寫操作。
現(xiàn)有技術(shù)可以采用以下方式避免共享數(shù)據(jù)被破壞,保證臨界區(qū)操作的安全性。具體的,當前物理核在對共享數(shù)據(jù)執(zhí)行臨界區(qū)操作前,嘗試獲取針對該共享數(shù)據(jù)的鎖;若獲取到鎖,則直接對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作;若未獲取到鎖,則表示其他物理核已獲得該鎖并正在對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作,當前物理核則開始等待直至其他物理核釋放該鎖。其中,使用上述鎖機制雖然可以保證臨界區(qū)操作的安全性;但是,額外加入鎖機制會增加數(shù)據(jù)處理的復雜性,增加系統(tǒng)性能開銷,造成對內(nèi)存資源的冗余占用。
技術(shù)實現(xiàn)要素:
本發(fā)明的實施例提供一種執(zhí)行臨界區(qū)操作的方法及裝置,可以在保證臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞的同時,簡化數(shù)據(jù)處理過程,減少系統(tǒng)性能開銷,減少對內(nèi)存資源的冗余占用。
為達到上述目的,本發(fā)明的實施例采用如下技術(shù)方案:
第一方面,本申請實施例提供一種執(zhí)行臨界區(qū)操作的方法,可以應用于無內(nèi)部互鎖流水級的微處理器mips平臺,具體方法包括:讀取第一內(nèi)存中用于存儲地址的至少一個指針結(jié)構(gòu)體,該第一內(nèi)存為存儲共享數(shù)據(jù)的內(nèi)存,該至少一個指針結(jié)構(gòu)體在上述第一內(nèi)存中的存儲位置是預設的;如果該第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,則采用鏈接加載指令和條件存儲指令,嘗試將第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值;其中,第一值指示共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作,第二值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作;在成功將該第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值后,對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。
本申請實施例中,由于mips平臺中內(nèi)存中的指針結(jié)構(gòu)體中預設比特位的值一般而言是固定的;因此,可以通過第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值的變化來指示共享數(shù)據(jù)當前是否被執(zhí)行臨界區(qū)操作。并且,通過mips平臺上的通用鏈接加載指令和條件存儲指令,可以實現(xiàn)對一些簡單的操作的原子性,即可以保證只能有一個物理核對該第一內(nèi)存中的第一指針結(jié)構(gòu)體進行修改;如此,在將第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值后,該第一指針結(jié)構(gòu)體便可以指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,具體為第二值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,其他物理核便不能操作該共享數(shù)據(jù),如此便可以保證臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞。
綜上所述,本申請實施例提供的執(zhí)行臨界區(qū)操作的方法,可以利用mips平臺中的指針結(jié)構(gòu)體,以及鏈接加載指令和條件存儲指令的特性,實現(xiàn)對臨界區(qū)操作的安全性的保護。相較于現(xiàn)有技術(shù)的方案,不需要增加額外的鎖機制,如此便可以在保證臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞的同時,簡化數(shù)據(jù)處理過程,減少系統(tǒng)性能開銷,減少對內(nèi)存資源的冗余占用。
示例性的,第一值指示共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作,具體可以為:第一指針結(jié)構(gòu)體中預設比特位的值未被修改。第二值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,具體可以為:第一指針結(jié)構(gòu)體中預設比特位的值已被修改。
其中,mips平臺中內(nèi)存中用于存儲地址的指針結(jié)構(gòu)體中預設比特位的值在正常情況下為固定值。
舉例來說,mips平臺中內(nèi)存中用于存儲地址的指針結(jié)構(gòu)體轉(zhuǎn)換成2進制后,其低2比特位的值為00。即上述指針結(jié)構(gòu)體的第0比特(比特)位和第1比特位的值均為0。即正常情況下上述指針結(jié)構(gòu)體的低2比特位的值是固定不變的,具體為00。
本申請實施例這里以指針結(jié)構(gòu)體中預設比特位為該指針結(jié)構(gòu)體的低2比特位為例,對第一值和第二值進行說明:
當指針結(jié)構(gòu)體中預設比特位為該指針結(jié)構(gòu)體的低2比特位時,第一值為00,第二值可以為01、10或11中任一個。
可選的,本申請實施例中可以采用匯編語言實現(xiàn)上述執(zhí)行臨界區(qū)操作的方法。
其中,“采用鏈接加載指令和條件存儲指令,嘗試將所述第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值”具體可以包括:采用鏈接加載指令將該第一內(nèi)存中的第一指針結(jié)構(gòu)體加載至第一通用寄存器;將該第一通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值;采用條件存儲指令,嘗試將該第一通用寄存器中的第一指針結(jié)構(gòu)體寫入上述第一內(nèi)存。
需要強調(diào)的是,對于此處寫入第一內(nèi)存的第一指針結(jié)構(gòu)體來說,該第一指針結(jié)構(gòu)體中預設比特位的值為第二值,該第二值指示該共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作。
其中,上述步驟“成功將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值”,具體為:成功將第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存。
本申請實施例中,當?shù)谝粌?nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值時,則表示當前沒有其他物理核對第一內(nèi)存中的第一指針結(jié)構(gòu)體進行操作,也表示當前沒有其他物理核對共享數(shù)據(jù)進行操作;此時,則可以采用鏈接加載指令和條件存儲指令,通過第一通用寄存器,嘗試將第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值。在成功將第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存,即成功將第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值后,第一內(nèi)存中的第一指針結(jié)構(gòu)體便可以向其他物理核指示:該共享數(shù)據(jù)當前正在被執(zhí)行臨界區(qū)操作;此時,其他物理核便不能再對第一內(nèi)存中的第一指針結(jié)構(gòu)體進行操作,如此便可以保證臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞。
可以想到的是,在完成對共享數(shù)據(jù)的臨界區(qū)操作后,由于第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值仍為第二值,即該第一指針結(jié)構(gòu)體仍然指示該共享數(shù)據(jù)當前正在被執(zhí)行臨界區(qū)操作,因此其他物理核則不能對該共享數(shù)據(jù)進行操作。
可選的,為了在完成對共享數(shù)據(jù)的臨界區(qū)操作后,使得其他物理核可以對該共享數(shù)據(jù)執(zhí)行其臨界區(qū)操作,本申請實施例的方法還可以包括:在完成對共享數(shù)據(jù)的臨界區(qū)操作后,將該第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值。
可選的,與上述描述中“采用鏈接加載指令和條件存儲指令,嘗試將所述第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值”的方法類似,本申請實施例這里也可以通過匯編語言的方式,在完成對該共享數(shù)據(jù)的臨界區(qū)操作后,實現(xiàn)“將所述第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為所述第一值”的操作。
具體的方法可以包括:采用鏈接加載指令將該第一內(nèi)存中第一指針結(jié)構(gòu)體加載至第二通用寄存器;將該第二通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值;采用條件存儲指令,將該第二通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存。
需要強調(diào)的是,對于此處寫入第一內(nèi)存的第一指針結(jié)構(gòu)體來說,該第一指針結(jié)構(gòu)體中預設比特位的值為第一值,該第一值指示該共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作。
其中,這里的第二通用寄存器與上述第一通用寄存器可以為不同的通用寄存器,也可以為同一通用寄存器。
進一步的,第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值可以均為第一值;當然,也可能會存在該至少一個指針結(jié)構(gòu)體中的一個指針結(jié)構(gòu)體中預設比特位的值被修改為第二值的情況。對此,本申請實施例的方法還可以包括:如果至少一個指針結(jié)構(gòu)體中的任一指針結(jié)構(gòu)體中預設比特位的值為第二值,則返回執(zhí)行讀取第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體的步驟,直至讀取到該至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值。
其中,當?shù)谝粌?nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值時,則表示該至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均未被修改,共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作;而當至少一個指針結(jié)構(gòu)體中的任一指針結(jié)構(gòu)體中預設比特位的值為第二值時,則表示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,則表示多核mips中的一個物理核正在對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。
此時,為了保證上述物理核執(zhí)行其臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞,則需要等到上述物理核執(zhí)行完該物理核的臨界區(qū)操作,才能夠執(zhí)行“采用鏈接加載指令和條件存儲指令,嘗試將第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值”的步驟,進而在成功修改第一指針結(jié)構(gòu)體中預設比特位的值后,再執(zhí)行對應的臨界區(qū)操作。由此,則可以返回執(zhí)行“讀取第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體”的步驟,直至讀取到該至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,則表示上述物理核已經(jīng)完該物理核的臨界區(qū)操作,此時共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作。
進一步的,可能會存在至少兩個物理核同時確定第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,即至少兩個物理核同時確定一共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作的情況。并且,該至少兩個物理核可能會同時嘗試將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,使得在修改成功后該第一指針結(jié)構(gòu)體中預設比特位的值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。但是,由上述描述可知,只會有一個物理核成功修改上述第一指針結(jié)構(gòu)體中預設比特位的值,并在成功修改該第一指針結(jié)構(gòu)體中預設比特位的值后,其他物理核則不能再對該第一指針結(jié)構(gòu)體進行操作。
基于此,本申請實施例的方法還可以包括:如果未成功將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,則返回執(zhí)行讀取所述第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體的步驟,直至讀取到至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值。
第二方面,本申請實施例提供一種執(zhí)行臨界區(qū)操作的裝置,應用于無內(nèi)部互鎖流水級的微處理器mips平臺,該裝置包括:
讀取模塊,用于讀取第一內(nèi)存中用于存儲地址的至少一個指針結(jié)構(gòu)體,該第一內(nèi)存為存儲共享數(shù)據(jù)的內(nèi)存,該至少一個指針結(jié)構(gòu)體在該第一內(nèi)存中的存儲位置是預設的;
修改模塊,用于如果上述讀取模塊讀取的第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,則采用鏈接加載指令和條件存儲指令,嘗試將該第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,本申請實施例中的第一值指示共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作,本申請實施例中的第二值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作;
執(zhí)行模塊,用于在上述修改模塊成功將上述第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值后,對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。
可選的,上述修改模塊,具體用于:
采用鏈接加載指令將該第一內(nèi)存中的第一指針結(jié)構(gòu)體加載至第一通用寄存器;
將該第一通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值;
采用條件存儲指令,嘗試將該第一通用寄存器中的第一指針結(jié)構(gòu)體寫入該第一內(nèi)存。
其中,上述修改模塊成功將該第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,具體為:修改模塊成功將該第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存。
可選的,所述修改模塊,還用于:
在上述執(zhí)行模塊完成對所述共享數(shù)據(jù)的臨界區(qū)操作后,將該第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值。
可選的,上述修改模塊,具體用于:
采用鏈接加載指令將該第一內(nèi)存中第一指針結(jié)構(gòu)體加載至第二通用寄存器;
將該第二通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值;
采用條件存儲指令,將該第二通用寄存器中的第一指針結(jié)構(gòu)體寫入該第一內(nèi)存。
可選的,上述讀取模塊,還用于:
如果上述至少一個指針結(jié)構(gòu)體中的任一指針結(jié)構(gòu)體中預設比特位的值為第二值,則返回執(zhí)行“讀取第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體”的步驟,直至讀取到至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值。
可選的,上述讀取模塊,還用于:
如果上述修改模塊未成功將該第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,則返回執(zhí)行“讀取第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體”的步驟,直至讀取到至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值。
需要說明的是,上述各個方面中的指針結(jié)構(gòu)體、鏈接加載指令以及條件存儲指令的詳細描述如下所示:
在一種可能的實現(xiàn)方式中,mips平臺中每個指針結(jié)構(gòu)體的長度均為4字節(jié);此時,鏈接加載指令為整字加載的鏈接加載ll指令,條件存儲指令為整字加載的條件存儲sc指令。
示例性的,在32位mipscpu中,本申請實施例中的鏈接加載指令為ll指令,條件存儲指令為sc指令。
在另一種可能的實現(xiàn)方式中,mips平臺中每個指針結(jié)構(gòu)體的長度均為8字節(jié);鏈接加載指令為雙字鏈接加載dll指令,條件存儲指令為雙字條件存儲dsc指令。
示例性的,在64位mipscpu中,本申請實施例中的鏈接加載指令為dll指令,條件存儲指令為dsc指令。
第三方面,本申請實施例提供一種非易失性存儲介質(zhì),該非易失性存儲介質(zhì)中存儲有一個或多個程序代碼,當mips平臺執(zhí)行該程序代碼時,該mips平臺執(zhí)行如上述第一方面及其任一種可能的實現(xiàn)方式中所述的執(zhí)行臨界區(qū)操作的方法。
需要說明的是,本申請實施例第二方面、第三方面及其各種可能的實現(xiàn)方式的有益效果可以參考第一方面及其各種可能的實現(xiàn)方式中的對應技術(shù)效果,此處不再贅述。
附圖說明
為了更清楚地說明本申請實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為現(xiàn)有技術(shù)中通過mips平臺上的鏈接加載指令和條件存儲指令,實現(xiàn)對臨界區(qū)操作的安全性保護的方法流程圖;
圖2為本申請實施例提供的一種執(zhí)行臨界區(qū)操作的方法的流程圖;
圖3為本申請實施例提供的另一種執(zhí)行臨界區(qū)操作的方法的流程圖;
圖4為本申請實施例提供的另一種執(zhí)行臨界區(qū)操作的方法的流程圖;
圖5為本申請實施例提供的另一種執(zhí)行臨界區(qū)操作的方法的流程圖;
圖6為本申請實施例提供的另一種執(zhí)行臨界區(qū)操作的方法的流程圖;
圖7為本申請實施例提供的另一種執(zhí)行臨界區(qū)操作的方法的流程圖;
圖8為本申請實施例提供的一種執(zhí)行臨界區(qū)操作的裝置的結(jié)構(gòu)組成示意圖。
具體實施方式
本發(fā)明的說明書以及附圖中的術(shù)語“第一”和“第二”等是用于區(qū)別不同的對象,或者用于區(qū)別對同一對象的不同處理,而不是用于描述對象的特定順序。例如,第一通用寄存器和第二通用寄存器可以為不同的通用寄存器。
在本發(fā)明的描述中,除非另有說明,“多個”的含義是指兩個或兩個以上。例如,多核處理器是指包含兩個或兩個以上物理核的處理器。
此外,本發(fā)明的描述中所提到的術(shù)語“包括”和“具有”以及它們的任何變形,意圖在于覆蓋不排他的包含。例如包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設備沒有限定于已列出的步驟或單元,而是可選地還包括其他沒有列出的步驟或單元,或可選地還包括對于這些過程、方法、產(chǎn)品或設備固有的其它步驟或單元。
以下描述中,為了說明而不是為了限定,提出了諸如特定系統(tǒng)結(jié)構(gòu)、接口、技術(shù)之類的具體細節(jié),以便透切理解本發(fā)明。然而,本領(lǐng)域的技術(shù)人員應當清楚,在沒有這些具體細節(jié)的其它實施例中也可以實現(xiàn)本發(fā)明。在其它情況中,省略對眾所周知的裝置、電路以及方法的詳細說明,以免不必要的細節(jié)妨礙本發(fā)明的描述。
本申請實施例提供的一種執(zhí)行臨界區(qū)操作的方法及裝置可以應用于無內(nèi)部互鎖流水級的微處理器(microprocessorwithoutinterlockedpipedstages,mips)平臺的數(shù)據(jù)處理過程中。其中,mips為多核處理器。
其中,通過mips平臺上的鏈接加載指令和條件存儲指令,在執(zhí)行鏈接加載指令和條件存儲指令的間隙,可以實現(xiàn)對指定內(nèi)存操作的原子性,如本申請中對共享內(nèi)存數(shù)據(jù)的操作的原子性。其中,實現(xiàn)對共享數(shù)據(jù)的操作的原子性具體是指:一個物理核對共享數(shù)據(jù)的一次讀或?qū)懖僮魇遣豢煞指?、不可中斷、不被干擾的,保證該物理核對該共享數(shù)據(jù)的一次讀或?qū)懖僮鞯恼_完成。即實現(xiàn)對共享數(shù)據(jù)的操作的原子性,便可以實現(xiàn)一些簡單的臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞。其中,上述簡單的臨界區(qū)操作可以包括:修改通用寄存器中存儲的數(shù)據(jù),該數(shù)據(jù)可以為一個指針結(jié)構(gòu)體。本申請實施例中的指針結(jié)構(gòu)體存儲于內(nèi)存中,用于存儲地址。
示例性的,以下以上述臨界區(qū)操作修改通用寄存器中的指針結(jié)構(gòu)體為例,對通過mips平臺上的鏈接加載指令和條件存儲指令,實現(xiàn)對臨界區(qū)操作的安全性保護的方法進行說明:
如圖1所示,通過mips平臺上的鏈接加載指令和條件存儲指令,實現(xiàn)對臨界區(qū)操作的安全性保護的方法可以包括:sa、采用mips平臺中的鏈接加載指令將一內(nèi)存中的指針結(jié)構(gòu)體加載到一通用寄存器;sb、修改該通用寄存器中的指針結(jié)構(gòu)體;sc、嘗試通過條件存儲指令將通用寄存器中的指針結(jié)構(gòu)體寫回上述內(nèi)存。
本申請實施例提供的執(zhí)行臨界區(qū)操作的方法及裝置可以利用mips平臺中的兩個標準,包括mips標準1和mips標準2,保證臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞。
mips標準1參見上述描述:通過mips平臺上的通用鏈接加載指令和條件存儲指令,可以實現(xiàn)對一些簡單的操作的原子性,即保證臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞。
mips標準2為:mips平臺中內(nèi)存中用于存儲地址的指針結(jié)構(gòu)體轉(zhuǎn)換成2進制后,其低2比特位的值為00,即該用于存儲地址的指針結(jié)構(gòu)體轉(zhuǎn)換成2進制后,第0比特位和第1比特位的值均為0。
具體的,由于mips平臺中在加載指針結(jié)構(gòu)體時,必須是整字加載(即一次性從內(nèi)存中讀取4字節(jié)的內(nèi)容),即4字節(jié)對齊;或者,雙字加載(即一次性從內(nèi)存中讀取8字節(jié)的內(nèi)容),即8字節(jié)對齊;因此,可以得出:mips平臺中,每次讀取的指針結(jié)構(gòu)體則必須以16進制的0、4、8、c中的任一個結(jié)束。
并且,由于c語言中約定了32位系統(tǒng)下使用的指針長度均是4字節(jié),64位系統(tǒng)下使用的指針長度均是8字節(jié);因此,在將mips平臺中每次讀取的指針結(jié)構(gòu)體轉(zhuǎn)換成2進制后,其低2比特位的值為00。如16進制的0可以轉(zhuǎn)換為2進制的0000,16進制的4可以轉(zhuǎn)換為2進制的0100,16進制的8可以轉(zhuǎn)換為2進制的1000,16進制的c可以轉(zhuǎn)換為2進制的1100。
需要說明的是,本申請實施例中的鏈接加載指令為整字鏈接加載(loadlink,ll)指令,條件存儲指令為整字條件存儲(storeconditional,sc)指令;或者,鏈接加載指令為雙字鏈接加載(loadlinkeddoubleword,dll)指令,條件存儲指令為雙字條件存儲(storeconditionaldoubleword,dsc)指令。其中,鏈接加載指令和條件存儲指令的具體描述可以參考本申請實施例后續(xù)的相關(guān)描述,此處不再贅述。
本申請實施例提供的執(zhí)行臨界區(qū)操作的方法的執(zhí)行主體可以為mips平臺,或者該mips平臺中用于執(zhí)行上述執(zhí)行臨界區(qū)操作的方法的裝置,如執(zhí)行臨界區(qū)操作的裝置。該執(zhí)行臨界區(qū)操作的裝置可以為mips中的任一物理核。
下面將結(jié)合本申請實施例中的附圖,通過具體的實施例及其應用場景對本申請實施例提供的一種執(zhí)行臨界區(qū)操作的方法及裝置進行詳細地說明。顯然,所描述的實施例僅僅是本發(fā)明的一部分實施例,而不是全部實施例。
實施例一
本申請實施例提供一種執(zhí)行臨界區(qū)操作的方法,應用于mips平臺,如圖2所示,該執(zhí)行臨界區(qū)操作的方法包括:
s101、執(zhí)行臨界區(qū)操作的裝置讀取第一內(nèi)存中用于存儲地址的至少一個指針結(jié)構(gòu)體。
其中,第一內(nèi)存為存儲共享數(shù)據(jù)的內(nèi)存,上述至少一個指針結(jié)構(gòu)體在該第一內(nèi)存中的存儲位置是預設的,并且上述至少一個指針結(jié)構(gòu)體是指預設的在第一內(nèi)存中為實現(xiàn)本實施例提供的執(zhí)行臨界區(qū)操作的方法而使用到的指針結(jié)構(gòu)體。
示例性的,由上述mips標準2可知:mips平臺中內(nèi)存中用于存儲地址的指針結(jié)構(gòu)體轉(zhuǎn)換成2進制后,其低2比特位的值為00;因此,執(zhí)行臨界區(qū)操作的裝置可以采用鏈接加載指令和條件存儲指令,修改指針結(jié)構(gòu)體中第0比特位和第1比特位中至少一個比特位的值,以實現(xiàn)本申請實施例中的執(zhí)行臨界區(qū)操作的方法。具體的,本申請實施例的方法還包括s102:
s102、如果第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,執(zhí)行臨界區(qū)操作的裝置則采用鏈接加載指令和條件存儲指令,嘗試將第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值。
其中,第一值指示共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作,第二值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。
示例性的,在本申請實施例中,對于任一指針結(jié)構(gòu)體而言,該指針結(jié)構(gòu)體的預設比特位可以為該指針結(jié)構(gòu)體的第0比特位或者第1比特位;當然,該指針結(jié)構(gòu)體的預設比特位也可以包括該指針結(jié)構(gòu)體的第0比特位和第1比特位。
以指針結(jié)構(gòu)體的預設比特位包括指針結(jié)構(gòu)體的第0比特位和第1比特位為例,第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,具體可以為:該至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為00;該至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值為第二值,具體可以為:該至少一個指針結(jié)構(gòu)體中第一指針結(jié)構(gòu)體中預設比特位的值均為01、10或11中的任一個。
在本申請實施例中,執(zhí)行臨界區(qū)操作的方法裝置可以利用上述mips標準1中條件存儲指令和條件存儲指令,將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,如此便可以通過條件存儲指令和條件存儲指令的原子性,保證只能有一個物理核修改第一指針結(jié)構(gòu)體中預設比特位的值。因此,若一物理核修改了第一指針結(jié)構(gòu)體中預設比特位的值,其他物理核則不能再對第一指針結(jié)構(gòu)體中預設比特位的值進行修改。
由此可見,如果第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,即共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作;執(zhí)行臨界區(qū)操作的裝置便可以采用鏈接加載指令和條件存儲指令,嘗試將至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,以使該第一指針結(jié)構(gòu)體中預設比特位的值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。
s103、執(zhí)行臨界區(qū)操作的裝置在成功將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值后,對共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。
可以想到的是,可能存在至少兩個物理核同時確定第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,即至少兩個物理核同時確定一共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作;此時,這至少兩個物理核均會去修改第一指針結(jié)構(gòu)體中預設比特位的值,使得第一指針結(jié)構(gòu)體中預設比特位的值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。但是,根據(jù)上述mips標準1中條件存儲指令和條件存儲指令的原子性的要求,只會有一個物理核成功修改第一指針結(jié)構(gòu)體中預設比特位的值,并在該物理核成功修改第一指針結(jié)構(gòu)體中預設比特位的值后,其他物理核則不能再對第一指針結(jié)構(gòu)體中預設比特位的值進行操作。
由此可見,若執(zhí)行臨界區(qū)操作的裝置成功修改第一指針結(jié)構(gòu)體中預設比特位的值,則表示該第一指針結(jié)構(gòu)體中預設比特位的值沒有被其他物理核修改,且其他物理核不能再對第一指針結(jié)構(gòu)體中預設比特位的值進行操作。并且,其他物理核再次讀取至少一個指針結(jié)構(gòu)體時,則該至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值一定會指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,其他物理核便不能對該共享數(shù)據(jù)進行操作,如此便可以保證臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞。
本申請實施例提供的執(zhí)行臨界區(qū)操作的方法,可以利用上述mips標準2:mips平臺中內(nèi)存中的指針結(jié)構(gòu)體中預設比特位的值一般而言是固定的;通過第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值的變化來指示共享數(shù)據(jù)當前是否被執(zhí)行臨界區(qū)操作。
并且,可以利用上述mips標準1保證只能有一個物理核對該第一內(nèi)存中的第一指針結(jié)構(gòu)體進行修改。并且,在將第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值后,該第一指針結(jié)構(gòu)體便可以指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,具體為第二值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,其他物理核便不能操作該共享數(shù)據(jù),如此便可以保證臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞。
綜上所述,本申請實施例提供的執(zhí)行臨界區(qū)操作的方法,可以利用mips平臺中的指針結(jié)構(gòu)體,以及鏈接加載指令和條件存儲指令的特性,實現(xiàn)對臨界區(qū)操作的安全性的保護。相較于現(xiàn)有技術(shù)的方案,不需要增加額外的鎖機制,如此便可以在保證臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞的同時,簡化數(shù)據(jù)處理過程,減少系統(tǒng)性能開銷,減少對內(nèi)存資源的冗余占用。
示例性的,在本申請實施例的一種應用場景中,mips平臺中每個指針結(jié)構(gòu)體的長度可以均為4字節(jié),且mips平臺中使用的指針均4字節(jié)對齊。
在這種應用場景中,鏈接加載指令為整字加載的ll指令,條件存儲指令為整字加載的sc指令。
在本申請實施例的另一種應用場景中,mips平臺中每個指針結(jié)構(gòu)體長度可以均為8字節(jié),且mips平臺中使用的指針均8字節(jié)對齊。
在這種應用場景中,鏈接加載指令為dll指令,條件存儲指令為dsc指令。
其中,在32位mipscpu中,使用整字ll指令和整字sc指令實現(xiàn)對臨界區(qū)操作安全性的保護;在64位mipscpu中,使用dll指令和dsc指令實現(xiàn)對臨界區(qū)操作安全性的保護。
本申請實施例中不僅可以通過整字ll指令和整字sc指令實現(xiàn)對臨界區(qū)操作安全性的保護;還可以通過dll指令和dsc指令實現(xiàn)對臨界區(qū)操作安全性的保護。
其中,本申請實施例中可以采用c語言實現(xiàn)上述s101-s103的方法步驟,也可以采用匯編語言實現(xiàn)上述s101-s103的方法步驟,本申請實施例對此并不限定。
示例性的,以第一值為00,第二值為01為例,采用c語言實現(xiàn)上述s102的代碼具體可以為:
if(addr&0x01==0x00)//判斷第一內(nèi)存中至少一個指針結(jié)構(gòu)體中的任一指針結(jié)構(gòu)體中低2比特位的值是否為00//
{
addr=addr|0x01//條件成立,則表示該至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中2比特位的值均沒有被修改,則將任一指針結(jié)構(gòu)體的第0比特位置1//
}
else
{
//條件成立,則表示該至少一個指針結(jié)構(gòu)體中有一個指針結(jié)構(gòu)體中2比特位的值被修改了;
}
示例性的,若采用匯編語言實現(xiàn)上述s102,如圖3所示,圖2所示的s102可以包括s102a-:
s102a、如果第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,執(zhí)行臨界區(qū)操作的裝置采用鏈接加載指令將該第一內(nèi)存中的第一指針結(jié)構(gòu)體加載至第一通用寄存器。
其中,本申請實施例中的第一通用寄存器可以為執(zhí)行臨界區(qū)操作的裝置能夠使用的任一通用寄存器。
s102b、執(zhí)行臨界區(qū)操作的裝置將該第一通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值。
示例性的,執(zhí)行臨界區(qū)操作的裝置可以將該第一通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為01、10或者11中的任一個,如此其他物理核讀取到第一指針結(jié)構(gòu)體中預設比特位的值為01、10或者11中的任一個時,則可以確定共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,其他物理核則不會操作該共享數(shù)據(jù),如此便可以保證臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞。
s102c、執(zhí)行臨界區(qū)操作的裝置采用條件存儲指令,嘗試將該第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存。
其中,該執(zhí)行臨界區(qū)操作的裝置能夠成功將第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存,則表示該執(zhí)行臨界區(qū)操作的裝置成功將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值。
需要強調(diào)的是,對于此處寫入第一內(nèi)存的第一指針結(jié)構(gòu)體來說,該第一指針結(jié)構(gòu)體中預設比特位的值為第二值,該第二值指示該共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作。
相應的,如圖3所示,圖2所示的s103可以替換為s103′:
s103′、執(zhí)行臨界區(qū)操作的裝置在成功將第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存后,對共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。
進一步的,在該執(zhí)行臨界區(qū)操作的裝置完成對共享數(shù)據(jù)的臨界區(qū)操作后,由于第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值仍為第二值,即該第一指針結(jié)構(gòu)體仍然指示該共享數(shù)據(jù)當前正在被執(zhí)行臨界區(qū)操作,因此其他物理核則不能對該共享數(shù)據(jù)進行操作。
為了在該執(zhí)行臨界區(qū)操作的裝置在完成對共享數(shù)據(jù)的臨界區(qū)操作后,其他物理核可以對該共享數(shù)據(jù)執(zhí)行其臨界區(qū)操作,該執(zhí)行臨界區(qū)操作的裝置可以及時修改第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值,使得該第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值指示共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作。
具體的,如圖4所示,在s103之后,本申請實施例的方法還可以包括s104:
s104、執(zhí)行臨界區(qū)操作的裝置在完成對共享數(shù)據(jù)的臨界區(qū)操作后,將該第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值。
同樣的,本申請實施例中可以采用c語言實現(xiàn)上述s104中的方法,也可以采用匯編語言實現(xiàn)上述s104中的方法。
示例性的,以第一值為00,第二值為01為例,采用c語言實現(xiàn)上述s104的代碼具體可以為:
addr=addr&0x00//將第一指針結(jié)構(gòu)體的第0比特位置0//
示例性的,若采用匯編語言實現(xiàn)上述s104,如圖5所示,圖4所示的s104可以包括s104a-s104c:
s104a、執(zhí)行臨界區(qū)操作的裝置在完成對共享數(shù)據(jù)的臨界區(qū)操作后,采用鏈接加載指令將該第一內(nèi)存中第一指針結(jié)構(gòu)體加載至第二通用寄存器。
s104b、執(zhí)行臨界區(qū)操作的裝置將該第二通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值。
s104c、執(zhí)行臨界區(qū)操作的裝置采用條件存儲指令,將該第二通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存。
需要強調(diào)的是,對于此處寫入第一內(nèi)存的第一指針結(jié)構(gòu)體來說,該第一指針結(jié)構(gòu)體中預設比特位的值為第一值,該第一值指示該共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作。
其中,本申請實施例中的第二通用寄存器與上述第一通用寄存器可以為不同的兩個通用寄存器。
進一步的,執(zhí)行臨界區(qū)操作的裝置在讀取第一內(nèi)存中的至少一個指針結(jié)構(gòu)體時,其他物理核可能已將該至少一個指針結(jié)構(gòu)體中的一個指針結(jié)構(gòu)體中預設比特位的值修改為第二值了;此時,該執(zhí)行臨界區(qū)操作的裝置則會讀取到該至少一個指針結(jié)構(gòu)體中的一個指針結(jié)構(gòu)體中預設比特位的值為第二值,則表示上述其他物理核正在對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。如此,為了保證上述物理核執(zhí)行其臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞;該執(zhí)行臨界區(qū)操作的裝置此時不能執(zhí)行臨界區(qū)操作,需要等到上述物理核執(zhí)行完該物理核的臨界區(qū)操作后,才能夠執(zhí)行本申請實施例中的臨界區(qū)操作。
具體的,如圖6所示,本申請實施例的方法還包括s105:
s105、如果至少一個指針結(jié)構(gòu)體中的任一指針結(jié)構(gòu)體中預設比特位的值為第二值,執(zhí)行臨界區(qū)操作的裝置則返回執(zhí)行s101及s101后續(xù)相應流程。
可以想到的,如果至少一個指針結(jié)構(gòu)體中的任一指針結(jié)構(gòu)體中預設比特位的值為第二值,則表示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作,則表示多核mips中的一個物理核正在對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。如此,為了保證上述物理核執(zhí)行其臨界區(qū)操作的安全性,以保護共享數(shù)據(jù)不被破壞;執(zhí)行臨界區(qū)操作的裝置此時不能執(zhí)行臨界區(qū)操作,而是繼續(xù)讀取第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體,直至讀取到該至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,則表示上述物理核已經(jīng)完該物理核的臨界區(qū)操作,此時共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作。
進一步的,可能會存在至少兩個物理核同時確定一共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作,并同時嘗試將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,使得在修改成功后該第一指針結(jié)構(gòu)體中預設比特位的值指示共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。但是,由mips標準1可知,只會有一個物理核可以成功將上述第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,并在成功修改該第一指針結(jié)構(gòu)體中預設比特位的值后,其他物理核則不能再對該第一指針結(jié)構(gòu)體進行操作。
由此可見,若該執(zhí)行臨界區(qū)操作的裝置未能成功將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,則表示其他物理核已修改了該第一指針結(jié)構(gòu)體中預設比特位的值,該共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。此時,為了保證臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞,執(zhí)行臨界區(qū)操作的裝置則不能對該對共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。具體的,如圖7所示,本申請實施例的方法還包括s106:
s106、如果執(zhí)行臨界區(qū)操作的裝置未成功將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,則返回執(zhí)行s101及s101后續(xù)相應流程。
本申請實施例提供的執(zhí)行臨界區(qū)操作的方法,可以利用mips平臺中的指針結(jié)構(gòu)體,以及鏈接加載指令和條件存儲指令的特性,實現(xiàn)對臨界區(qū)操作的安全性的保護。相較于現(xiàn)有技術(shù)的方案,不需要增加額外的鎖機制,如此便可以在保證臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞的同時,簡化數(shù)據(jù)處理過程,減少系統(tǒng)性能開銷,減少對內(nèi)存資源的冗余占用。
進一步的,本申請實施例可以在完成對共享數(shù)據(jù)的臨界區(qū)操作后,及時將第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值,使得其他物理核可以對該共享數(shù)據(jù)執(zhí)行其臨界區(qū)操作。
實施例二
本申請實施例提供一種執(zhí)行臨界區(qū)操作的裝置,應用于無內(nèi)部互鎖流水級的微處理器mips平臺。
如圖8所示,該執(zhí)行臨界區(qū)操作的裝置包括:讀取模塊21、修改模塊22和執(zhí)行模塊23。
讀取模塊21,用于讀取第一內(nèi)存中用于存儲地址的至少一個指針結(jié)構(gòu)體,該第一內(nèi)存為存儲共享數(shù)據(jù)的內(nèi)存,該至少一個指針結(jié)構(gòu)體在所述第一內(nèi)存中的存儲位置是預設的。
修改模塊22,用于如果上述讀取模塊21讀取的第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為第一值,則采用鏈接加載指令和條件存儲指令,嘗試將該第一內(nèi)存中的至少一個指針結(jié)構(gòu)體中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,該第一值指示該共享數(shù)據(jù)當前未被執(zhí)行臨界區(qū)操作,該第二值指示該共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。
執(zhí)行模塊23,用于在上述修改模塊22成功將該第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值后,對該共享數(shù)據(jù)執(zhí)行臨界區(qū)操作。
進一步的,上述修改模塊22,具體用于:
采用鏈接加載指令將該第一內(nèi)存中的第一指針結(jié)構(gòu)體加載至第一通用寄存器;
將該第一通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值;
采用條件存儲指令,嘗試將該第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存。
可以想到的是,此處寫入第一內(nèi)存的第一指針結(jié)構(gòu)體中預設比特位的值為第二值,該第二值指示該共享數(shù)據(jù)當前正被執(zhí)行臨界區(qū)操作。
其中,上述修改模塊22成功將第一指針結(jié)構(gòu)體中預設比特位的值修改為第二值,具體為:上述修改模塊22成功將上述第一通用寄存器中的第一指針結(jié)構(gòu)體寫入第一內(nèi)存。
進一步的,上述修改模塊22,還可以用于在所述執(zhí)行模塊23完成對所述共享數(shù)據(jù)的臨界區(qū)操作后,將所述第一內(nèi)存中的第一指針結(jié)構(gòu)體中預設比特位的值修改為所述第一值。
進一步的,所述修改模塊22,具體可以用于:
采用所述鏈接加載指令將所述第一內(nèi)存中第一指針結(jié)構(gòu)體加載至第二通用寄存器;
將所述第二通用寄存器中的第一指針結(jié)構(gòu)體中預設比特位的值修改為所述第一值;
采用所述條件存儲指令,將所述第二通用寄存器中的第一指針結(jié)構(gòu)體寫入所述第一內(nèi)存。
進一步的,上述讀取模塊21,還可以用于:
如果所述至少一個指針結(jié)構(gòu)體中的任一指針結(jié)構(gòu)體中預設比特位的值為所述第二值,則返回執(zhí)行所述讀取所述第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體的步驟,直至讀取到所述至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為所述第一值。
進一步的,上述讀取模塊21,還可以用于:
如果所述修改模塊22未成功將所述第一指針結(jié)構(gòu)體中預設比特位的值修改為所述第二值,則返回執(zhí)行所述讀取所述第一內(nèi)存中用于存儲地址的至少一個的指針結(jié)構(gòu)體的步驟,直至讀取到所述至少一個指針結(jié)構(gòu)體中的每個指針結(jié)構(gòu)體中預設比特位的值均為所述第一值。
可選的,mips平臺中每個指針結(jié)構(gòu)體的長度均為4字節(jié);鏈接加載指令為整字加載的鏈接加載ll指令,條件存儲指令為整字加載的條件存儲sc指令。
或者,mips平臺中每個指針結(jié)構(gòu)體的長度均為8字節(jié);鏈接加載指令為雙字鏈接加載dll指所述條件存儲指令為雙字條件存儲dsc指令。
需要說明的是,本申請?zhí)峁┑膱?zhí)行臨界區(qū)操作的裝置中具體功能模塊的詳細描述可以參考上述方法實施例中對應方法步驟的詳細描述,此處不再限定。
本申請實施例提供一種非易失性存儲介質(zhì),該非易失性存儲介質(zhì)中存儲有一個或多個程序代碼,當mips平臺執(zhí)行該程序代碼時,該mips平臺執(zhí)行如圖2-圖7中任一附圖所示的執(zhí)行臨界區(qū)操作的方法。
需要說明的是,該程序代碼可以作為運行于mips平臺上的嵌入式操作系統(tǒng)的一個組件,也可以作為運行于mips平臺上的各種應用程序中的一個組件,相對而言,當上述實施例中提供的執(zhí)行臨界區(qū)操作的方法作為嵌入式操作系統(tǒng)的一個組件時,可以無需對應用程序進行修改,實施難度和修改工作量較小。
其中,在具體實現(xiàn)過程中,上述如圖2-7中任一附圖所示的方法流程中的各步驟均可以通過硬件形式的mips平臺執(zhí)行上述非易失性存儲介質(zhì)中存儲的軟件形式的程序代碼實現(xiàn)。上述實施例中的讀取模塊21、修改模塊22和執(zhí)行模塊23的相關(guān)功能均可以通過mips平臺中的cpu實現(xiàn),為避免重復,此處不再贅述。
本申請實施例提供的執(zhí)行臨界區(qū)操作的裝置,可以利用mips平臺中的指針結(jié)構(gòu)體,以及鏈接加載指令和條件存儲指令的特性,實現(xiàn)對臨界區(qū)操作的安全性的保護。相較于現(xiàn)有技術(shù)的方案,不需要增加額外的鎖機制,如此便可以在保證臨界區(qū)操作的安全性,保護共享數(shù)據(jù)不被破壞的同時,簡化數(shù)據(jù)處理過程,減少系統(tǒng)性能開銷,減少對內(nèi)存資源的冗余占用。
進一步的,本申請實施例可以在完成對共享數(shù)據(jù)的臨界區(qū)操作后,及時將第一指針結(jié)構(gòu)體中預設比特位的值修改為第一值,使得其他物理核可以對該共享數(shù)據(jù)執(zhí)行其臨界區(qū)操作。
通過以上的實施方式的描述,所屬領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件的方式來實現(xiàn),當然也可以通過硬件,但很多情況下前者是更佳的實施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在可讀取的存儲介質(zhì)中,如計算機的軟盤,硬盤或光盤等,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務器,或者網(wǎng)絡設備等)執(zhí)行本發(fā)明各個實施例所述的方法。
以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應以所述權(quán)利要求的保護范圍為準。
本領(lǐng)域普通技術(shù)人員將會理解,本發(fā)明的各個方面、或各個方面的可能實現(xiàn)方式可以被具體實施為系統(tǒng)、方法或者計算機程序產(chǎn)品。因此,本發(fā)明的各方面、或各個方面的可能實現(xiàn)方式可以采用完全硬件實施例、完全軟件實施例(包括固件、駐留軟件等等),或者組合軟件和硬件方面的實施例的形式,在這里都統(tǒng)稱為“電路”、“模塊”或者“系統(tǒng)”。此外,本發(fā)明的各方面、或各個方面的可能實現(xiàn)方式可以采用計算機程序產(chǎn)品的形式,計算機程序產(chǎn)品是指存儲在計算機可讀介質(zhì)中的計算機可讀程序代碼。
計算機可讀介質(zhì)可以是計算機可讀信號介質(zhì)或者計算機可讀存儲介質(zhì)。計算機可讀存儲介質(zhì)包含但不限于電子、磁性、光學、電磁、紅外或半導體系統(tǒng)、設備或者裝置,或者前述的任意適當組合,如隨機存取存儲器(ram)、只讀存儲器(rom)、可擦除可編程只讀存儲器(eprom或者快閃存儲器)、光纖、便攜式只讀存儲器(cd-rom)。
計算機中的處理器讀取存儲在計算機可讀介質(zhì)中的計算機可讀程序代碼,使得處理器能夠執(zhí)行在流程圖中每個步驟、或各步驟的組合中規(guī)定的功能動作;生成實施在框圖的每一塊、或各塊的組合中規(guī)定的功能動作的裝置。
計算機可讀程序代碼可以完全在用戶的計算機上執(zhí)行、部分在用戶的計算機上執(zhí)行、作為單獨的軟件包、部分在用戶的計算機上并且部分在遠程計算機上,或者完全在遠程計算機或者服務器上執(zhí)行。也應該注意,在某些替代實施方案中,在流程圖中各步驟、或框圖中各塊所注明的功能可能不按圖中注明的順序發(fā)生。例如,依賴于所涉及的功能,接連示出的兩個步驟、或兩個塊實際上可能被大致同時執(zhí)行,或者這些塊有時候可能被以相反順序執(zhí)行。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。