一種獲取自旋鎖的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種獲取自旋鎖的方法及裝置。
【背景技術(shù)】
[0002]隨著CPU多核及并行技術(shù)的發(fā)展,在采用NC (Node Controller,節(jié)點(diǎn)控制器)的多節(jié)點(diǎn)大型NUMA (Non Uniform Memory Access Achitecture,非統(tǒng)一內(nèi)存訪問)系統(tǒng)中,為了保證共享資源的一致性,通常使用自旋鎖的機(jī)制進(jìn)行多事務(wù)并發(fā)操作的控制。
[0003]現(xiàn)有技術(shù)中,服務(wù)器可將申請(qǐng)獲取自旋鎖的多個(gè)任務(wù)組成一個(gè)鏈表,并在該多個(gè)任務(wù)所在的處理器的緩存中,均保存一個(gè)相同的且由自旋鎖保護(hù)的本地變量,從而服務(wù)器可以指示該多個(gè)任務(wù)均按照預(yù)先設(shè)定的時(shí)間間隔周期性的嘗試獲取該自旋鎖,以訪問該本地變量。
[0004]然而,在上述獲取自旋鎖的方法中,無論是否輪到其獲取該自旋鎖,鏈表中的任務(wù)均會(huì)周期性的嘗試獲取該自旋鎖,隨著鏈表中的任務(wù)數(shù)量的增加,將導(dǎo)致申請(qǐng)獲取自旋鎖的次數(shù)較多,并增加了系統(tǒng)的性能損耗。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的實(shí)施例提供一種獲取自旋鎖的方法及裝置,能夠降低由于多個(gè)任務(wù)競(jìng)爭(zhēng)共享資源而造成的系統(tǒng)的性能損耗,從而提高系統(tǒng)的性能。
[0006]為達(dá)到上述目的,本發(fā)明的實(shí)施例采用如下技術(shù)方案:
[0007]第一方面,本發(fā)明實(shí)施例提供一種獲取自旋鎖的方法,包括:
[0008]接收請(qǐng)求獲取自旋鎖的任務(wù);
[0009]將所述任務(wù)保存在排隊(duì)隊(duì)列中;
[0010]根據(jù)所述任務(wù)在所述排隊(duì)隊(duì)列中的位置,確定所述任務(wù)的自旋等待時(shí)間,以使得所述任務(wù)在所述自旋等待時(shí)間結(jié)束時(shí),嘗試獲取所述自旋鎖;
[0011]其中,所述任務(wù)在所述排隊(duì)隊(duì)列中的位置用于表征所述任務(wù)保存至所述排隊(duì)隊(duì)列中的先后順序,先保存至所述排隊(duì)隊(duì)列中的任務(wù)的位置在后保存至所述排隊(duì)隊(duì)列中的任務(wù)的位置之前。
[0012]在第一方面的第一種可能的實(shí)現(xiàn)方式中,所述方法還包括:
[0013]根據(jù)預(yù)設(shè)檢測(cè)周期,周期性的檢測(cè)所述任務(wù)的自旋等待時(shí)間是否結(jié)束。
[0014]結(jié)合前述的第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,當(dāng)所述任務(wù)在所述自旋等待時(shí)間結(jié)束時(shí),嘗試獲取所述自旋鎖之后,所述方法還包括:
[0015]若所述任務(wù)獲取所述自旋鎖失敗,則重新確定所述任務(wù)在所述排隊(duì)隊(duì)列中的位置;
[0016]根據(jù)重新確定的所述任務(wù)在所述排隊(duì)隊(duì)列中的位置,重新確定所述任務(wù)的自旋等待時(shí)間,以使得所述任務(wù)在重新確定的所述自旋等待時(shí)間結(jié)束時(shí),重新嘗試獲取所述自旋鎖。
[0017]結(jié)合前述的第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式至第二種可能的實(shí)現(xiàn)方式中的任一種實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述方法還包括:
[0018]當(dāng)位于所述排隊(duì)隊(duì)列首部的任務(wù)釋放所述自旋鎖時(shí),更新所述任務(wù)在所述排隊(duì)隊(duì)列中的位置。
[0019]結(jié)合第一方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,所述當(dāng)位于所述排隊(duì)隊(duì)列首部的任務(wù)釋放所述自旋鎖時(shí),更新所述任務(wù)在所述排隊(duì)隊(duì)列中的位置,具體包括:
[0020]當(dāng)位于所述排隊(duì)隊(duì)列首部的任務(wù)釋放所述自旋鎖時(shí),將所述任務(wù)在所述排隊(duì)隊(duì)列中的位置更新為所述任務(wù)的前一個(gè)任務(wù)在所述排隊(duì)隊(duì)列中的位置。
[0021]結(jié)合前述的第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式至第四種可能的實(shí)現(xiàn)方式中的任一種實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,所述將所述任務(wù)保存在排隊(duì)隊(duì)列中,具體包括:
[0022]將所述任務(wù)添加至所述排隊(duì)隊(duì)列的尾部。
[0023]第二方面,本發(fā)明實(shí)施例提供一種服務(wù)器,包括:
[0024]接收單元,用于接收請(qǐng)求獲取自旋鎖的任務(wù);
[0025]確定單元,用于將所述接收單元接收的所述任務(wù)保存在排隊(duì)隊(duì)列中;
[0026]確定單元,用于根據(jù)所述保存單元保存的所述任務(wù)在所述排隊(duì)隊(duì)列中的位置,確定所述任務(wù)的自旋等待時(shí)間,以使得所述任務(wù)在所述自旋等待時(shí)間結(jié)束時(shí),嘗試獲取所述自旋鎖,其中,所述任務(wù)在所述排隊(duì)隊(duì)列中的位置用于表征所述任務(wù)保存至所述排隊(duì)隊(duì)列中的先后順序,先保存至所述排隊(duì)隊(duì)列中的任務(wù)的位置在后保存至所述排隊(duì)隊(duì)列中的任務(wù)的位置之前。
[0027]在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述服務(wù)器還包括檢測(cè)單元,
[0028]所述檢測(cè)單元,用于根據(jù)預(yù)設(shè)檢測(cè)周期,周期性的檢測(cè)所述確定單元確定的所述任務(wù)的自旋等待時(shí)間是否結(jié)束。
[0029]結(jié)合前述的第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,
[0030]所述確定單元,還用于當(dāng)所述任務(wù)在所述自選等待時(shí)間結(jié)束時(shí),嘗試獲取所述自旋鎖之后,若所述任務(wù)獲取所述自旋鎖失敗,則重新確定所述任務(wù)在所述排隊(duì)隊(duì)列中的位置,并根據(jù)重新確定的所述任務(wù)在所述排隊(duì)隊(duì)列中的位置,重新確定所述任務(wù)的自旋等待時(shí)間,以使得所述任務(wù)在重新確定的所述自旋等待時(shí)間結(jié)束時(shí),重新嘗試獲取所述自旋鎖。
[0031]結(jié)合前述的第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式至第二種可能的實(shí)現(xiàn)方式中的任一種實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述服務(wù)器還包括更新單元,
[0032]所述更新單元,用于當(dāng)位于所述排隊(duì)隊(duì)列首部的任務(wù)釋放所述自旋鎖時(shí),更新所述保存單元保存的所述任務(wù)在所述排隊(duì)隊(duì)列中的位置。
[0033]結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,
[0034]所述更新單元,具體用于當(dāng)位于所述排隊(duì)隊(duì)列首部的任務(wù)釋放所述自旋鎖時(shí),將所述任務(wù)在所述排隊(duì)隊(duì)列中的位置更新為所述任務(wù)的前一個(gè)任務(wù)在所述排隊(duì)隊(duì)列中的位置。
[0035]結(jié)合前述的第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式至第四種可能的實(shí)現(xiàn)方式中的任一種實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,
[0036]所述保存單元,具體用于將所述接收單元接收的所述任務(wù)添加至所述排隊(duì)隊(duì)列的尾部。
[0037]本發(fā)明的實(shí)施例提供一種獲取自旋鎖的方法及裝置,通過接收請(qǐng)求獲取自旋鎖的任務(wù),并將該任務(wù)保存在排隊(duì)隊(duì)列中,以及根據(jù)該任務(wù)在排隊(duì)隊(duì)列中的位置,確定該任務(wù)的自旋等待時(shí)間,以使得該任務(wù)在自旋等待時(shí)間結(jié)束時(shí),嘗試獲取自旋鎖,其中,該任務(wù)在排隊(duì)隊(duì)列中的位置用于表征該任務(wù)保存至排隊(duì)隊(duì)列中的先后順序,先保存至排隊(duì)隊(duì)列中的任務(wù)的位置在后保存至排隊(duì)隊(duì)列中的任務(wù)的位置之前。通過該方案,可以根據(jù)接收到的任務(wù)在排隊(duì)隊(duì)列中的位置,計(jì)算該任務(wù)的自旋等待時(shí)間,即嘗試獲取自旋鎖的時(shí)間間隔,以使得申請(qǐng)獲取自旋鎖的多個(gè)該任務(wù)的自旋等待時(shí)間得到動(dòng)態(tài)調(diào)整,從而使得排隊(duì)隊(duì)列中保存的請(qǐng)求獲取自旋鎖的多個(gè)任務(wù)的自旋等待時(shí)間均可以根據(jù)其在排隊(duì)隊(duì)列中的位置得到動(dòng)態(tài)調(diào)整,因此,解決了現(xiàn)有技術(shù)中多個(gè)任務(wù)均每隔預(yù)先設(shè)定的時(shí)間間隔嘗試獲取自旋鎖的問題,能夠降低由于多個(gè)任務(wù)競(jìng)爭(zhēng)共享資源而造成的系統(tǒng)的性能損耗,從而提高系統(tǒng)的性能。
【附圖說明】
[0038]圖1為本發(fā)明實(shí)施例提供的一種獲取自旋鎖的方法的流程圖一;
[0039]圖2為本發(fā)明實(shí)施例提供的一種獲取自旋鎖的方法的流程圖二 ;
[0040]圖3為本發(fā)明實(shí)施例提供的服務(wù)器的結(jié)構(gòu)示意圖一;
[0041]圖4為本發(fā)明實(shí)施例提供的服務(wù)器的結(jié)構(gòu)示意圖二 ;
[0042]圖5為本發(fā)明實(shí)施例提供的服務(wù)器的結(jié)構(gòu)示意圖三;
[0043]圖6為本發(fā)明實(shí)施例提供的服務(wù)器的結(jié)構(gòu)示意圖四。
【具體實(shí)施方式】
[0044]下面結(jié)合附圖對(duì)本發(fā)明實(shí)施例提供的一種獲取自旋鎖的方法及裝置進(jìn)行詳細(xì)地描述。
[0045]實(shí)施例一
[0046]本發(fā)明實(shí)施例提供一種獲取自旋鎖的方法,如圖1所示,該方法可以包括:
[0047]S11、服務(wù)器接收請(qǐng)求獲取自旋鎖的任務(wù)。
[0048]示例性的,若某一個(gè)任務(wù)需訪問自旋鎖保護(hù)的共享資源,該任務(wù)需向服務(wù)器請(qǐng)求獲取該自旋鎖,服務(wù)器首先可接收該任務(wù)。
[0049]需要說明的是,自旋鎖是為防止多處理器并發(fā)而引入的一種鎖,它在內(nèi)核中大量應(yīng)用于中斷處理等部分(對(duì)于單處理器來說,防止中斷處理中的并發(fā)可簡單采用關(guān)閉中斷的方式,不需要自旋鎖)。在任何時(shí)刻,自旋鎖最多只能被一個(gè)任務(wù)持有,若一個(gè)任務(wù)試圖請(qǐng)求獲取已經(jīng)被其他某一個(gè)任務(wù)持有的自旋鎖,則服務(wù)器可指示該任務(wù)按照其自旋等待時(shí)間,循環(huán)嘗試獲取該自旋鎖,等待該自旋鎖重新可用。若該自旋鎖未被其他任一個(gè)任務(wù)持有,則請(qǐng)求獲取該自旋鎖的該任務(wù)可直接獲得該自旋鎖,以便于訪問該自旋鎖保護(hù)的共享資源。
[0050]S102、服務(wù)器將請(qǐng)求獲取自旋鎖的任務(wù)保存在排隊(duì)隊(duì)列中。
[0051]服務(wù)器接收到請(qǐng)求獲取自旋鎖的任務(wù)之后,服務(wù)器可將該任務(wù)保存在排隊(duì)隊(duì)列中。
[0052]具體的,服務(wù)器接收到請(qǐng)求獲取自旋鎖的任務(wù)之后,服務(wù)器可將該任務(wù)保存至排隊(duì)隊(duì)列的尾部,并確定該任務(wù)在排隊(duì)隊(duì)列中的位置。
[0053]進(jìn)一步地,服務(wù)器將請(qǐng)求獲取自旋鎖的任務(wù)保存至排隊(duì)隊(duì)列中之前,排隊(duì)隊(duì)列中可以保存有其他請(qǐng)求獲取自旋鎖的任務(wù),也可以未保存有其他請(qǐng)求獲取自旋鎖的任務(wù),若該排隊(duì)隊(duì)列中保存有其他請(qǐng)求獲取自旋鎖的任務(wù),即排隊(duì)隊(duì)列不為空隊(duì)列,則服務(wù)器可將接收到的該任務(wù)添加至該排隊(duì)隊(duì)列的尾部,并根據(jù)服務(wù)器接收到排隊(duì)隊(duì)列中的所有任務(wù)的先后順序,確定該任務(wù)在該排隊(duì)隊(duì)列中的位置;若該排隊(duì)隊(duì)列中未保存有其他請(qǐng)求獲取自旋鎖的任務(wù),則服務(wù)器可將該任務(wù)添加至排隊(duì)隊(duì)列中,并確定該任務(wù)為位于排隊(duì)隊(duì)列首部的任務(wù)。
[0054]S103、服務(wù)器