實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法
【專利摘要】本發(fā)明公開一種實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法,實時系統(tǒng)包括參數(shù)服務(wù)器端和參數(shù)客戶端,參數(shù)服務(wù)器端所在主機上設(shè)置有數(shù)據(jù)內(nèi)存塊,且主機上運行有可完成將參數(shù)從參數(shù)源加載到內(nèi)存中并完成參數(shù)排序建模檢錯的進程或線程;參數(shù)客戶端運行有通過訪問參數(shù)進行業(yè)務(wù)處理的進程或線程。本發(fā)明的方法通過改善參數(shù)存放機制,在參數(shù)服務(wù)器端和參數(shù)客戶端更新及數(shù)據(jù)訪問過程中,配合進程級、線程級標志位,以及數(shù)據(jù)注冊、搜索、拉取建模連接分離的機制,實現(xiàn)非阻塞的參數(shù)更新,避免參數(shù)更新導(dǎo)致系統(tǒng)停止、業(yè)務(wù)處理中斷或參數(shù)更新互斥。
【專利說明】實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及實時系統(tǒng)中參數(shù)數(shù)據(jù)更新【技術(shù)領(lǐng)域】,特別是一種避免更新阻塞造成業(yè)務(wù)終止或暫停的實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法。
【背景技術(shù)】
[0002]參數(shù)是大型系統(tǒng)運行的必要數(shù)據(jù),且隨著大數(shù)據(jù)時代的到來,大型系統(tǒng)參數(shù)的數(shù)據(jù)量越來越大,參數(shù)所代表的模型越來越復(fù)雜,更新參數(shù)所消耗的cpu、內(nèi)存、時間越來越多,參數(shù)更新的次數(shù)越來越頻繁。對于實時系統(tǒng),如電信業(yè)在線計費系統(tǒng)、銀行系統(tǒng)里面的實時轉(zhuǎn)賬系統(tǒng)來說,將當前業(yè)務(wù)停下來去更新參數(shù)是不可接受的:當電信業(yè)boss系統(tǒng)里的實時在線計費系統(tǒng)停下業(yè)務(wù)去更新參數(shù),會大大延長用戶撥打電話時接通時間。
[0003]目前針對實時系統(tǒng)的參數(shù)更新,一般是在由進程里的一個參數(shù)更新線程完成拉取參數(shù)放入私有內(nèi)存、建模等更新操作后,業(yè)務(wù)線程再獲取臨界資源后完成參數(shù)的更新:對于一個主機上有同一個軟件的多個進程實例情況而言,每個進程加載一份參數(shù)會消耗大量的內(nèi)存,多個進程的參數(shù)更新操作需要消耗更多的cpu,多個進程的參數(shù)更新操作如果在同一時段內(nèi)進程參數(shù)更新操作會加大參數(shù)源的壓力,進程完成參數(shù)更新操作后,進程內(nèi)部的業(yè)務(wù)線程需要中斷當前業(yè)務(wù)爭搶臨界資源來完成參數(shù)更新;對于一個主機上只有一個軟件的一個進程實例情況而言,進程完成參數(shù)更新操作后,進程內(nèi)部的業(yè)務(wù)線程需要中斷當前業(yè)務(wù)爭搶臨界資源來完成參數(shù)更新。
【發(fā)明內(nèi)容】
[0004]本發(fā)明要解決的技術(shù)問題為:通過改善參數(shù)存放機制,配合進程級、線程級標志位,以及數(shù)據(jù)注冊、搜索、拉取建模連接分離的機制,實現(xiàn)非阻塞的參數(shù)更新,避免參數(shù)更新導(dǎo)致系統(tǒng)停止、業(yè)務(wù)處理中斷或參數(shù)更新互斥。
[0005]本發(fā)明采取的技術(shù)方案為:實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法,實時系統(tǒng)包括參數(shù)服務(wù)器端和參數(shù)客戶端,參數(shù)服務(wù)器端所在主機上設(shè)置有數(shù)據(jù)內(nèi)存塊,且主機上運行有可完成將參數(shù)從參數(shù)源加載到內(nèi)存中并完成參數(shù)排序建模檢錯的進程或線程;參數(shù)客戶端運行有通過訪問參數(shù)進行業(yè)務(wù)處理的進程或線程;
所述數(shù)據(jù)內(nèi)存塊數(shù)量為3塊,分別定義為O號數(shù)據(jù)內(nèi)存塊、I號數(shù)據(jù)內(nèi)存塊和控制內(nèi)存塊,其中O號數(shù)據(jù)內(nèi)存塊、I號數(shù)據(jù)內(nèi)存塊用于存放參數(shù)數(shù)據(jù),控制內(nèi)存塊用于存放控制信息數(shù)據(jù);
上述控制信息數(shù)據(jù)包括:最新參數(shù)所在內(nèi)存塊ID,臨界資源鎖,參數(shù)個數(shù)N,上次死鎖解除時刻,更新標記,O號數(shù)據(jù)內(nèi)存塊與I號數(shù)據(jù)內(nèi)存塊內(nèi)數(shù)據(jù)內(nèi)存大小和key、各參數(shù)偏移量、各參數(shù)記錄數(shù)以及各參數(shù)客戶端的注冊信息;其中參數(shù)客戶端進程注冊信息包括進程啟動信息、進程ID、更新線程狀態(tài)、上次更新完成時刻、上次檢查更新時刻、進程使用參數(shù)內(nèi)存塊ID、線程集合和線程集合內(nèi)各元素對應(yīng)的使用參數(shù)內(nèi)存塊ID ;
實時系統(tǒng)中參數(shù)數(shù)據(jù)更新包括參數(shù)客戶端的參數(shù)更新,以及參數(shù)服務(wù)器端的參數(shù)更新;
參數(shù)客戶端的參數(shù)更新,包括進程探測和線程探測,其中:
進程探測步驟為:進程中的更新線程檢測本進程使用內(nèi)存塊ID與參數(shù)服務(wù)器端控制區(qū)內(nèi)存的最新參數(shù)所在內(nèi)存塊ID是否一致,如果不一致則更新為最新參數(shù)所在內(nèi)存塊ID,并等待各業(yè)務(wù)線程完成線程探測步驟;如果等待超時則強制將對應(yīng)業(yè)務(wù)線程所用內(nèi)存塊ID更新為進程使用內(nèi)存塊ID ;
線程探測步驟為:各業(yè)務(wù)線程檢測本線程所用內(nèi)存塊ID與其所屬進程使用參數(shù)內(nèi)存塊ID是否一致,如果不一致則更新為其所屬進程當前所用參數(shù)內(nèi)存塊ID ;
參數(shù)服務(wù)器端的參數(shù)更新,包括以下步驟:
a)根據(jù)控制內(nèi)存的更新標記判斷是否需要進行參數(shù)更新:如果不需要,則執(zhí)行進入指定時間的睡眠狀態(tài),重復(fù)步驟a);
如果需要進行參數(shù)更新,則執(zhí)行步驟b);
b)檢測控制內(nèi)存的參數(shù)客戶端注冊信息里各個線程使用參數(shù)內(nèi)存塊ID與控制內(nèi)存的最新參數(shù)所在內(nèi)存塊ID是否一致:
如果不一致則執(zhí)行進入指定時間的睡眠狀態(tài),等待參數(shù)客戶端完成更新參數(shù),如果等待超過指定時間則強制將控制內(nèi)存的參數(shù)客戶端注冊信息里各個線程使用參數(shù)內(nèi)存塊ID變更為控制內(nèi)存的最新參數(shù)所在內(nèi)存塊ID,然后執(zhí)行步驟C),如果等待未超過指定時間則重復(fù)步驟b);
如果一致,則執(zhí)行步驟c);
c)從參數(shù)源拉取各參數(shù)記錄總數(shù),從而獲得存放參數(shù)的數(shù)據(jù)內(nèi)存所需容量S,假設(shè)控制內(nèi)存的最新參數(shù)所在內(nèi)存ID為O,即位于O號內(nèi)存中,如果S比I號內(nèi)存容量大,則重建I號內(nèi)存至容量至少為S ;同理控制內(nèi)存的最新參數(shù)所在內(nèi)存ID為1,如果S比O號內(nèi)存容量大,則重建O號內(nèi)存至容量至少為S ;
d)從參數(shù)源拉取各參數(shù)并完成檢錯、排序和模型建立,變更最新參數(shù)所在內(nèi)存塊ID,然后重復(fù)步驟b)至d);
實時系統(tǒng)中,參數(shù)服務(wù)器端運行的進程或線程以及參數(shù)客戶端運行的進程或線程,通過搜索部件、參數(shù)注冊部件以及內(nèi)存連接部件訪問數(shù)據(jù)內(nèi)存塊中的參數(shù)數(shù)據(jù)以及控制信息數(shù)據(jù);其中:
搜索部件從參數(shù)注冊部件中獲取可訪問的參數(shù)集合及每個參數(shù)偏移量和記錄數(shù),以定位到參數(shù)數(shù)據(jù)所在的數(shù)據(jù)內(nèi)存塊進行數(shù)據(jù)訪問;
參數(shù)注冊部件聲明需要加載的參數(shù)數(shù)據(jù),并為每個參數(shù)數(shù)據(jù)分配一個唯一的身份ID ;
參數(shù)客戶端及參數(shù)服務(wù)器端運行的進程或線程依次通過搜索部件、參數(shù)注冊部件和內(nèi)存連接部件訪問O號數(shù)據(jù)內(nèi)存塊和I號數(shù)據(jù)內(nèi)存塊中的參數(shù)數(shù)據(jù);
客戶端參數(shù)更新線程以及服務(wù)器端進程分別依次通過搜索部件和內(nèi)存連接部件訪問控制內(nèi)存塊中的控制信息數(shù)據(jù)。
[0006]上述參數(shù)注冊部件為每個參數(shù)數(shù)據(jù)分配的唯一身份ID,可用于在參數(shù)服務(wù)器端或參數(shù)客戶端在訪問控制內(nèi)存塊時能夠快速定位各參數(shù)數(shù)據(jù)對應(yīng)的控制信息數(shù)據(jù)??蛻舳藚?shù)更新線程依次通過搜索部件和連接部件讀寫自己在控制內(nèi)存塊中的客戶端注冊信息,以完成參數(shù)更新操作,將自己在控制內(nèi)存塊中的客戶端注冊信息中“進程使用參數(shù)內(nèi)存塊ID”改寫成與“最新參數(shù)所在內(nèi)存塊ID” 一致;服務(wù)器端進程依次通過搜索部件和內(nèi)存連接部件對控制內(nèi)存塊進行讀寫操作。
[0007]基于本發(fā)明的內(nèi)存塊設(shè)置方式,本發(fā)明對于參數(shù)數(shù)據(jù)的存放方式分為共享內(nèi)存方式和私有內(nèi)存方式。為了防止業(yè)務(wù)線程阻塞,本發(fā)明參數(shù)數(shù)據(jù)的存放方式可根據(jù)一臺主機上需要訪問相同參數(shù)的進程數(shù)是否大于I來判斷,如果大于1,則采用共享內(nèi)存存放模式進行參數(shù)數(shù)據(jù)的存放;如果等于1,則采用私有內(nèi)存存放模式進行參數(shù)數(shù)據(jù)的存放。另外如果為了維護方便(方便查看參數(shù)數(shù)據(jù)正確性等),在等于I的情況下也同樣可以采用共享內(nèi)存存放模式進行參數(shù)數(shù)據(jù)的存放。
[0008]共享內(nèi)存方式下,本發(fā)明將所述O號數(shù)據(jù)內(nèi)存塊以及I號數(shù)據(jù)內(nèi)存塊中,其一用于存儲參數(shù)服務(wù)器端接收的最新參數(shù)數(shù)據(jù),另一數(shù)據(jù)內(nèi)存塊用于存儲參數(shù)服務(wù)器端最近一次更新后的參數(shù)數(shù)據(jù),以提供給參數(shù)客戶端進行數(shù)據(jù)訪問。
[0009]私有內(nèi)存方式下客戶端進程和服務(wù)器端進程實際為同一個進程,且只有一個客戶端進程;客戶端更新線程和服務(wù)端更新線程實際合并為同一個線程;且不存在進程探測。
[0010]上述內(nèi)存存放方式皆能夠?qū)崿F(xiàn)參數(shù)更新過程中將進程級標志位與線程級標志位相結(jié)合完成參數(shù)數(shù)據(jù)的非阻塞更新。
[0011]有益效果
相比于現(xiàn)有的參數(shù)更新方式,本發(fā)明對實時系統(tǒng)中的內(nèi)存塊設(shè)置進行了優(yōu)化,配合進程級、線程級標志位,以及數(shù)據(jù)注冊、搜索、拉取建模連接分離的機制,進行非阻塞的參數(shù)更新和訪問,不會因為更新參數(shù)導(dǎo)致系統(tǒng)停止、中斷業(yè)務(wù)處理或者互斥地更新參數(shù)。
【專利附圖】
【附圖說明】
[0012]圖1所示為共享內(nèi)存模式下的控制區(qū)信息內(nèi)容結(jié)構(gòu)示意圖;
圖2所示為圖1中客戶端進程注冊信息區(qū)域的內(nèi)容結(jié)構(gòu)示意圖;
圖3所示為參數(shù)客戶端參數(shù)更新的流程示意圖;
圖4所示為參數(shù)服務(wù)器端參數(shù)更新的流程示意圖;
圖5所示為參數(shù)數(shù)據(jù)和控制信息數(shù)據(jù)訪問結(jié)構(gòu)關(guān)系示意圖。
【具體實施方式】
[0013]以下結(jié)合附圖和具體實施例進一步說明。
[0014]本發(fā)明的實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法中,實時系統(tǒng)包括參數(shù)服務(wù)器端和參數(shù)客戶端,參數(shù)服務(wù)器端所在主機上設(shè)置有數(shù)據(jù)內(nèi)存塊,且主機上運行有可完成將參數(shù)從參數(shù)源加載到內(nèi)存中并完成參數(shù)排序建模檢錯的進程或線程;參數(shù)客戶端運行有通過訪問參數(shù)進行業(yè)務(wù)處理的進程或線程;
如圖1所示,數(shù)據(jù)內(nèi)存塊數(shù)量為3塊,分別定義為O號數(shù)據(jù)內(nèi)存塊、I號數(shù)據(jù)內(nèi)存塊和控制內(nèi)存塊,其中O號數(shù)據(jù)內(nèi)存塊、I號數(shù)據(jù)內(nèi)存塊用于存放參數(shù)數(shù)據(jù),控制內(nèi)存塊用于存放控制信息數(shù)據(jù);
上述控制信息數(shù)據(jù)包括:最新參數(shù)所在內(nèi)存塊ID,臨界資源鎖,參數(shù)個數(shù)N,上次死鎖解除時刻,更新標記,O號數(shù)據(jù)內(nèi)存塊與I號數(shù)據(jù)內(nèi)存塊內(nèi)數(shù)據(jù)內(nèi)存大小和key、各參數(shù)偏移量、各參數(shù)記錄數(shù)以及各參數(shù)客戶端的注冊信息;結(jié)合圖2,參數(shù)客戶端進程注冊信息包括進程啟動信息、進程ID、更新線程狀態(tài)、上次更新完成時刻、上次檢查更新時刻、進程使用參數(shù)內(nèi)存塊ID、線程集合和線程集合內(nèi)各元素對應(yīng)的使用參數(shù)內(nèi)存塊ID ;
實時系統(tǒng)中參數(shù)數(shù)據(jù)更新包括參數(shù)客戶端的參數(shù)更新,以及參數(shù)服務(wù)器端的參數(shù)更新;
參數(shù)客戶端的參數(shù)更新參考圖3,包括進程探測和線程探測,其中:
進程探測步驟為:進程中的更新線程檢測本進程使用內(nèi)存塊ID與參數(shù)服務(wù)器端控制區(qū)內(nèi)存的最新參數(shù)所在內(nèi)存塊ID是否一致,如果不一致則更新為最新參數(shù)所在內(nèi)存塊ID,并等待各業(yè)務(wù)線程完成線程探測步驟;如果等待超時則強制將對應(yīng)業(yè)務(wù)線程所用內(nèi)存塊ID更新為進程使用內(nèi)存塊ID ;
線程探測步驟為:各業(yè)務(wù)線程檢測本線程所用內(nèi)存塊ID與其所屬進程使用參數(shù)內(nèi)存塊ID是否一致,如果不一致則更新為其所屬進程當前所用參數(shù)內(nèi)存塊ID ;
參數(shù)服務(wù)器端的參數(shù)更新參考圖4,包括以下步驟:
a)根據(jù)控制內(nèi)存的更新標記判斷是否需要進行參數(shù)更新:如果不需要,則執(zhí)行進入指定時間的睡眠狀態(tài),重復(fù)步驟a);
如果需要進行參數(shù)更新,則執(zhí)行步驟b);
b)檢測控制內(nèi)存的參數(shù)客戶端注冊信息里各個線程使用參數(shù)內(nèi)存塊ID與控制內(nèi)存的最新參數(shù)所在內(nèi)存塊ID是否一致:
如果不一致則執(zhí)行進入指定時間的睡眠狀態(tài),等待參數(shù)客戶端完成更新參數(shù),如果等待超過指定時間則強制將控制內(nèi)存的參數(shù)客戶端注冊信息里各個線程使用參數(shù)內(nèi)存塊ID變更為控制內(nèi)存的最新參數(shù)所在內(nèi)存塊ID,然后執(zhí)行步驟C),如果等待未超過指定時間則重復(fù)步驟b);
如果一致,則執(zhí)行步驟c);
c)從參數(shù)源拉取各參數(shù)記錄總數(shù),從而獲得存放參數(shù)的數(shù)據(jù)內(nèi)存所需容量S,假設(shè)控制內(nèi)存的最新參數(shù)所在內(nèi)存ID為O,即位于O號內(nèi)存中,如果S比I號內(nèi)存容量大,則重建I號內(nèi)存至容量至少為S ;同理控制內(nèi)存的最新參數(shù)所在內(nèi)存ID為1,如果S比O號內(nèi)存容量大,則重建O號內(nèi)存至容量至少為S ;
d)從參數(shù)源拉取各參數(shù)并完成檢錯、排序和模型建立,變更最新參數(shù)所在內(nèi)存塊ID,然后重復(fù)步驟b)至d);
參考圖5,本發(fā)明實時系統(tǒng)中,參數(shù)服務(wù)器端運行的進程或線程以及參數(shù)客戶端運行的進程或線程,通過搜索部件、參數(shù)注冊部件以及內(nèi)存連接部件訪問數(shù)據(jù)內(nèi)存塊中的參數(shù)數(shù)據(jù)以及控制信息數(shù)據(jù);數(shù)據(jù)訪問過程采用了參數(shù)注冊部件、搜索部件、連接部件、數(shù)據(jù)拉取檢錯排序建模分離的機制,訪問過程中:
搜索部件從參數(shù)注冊部件中獲取可訪問的參數(shù)集合及每個參數(shù)偏移量和記錄數(shù),以定位到參數(shù)數(shù)據(jù)所在的數(shù)據(jù)內(nèi)存塊進行數(shù)據(jù)訪問;
參數(shù)注冊部件聲明需要加載的參數(shù)數(shù)據(jù),并為每個參數(shù)數(shù)據(jù)分配一個唯一的身份ID,如從O開始分配設(shè)置;
客戶端及服務(wù)器端運行的進程或線程依次通過搜索部件、參數(shù)注冊部件和內(nèi)存連接部件訪問O號數(shù)據(jù)內(nèi)存塊和I號數(shù)據(jù)內(nèi)存塊中的參數(shù)數(shù)據(jù);
客戶端參數(shù)更新線程以及服務(wù)器端進程分別依次通過搜索部件和內(nèi)存連接部件訪問控制內(nèi)存塊中的控制信息數(shù)據(jù)。
[0015]上述參數(shù)注冊部件為每個參數(shù)數(shù)據(jù)分配的唯一身份ID,可用于在參數(shù)服務(wù)器端或參數(shù)客戶端在訪問控制內(nèi)存塊時能夠快速定位各參數(shù)數(shù)據(jù)對應(yīng)的控制信息數(shù)據(jù)??蛻舳藚?shù)更新線程依次通過搜索部件和連接部件讀寫自己在控制內(nèi)存塊中的客戶端注冊信息,以完成參數(shù)更新操作,將自己在控制內(nèi)存塊中的客戶端注冊信息中“進程使用參數(shù)內(nèi)存塊ID”改寫成與“最新參數(shù)所在內(nèi)存塊ID”一致;服務(wù)器端進程依次通過搜索部件和內(nèi)存連接部件對控制內(nèi)存塊進行讀寫操作。
[0016]通過內(nèi)存連接部件、搜索部件,本發(fā)明實現(xiàn)了數(shù)據(jù)內(nèi)存塊對參數(shù)服務(wù)器端和參數(shù)客戶端的信息透明化;通過搜索部件業(yè)務(wù)線程可以透明地訪問參數(shù),而不用關(guān)心參數(shù)是放在O號數(shù)據(jù)內(nèi)存塊還是I號數(shù)據(jù)內(nèi)存塊,參數(shù)客戶端可以快速的查找到所需要的參數(shù)數(shù)據(jù),參數(shù)服務(wù)器端可以快速完成模型建立操作;
通過在參數(shù)注冊部件聲明需要加載的參數(shù),參數(shù)服務(wù)器端可以得知需要從參數(shù)源拉取哪些參數(shù),參數(shù)客戶端可以得知可以訪問哪些參數(shù)。
[0017]上述訪問機制使得參數(shù)服務(wù)器端能夠迅速從參數(shù)源拉取數(shù)據(jù),并完成檢錯排序建模;參數(shù)客戶端無需再去建模,提高數(shù)據(jù)處理效率。
[0018]如果參數(shù)服務(wù)器端只是拉取數(shù)據(jù),不完成檢錯排序建模,則每個參數(shù)客戶端都需要做相同的事情。例如:如果參數(shù)服務(wù)器端沒有完成檢錯排序建模,電信行業(yè)計費系統(tǒng)接受到一條用戶的gprs話單,首先需要搜索該用戶的套餐的參數(shù)信息,然后再搜索該套餐的具體組成(語音,短信,gprs等),匹配到gprs后再搜索gprs對應(yīng)的費率信息,每個參數(shù)客戶端都需要進行多次搜索,而參數(shù)服務(wù)器端完成了建模工作,則參數(shù)客戶端只需要一次搜索就可以得到所需要的所有信息,大大提高了生成效率。
[0019]在實時系統(tǒng)里面,阻塞業(yè)務(wù)線程會帶來很壞的影響。例如:電信行業(yè)的在線計費系統(tǒng),會在每個用戶電話撥通前進行鑒權(quán),如果在某個時刻,某省有1000個用戶在撥打電話,在線計費系統(tǒng)的業(yè)務(wù)線程阻塞的去更新參數(shù),如果該阻塞耗時I秒,則這1000個用戶電話撥通耗時就會多I秒。
[0020]基于本發(fā)明的內(nèi)存塊設(shè)置方式,本發(fā)明對于參數(shù)數(shù)據(jù)的存放方式分為共享內(nèi)存方式和私有內(nèi)存方式。為了防止業(yè)務(wù)線程阻塞,本發(fā)明參數(shù)數(shù)據(jù)的存放方式可根據(jù)一臺主機上需要訪問相同參數(shù)的進程數(shù)是否大于I來判斷,如果大于1,則采用共享內(nèi)存存放模式進行參數(shù)數(shù)據(jù)的存放;如果等于1,則采用私有內(nèi)存存放模式進行參數(shù)數(shù)據(jù)的存放。另外如果為了維護方便(方便查看參數(shù)數(shù)據(jù)正確性等),在等于I的情況下也同樣可以采用共享內(nèi)存存放模式進行參數(shù)數(shù)據(jù)的存放。
[0021]共享內(nèi)存方式下,本發(fā)明將所述O號數(shù)據(jù)內(nèi)存塊以及I號數(shù)據(jù)內(nèi)存塊中,其一用于存儲參數(shù)服務(wù)器端接收的最新參數(shù)數(shù)據(jù),另一數(shù)據(jù)內(nèi)存塊用于存儲參數(shù)服務(wù)器端最近一次更新后的參數(shù)數(shù)據(jù),以提供給參數(shù)客戶端進行數(shù)據(jù)訪問。具體為:
例如有一份參數(shù)在2014-10-16 00:00:00開始生效,參數(shù)記錄帶有生效時間字段為2014-10-16 00:00:00,維護人員在2014-10-15 12:00:00時將參數(shù)更新入數(shù)據(jù)庫,
假設(shè)服務(wù)端是定時每5分鐘檢測是否需要更新參數(shù),當前最新參數(shù)所在內(nèi)存塊ID為0,參數(shù)服務(wù)端在2014-10-15 12:05:00左右檢測到需要數(shù)據(jù)更新標記后話費5分鐘將新參數(shù)加載到I號內(nèi)存塊,2014-10-15 12:10:00之后客戶端無需停止應(yīng)用就可以讀取到新的參數(shù)記錄。
[0022]不需要重新啟動客戶端或者停止業(yè)務(wù)線程去拉取參數(shù),如果一天更新10次參數(shù),每次更新花費5分鐘,采用2塊數(shù)據(jù)內(nèi)存塊存放新老2份參數(shù)的機制每天就可以節(jié)省50分鐘的時間用于業(yè)務(wù)生產(chǎn)。
[0023]又如某系統(tǒng)有20臺生產(chǎn)主機,每臺主機運行10個需要訪問參數(shù)的進程,每份參數(shù)需要消耗內(nèi)存512M,則共需要消耗20 X 10 X 512 M (100G)的內(nèi)存,如果檢測到需要更新參數(shù),則會有200個進程從參數(shù)源拉取參數(shù)。即一臺主機上訪問同一份參數(shù)的進程大于I個,采用本發(fā)明的共享內(nèi)存方式,則每臺主機上只需O號數(shù)據(jù)內(nèi)存塊、I號數(shù)據(jù)內(nèi)存塊、控制內(nèi)存塊(控制內(nèi)存塊只存很少的數(shù)據(jù),假設(shè)20M)共1044M,整個系統(tǒng)共需要消耗:20 X1044M ((約20.4G),內(nèi)存使用率提高約80%,網(wǎng)絡(luò)使用率和cpu使用率提高約80%。原來200個進程拉取200份數(shù)據(jù),采用本發(fā)明后只需要20個進程拉取20份。
[0024]私有內(nèi)存方式下客戶端進程和服務(wù)器端進程實際為同一個進程,且只有一個客戶端進程;客戶端更新線程和服務(wù)端更新線程實際合并為同一個線程;且不存在進程探測。具體為:
例如假設(shè)控制內(nèi)存的最新參數(shù)所在內(nèi)存塊ID在2014-10-15 12:10:00由參數(shù)服務(wù)端由O更新為I后,參數(shù)客戶端更新線程在2014-10-15 12:10:03檢測到該變化,則客戶端更新線程連接上I號數(shù)據(jù)內(nèi)存塊并將本客戶單對應(yīng)的進程使用參數(shù)內(nèi)存塊ID變更為1,緊接著參數(shù)客戶端業(yè)務(wù)線程檢測到本進程使用參數(shù)內(nèi)存塊ID與本業(yè)務(wù)線程使用參數(shù)內(nèi)存塊ID不同后將本業(yè)務(wù)線程使用參數(shù)內(nèi)存塊ID變更為1,待該參數(shù)客戶端所有業(yè)務(wù)線程完成變更后,參數(shù)客戶端更新線程斷開與O號數(shù)據(jù)內(nèi)存塊的連接,這樣無須阻塞業(yè)務(wù)線程。
[0025]上述兩種內(nèi)存存放方式皆能夠?qū)崿F(xiàn)參數(shù)更新過程中將進程級標志位與線程級標志位相結(jié)合完成參數(shù)數(shù)據(jù)的非阻塞更新。
[0026]本發(fā)明通過改善參數(shù)存放機制,配合進程級、線程級標志位,以及數(shù)據(jù)注冊、搜索、拉取建模連接分離的機制,實現(xiàn)非阻塞的參數(shù)更新,避免參數(shù)更新導(dǎo)致系統(tǒng)停止、業(yè)務(wù)處理中斷或參數(shù)更新互斥。
【權(quán)利要求】
1.實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法,其特征是,實時系統(tǒng)包括參數(shù)服務(wù)器端和參數(shù)客戶端,參數(shù)服務(wù)器端所在主機上設(shè)置有數(shù)據(jù)內(nèi)存塊,且主機上運行有可完成將參數(shù)從參數(shù)源加載到內(nèi)存中并完成參數(shù)排序建模檢錯的進程或線程;參數(shù)客戶端運行有通過訪問參數(shù)進行業(yè)務(wù)處理的進程或線程; 所述數(shù)據(jù)內(nèi)存塊數(shù)量為3塊,分別定義為O號數(shù)據(jù)內(nèi)存塊、I號數(shù)據(jù)內(nèi)存塊和控制內(nèi)存塊,其中O號數(shù)據(jù)內(nèi)存塊、I號數(shù)據(jù)內(nèi)存塊用于存放參數(shù)數(shù)據(jù),控制內(nèi)存塊用于存放控制信息數(shù)據(jù); 上述控制信息數(shù)據(jù)包括:最新參數(shù)所在內(nèi)存塊ID,臨界資源鎖,參數(shù)個數(shù)N,上次死鎖解除時刻,更新標記,O號數(shù)據(jù)內(nèi)存塊與I號數(shù)據(jù)內(nèi)存塊內(nèi)數(shù)據(jù)內(nèi)存大小和key、各參數(shù)偏移量、各參數(shù)記錄數(shù)以及各參數(shù)客戶端的注冊信息;其中參數(shù)客戶端進程注冊信息包括進程啟動信息、進程ID、更新線程狀態(tài)、上次更新完成時刻、上次檢查更新時刻、進程使用參數(shù)內(nèi)存塊ID、線程集合和線程集合內(nèi)各元素對應(yīng)的使用參數(shù)內(nèi)存塊ID ; 實時系統(tǒng)中參數(shù)數(shù)據(jù)更新包括參數(shù)客戶端的參數(shù)更新,以及參數(shù)服務(wù)器端的參數(shù)更新; 參數(shù)客戶端的參數(shù)更新,包括進程探測和線程探測,其中: 進程探測步驟為:進程中的更新線程檢測本進程使用內(nèi)存塊ID與參數(shù)服務(wù)器端控制區(qū)內(nèi)存的最新參數(shù)所在內(nèi)存塊ID是否一致,如果不一致則更新為最新參數(shù)所在內(nèi)存塊ID,并等待各業(yè)務(wù)線程完成線程探測步驟;如果等待超時則強制將對應(yīng)業(yè)務(wù)線程所用內(nèi)存塊ID更新為進程使用內(nèi)存塊ID ; 線程探測步驟為:各業(yè)務(wù)線程檢測本線程所用內(nèi)存塊ID與其所屬進程使用參數(shù)內(nèi)存塊ID是否一致,如果不一致則更新為其所屬進程當前所用參數(shù)內(nèi)存塊ID ; 參數(shù)服務(wù)器端的參數(shù)更新,包括以下步驟: a)根據(jù)控制內(nèi)存的更新標記判斷是否需要進行參數(shù)更新:如果不需要,則執(zhí)行進入指定時間的睡眠狀態(tài),重復(fù)步驟a); 如果需要進行參數(shù)更新,則執(zhí)行步驟b); b)檢測控制內(nèi)存的參數(shù)客戶端注冊信息里各個線程使用參數(shù)內(nèi)存塊ID與控制內(nèi)存的最新參數(shù)所在內(nèi)存塊ID是否一致: 如果不一致則執(zhí)行進入指定時間的睡眠狀態(tài),等待參數(shù)客戶端完成更新參數(shù),如果等待超過指定時間則強制將控制內(nèi)存的參數(shù)客戶端注冊信息里各個線程使用參數(shù)內(nèi)存塊ID變更為控制內(nèi)存的最新參數(shù)所在內(nèi)存塊ID,然后執(zhí)行步驟C),如果等待未超過指定時間則重復(fù)步驟b); 如果一致,則執(zhí)行步驟c); c)從參數(shù)源拉取各參數(shù)記錄總數(shù),從而獲得存放參數(shù)的數(shù)據(jù)內(nèi)存所需容量S,假設(shè)控制內(nèi)存的最新參數(shù)所在內(nèi)存ID為O,即位于O號內(nèi)存中,如果S比I號內(nèi)存容量大,則重建I號內(nèi)存至容量至少為S ;同理控制內(nèi)存的最新參數(shù)所在內(nèi)存ID為1,如果S比O號內(nèi)存容量大,則重建O號內(nèi)存至容量至少為S ; d)從參數(shù)源拉取各參數(shù)并完成檢錯、排序和模型建立,變更最新參數(shù)所在內(nèi)存塊ID,然后重復(fù)步驟b)至d); 實時系統(tǒng)中,參數(shù)服務(wù)器端運行的進程或線程以及參數(shù)客戶端運行的進程或線程,通過搜索部件、參數(shù)注冊部件以及內(nèi)存連接部件訪問數(shù)據(jù)內(nèi)存塊中的參數(shù)數(shù)據(jù)以及控制信息數(shù)據(jù);其中: 搜索部件從參數(shù)注冊部件中獲取可訪問的參數(shù)集合及每個參數(shù)偏移量和記錄數(shù),以定位到參數(shù)數(shù)據(jù)所在的數(shù)據(jù)內(nèi)存塊進行數(shù)據(jù)訪問; 參數(shù)注冊部件聲明需要加載的參數(shù)數(shù)據(jù),并為每個參數(shù)數(shù)據(jù)分配一個唯一的身份ID ;參數(shù)客戶端及參數(shù)服務(wù)器端運行的進程或線程依次通過搜索部件、參數(shù)注冊部件和內(nèi)存連接部件訪問O號數(shù)據(jù)內(nèi)存塊和I號數(shù)據(jù)內(nèi)存塊中的參數(shù)數(shù)據(jù); 參數(shù)客戶端參數(shù)更新線程以及服務(wù)器端進程分別依次通過搜索部件和內(nèi)存連接部件訪問控制內(nèi)存塊中的控制信息數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的實時系統(tǒng)參數(shù)數(shù)據(jù)的非阻塞更新和訪問方法,其特征是,所述O號數(shù)據(jù)內(nèi)存塊以及I號數(shù)據(jù)內(nèi)存塊中,其一用于存儲參數(shù)服務(wù)器端接收的最新參數(shù)數(shù)據(jù),另一數(shù)據(jù)內(nèi)存塊用于存儲參數(shù)服務(wù)器端最近一次更新后的參數(shù)數(shù)據(jù),以提供給參數(shù)客戶端進行數(shù)據(jù)訪問。
【文檔編號】G06F9/46GK104317971SQ201410661946
【公開日】2015年1月28日 申請日期:2014年11月19日 優(yōu)先權(quán)日:2014年11月19日
【發(fā)明者】王濤, 趙廣成 申請人:亞信科技(南京)有限公司