在區塊鏈中同時執行交易的方法和裝置及電腦可讀儲存媒體與計算設備
本說明書實施例涉及區塊鏈技術領域,更具體地,涉及一種在區塊鏈中同時執行交易的方法和裝置。
區塊鏈技術是構建在點對點(P2P)網路上,利用鏈式資料結構來驗證與儲存資料,利用分散式節點共識演算法來產生和更新資料,利用密碼學的方式保證資料傳輸和存取的安全,利用由自動化脚本代碼組成的智慧合約來編程和操作資料的一種全新的分散式基礎架構與計算範式。區塊鏈技術也被稱之為分散式帳本技術,是一種去中心化的分散式資料庫技術,其特點是去中心化、公開透明、不可篡改、可信任。區塊鏈的每筆資料,都會廣播到全網的區塊鏈節點,每個全節點都有全量的、一致的資料。區塊鏈中的節點透過發送交易而進行轉帳、存入資料等業務,區塊鏈中的記帳節點在交易池中收集區塊鏈中的交易,執行所述交易,並在執行所述交易之後,將這些交易打包到區塊中並擴散到區塊鏈中。區塊鏈中的驗證節點會對從記帳節點發出的區塊進行驗證,在驗證通過之後,每個節點在接收到該區塊時,都會執行該區塊中包括的每個交易。為了保證各個節點的資料一致性,各個節點中在執行區塊中的多個交易時,對該多個交易的提交順序需要是一致的,這樣才能得到一致的執行結果。因此,在現有技術中,記帳節點在執行交易之前會按照預定規則對將要執行的多個交易進行編號,並按照編號的順序依次執行多個交易,也即依次提交多個交易,並且其它節點在接收到該區塊之後,也是按照上述交易編號順序依次執行並提交所述多個交易。然而,所述多個交易並不一定都是相互依賴的,在兩個交易之間不存在依賴性的情況中,同時執行這兩個交易並不影響最終的結果。而如果同時執行的兩個交易存在依賴性,則該同時執行將影響到最終的結果。
因此,需要一種更有效的在區塊鏈中同時執行多個交易的方法。
本說明書實施例旨在提供一種更有效的同時執行交易的方案,以解決現有技術中的不足。
為實現上述目的,本說明書一個方面提供一種在區塊鏈中同時執行交易的方法,所述方法在區塊鏈中的第一節點執行,所述第一節點中預設有第一執行體,所述第一執行體目前在處理第一交易,所述方法包括:
在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠,所述第一等待過程用於等待其它執行體完成預定操作;以及
當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體,以使得所述第一執行體繼續執行所述第一交易。
在一個實施例中,所述第一節點中還預設有第二執行體,所述第二執行體在使得所述第一執行體休眠之前為待運行狀態,所述方法還包括,在使得所述第一執行體休眠之後,透過所述第二執行體開始執行所述第一節點中的待處理的第二交易,其中,所述第二執行體在使得所述第一執行體休眠之後搶占到之前與所述第一執行體相應的CPU。
在一個實施例中,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠包括,在所述第一執行體處理完成所述第一交易之後,在確定第三交易未提交的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第三交易的提交,之後使得所述第一執行體開始第一等待過程,其中,所述第三交易根據預定提交順序為所述第一交易的前一個交易。
在一個實施例中,所述第一節點中還預設有第三執行體,所述第三交易由第三執行體執行,其中,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體包括,在所述第三執行體提交所述第三交易之後,透過所述第三執行體基於所述記錄喚醒所述第一執行體。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠包括,在所述第一執行體請求對所述第一變數的讀取之後,使得所述第一執行體開始第一等待過程。
在一個實施例中,所述第一節點中還預設有第四執行體,其中,所述第四執行體在所述第一執行體請求對所述第一變數的讀取之後進行對所述第一變數的讀取,其中,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體包括,當所述第四執行體在讀取到第一變數的值之後,透過所述第四執行體喚醒所述第一執行體、並將所述第一變數的值提供給第一執行體。
在一個實施例中,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體,以使得所述第一執行體繼續執行所述第一交易包括,當所述第一等待過程結束之後,喚醒所述第一執行體,以使得所述第一執行體在搶占到CPU之後繼續執行所述第一交易。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠包括,在所述第一執行體執行到所述讀取操作的代碼之後,確定提交順序在第一交易之前、且未提交的各個交易是否為已執行了對第一變數的寫入操作的衝突交易,所述各個交易中包括第四交易,在確定所述第四交易為距離第一交易最近的衝突交易的情況中,使得所述第一執行體在共享記憶體中記錄其在等待所述第四交易的提交,之後使得所述第一執行體開始第一等待過程。
在一個實施例中,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體包括,當執行第四交易的執行緒提交第四交易之後,透過該執行緒基於所述第一執行體在共享記憶體中的記錄喚醒所述第一執行體。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠包括,在所述第一執行體執行到所述讀取操作的代碼之後,推斷提交順序在第一交易之前、且未提交的各個交易是否為將要對第一變數進行寫入操作的衝突交易,所述各個交易中包括第五交易,在推斷所述第五交易為距離第一交易最近的衝突交易的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第五交易的提交或者在等待第五交易進行寫入操作,之後使得所述第一執行體開始第一等待過程。
在一個實施例中,所述執行體為以下任一個:執行緒、處理、共常式。
本說明書另一方面提供一種在區塊鏈中同時執行交易的裝置,所述裝置部署在區塊鏈中的第一節點中,所述第一節點中預設有第一執行體,所述第一執行體目前在處理第一交易,所述裝置包括:
休眠單元,配置為,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠,所述第一等待過程用於等待其它執行體完成預定操作;以及
喚醒單元,配置為,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體,以使得所述第一執行體繼續執行所述第一交易。
在一個實施例中,所述第一節點中還預設有第二執行體,所述第二執行體在使得所述第一執行體休眠之前為待運行狀態,所述裝置還包括,執行單元,配置為,在使得所述第一執行體休眠之後,透過所述第二執行體開始執行所述第一節點中的待處理的第二交易,其中,所述第二執行體在使得所述第一執行體休眠之後搶占到之前與所述第一執行體相應的CPU。
在一個實施例中,所述休眠單元還配置為,在所述第一執行體處理完成所述第一交易之後,在確定第三交易未提交的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第三交易的提交,之後使得所述第一執行體開始第一等待過程,其中,所述第三交易根據預定提交順序為所述第一交易的前一個交易。
在一個實施例中,所述第一節點中還預設有第三執行體,所述第三交易由第三執行體執行,其中,所述喚醒單元還配置為,在所述第三執行體提交所述第三交易之後,透過所述第三執行體基於所述記錄喚醒所述第一執行體。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,所述休眠單元還配置為,在所述第一執行體請求對所述第一變數的讀取之後,使得所述第一執行體開始第一等待過程。
在一個實施例中,所述第一節點中還預設有第四執行體,其中,所述第四執行體在所述第一執行體請求對所述第一變數的讀取之後進行對所述第一變數的讀取,其中,所述喚醒單元還配置為,當所述第四執行體在讀取到第一變數的值之後,透過所述第四執行體喚醒所述第一執行體、並將所述第一變數的值提供給第一執行體。
在一個實施例中,所述喚醒單元還配置為,當所述第一等待過程結束之後,喚醒所述第一執行體,以使得所述第一執行體在搶占到CPU之後繼續執行所述第一交易。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,所述休眠單元還配置為,在所述第一執行體執行到所述讀取操作的代碼之後,確定提交順序在第一交易之前、且未提交的各個交易是否為已執行了對第一變數的寫入操作的衝突交易,所述各個交易中包括第四交易,在確定所述第四交易為距離第一交易最近的衝突交易的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第四交易的提交,之後使得所述第一執行體開始第一等待過程。
在一個實施例中,所述喚醒單元還配置為,當執行第四交易的執行緒提交第四交易之後,透過該執行緒基於所述第一執行體在共享記憶體中的記錄喚醒所述第一執行體。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,所述休眠單元還配置為,在所述第一執行體執行到所述讀取操作的代碼之後,推斷提交順序在第一交易之前、且未提交的各個交易是否為將要對第一變數進行寫入操作的衝突交易,所述各個交易中包括第五交易,在推斷所述第五交易為距離第一交易最近的衝突交易的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第五交易的提交或者在等待第五交易進行寫入操作,之後使得所述第一執行體開始第一等待過程。
在一個實施例中,所述執行體為以下任一個:執行緒、處理、共常式。
本說明書另一方面提供一種電腦可讀儲存媒體,其上儲存有電腦程式,當所述電腦程式在電腦中執行時,令電腦執行上述任一項方法。
本說明書另一方面提供一種計算設備,包括記憶體和處理器,其特徵在於,所述記憶體中儲存有可執行代碼,所述處理器執行所述可執行代碼時,實現上述任一項方法。
透過根據本說明書實施例的同時執行交易的方案,在執行體執行交易過程中需要等待時進入休眠狀態,讓出CPU資源,在等待過程結束之後被喚醒以繼續執行交易,執行體在讓出CPU資源之後,其它執行體可搶占該CPU以處理其它的交易,從而提高了CPU的利用率,加快了交易同時執行的總體速度。
下面將結合附圖描述本說明書實施例。
圖1示出根據本說明書實施例的區塊鏈系統示意圖。如圖1所示,所述系統中包括構成區塊鏈的多個節點(圖中示意示出6個節點),這些節點兩兩相連,其中例如包括節點11、節點12和節點13。如本領域技術人員所知,在區塊鏈中,一些節點會收集區塊鏈中的多個交易放入交易池中並競爭記帳權。例如圖中的節點11透過獲取記帳權而成為記帳節點。節點11在成為記帳節點之後會執行其交易池中的多個交易,並將該多個交易打包成區塊發送給其它節點,例如發送給節點12。節點12將會對該區塊進行驗證,並同樣地執行該區塊中的多個交易。在預定數目個節點對該區塊進行驗證之後,也即對該區塊達到了共識,區塊鏈中的其它節點(例如節點13)將不需要繼續對該區塊進行驗證,而是直接對該區塊中的交易進行執行,以更新本地的相關資料。
圖2示出在區塊鏈中各個節點透過多個執行緒同時執行交易的示意圖。可以理解,所述執行緒也可以替換為處理、共常式等執行體。如圖2中所示,在每個節點中,通常,CPU的數目是有限的,預設的執行緒的數目也是固定的,例如,假設該節點的CPU數為4個,執行緒池中預設的執行緒數目為6個,從而6個執行緒競爭搶占CPU,並且只有在搶占到CPU之後,才能開始執行任務池中的任務。
在多個執行緒同時執行多個交易的過程中,所述多個交易中可能涉及到對多個變數的計算,在兩個交易中不涉及相同的變數的情況中,其執行順序並不會影響最終的計算結果,而在兩個交易中涉及相同的變數的情況中,其執行順序將會影響最終的計算結果。在本說明書實施例中,為了保證各個節點對多個交易的執行結果是相同的,在同時執行多個交易的同時,考慮交易之間對存取變數的衝突,從而使得平行執行的執行緒中的一些執行緒需要經過等待過程。或者在等待返回存取儲存時需要進行等待。
如圖2中所示,該圖中包括第一節點的共享記憶體,該共享記憶體中例如包括用於指示待處理交易的第一緩衝區(緩衝區1),該共享記憶體是相對於全部執行緒可讀寫的。例如,第一緩衝區中目前記錄了10個待處理的交易1、2、…10,其中,圖中數字1、2、…、10對應的位元框中初始應都為1,表示,其都是待處理的交易,其中,交易1~10的編號對應於各個交易的提交順序。在開始同時執行交易之後,例如,執行緒1~4分別搶占到CPU1~4,從而,執行緒1~4可分別從第一緩衝區中獲取一個任務進行處理,例如,執行緒1~4分別開始處理交易1~4,執行緒1~4在開始處理交易1~4之後,分別將第一緩衝區中交易1~4對應的位元分別修改為0,以表示這些交易已經開始執行。可以理解,雖然圖中示意示出,執行緒1搶占到CPU1,並執行交易1,執行緒2搶占到CPU2,並執行交易2等等,可以理解,圖中所示內容僅是為了示意說明,執行緒的編號、CPU的編號和交易的編號並不是相互對應的,例如,執行緒1有可能搶占到CPU2,執行交易3等等。
在本說明書實施例中,為了同時執行交易,執行交易的過程包括處理交易的過程和提交交易的過程,其中,所述處理交易的過程是將處理交易的結果儲存到與該交易對應的緩衝區中,所述提交交易的過程是將最終的處理結果儲存到各個交易共用的共享記憶體中。例如,執行緒3在處理完成交易3之後需要等待交易2提交完成,然後再提交交易3。圖2中的共享記憶體中還包括第二緩衝區(緩衝區2),用於記錄處理完成等待提交的交易及相應的執行緒。另外,執行緒3還具有屬於其自身的第三緩衝區,用於儲存交易執行信息。在執行緒3執行到該等待過程時,也就是說,當執行緒3處理完交易3之後,執行緒3在第三緩衝區中保存與交易3對應的目前執行信息,在第二緩衝區中將與交易3對應的位元組修改為3(表示執行緒3),表示其已處理完交易3並等待提交,之後進入休眠狀態,以讓出其搶占的CPU(即圖中CPU3)。執行緒3在讓出CPU3之後,剩下的待運行的執行緒(執行緒5和執行緒6)可進行對CPU資源的競爭,例如執行緒5搶占到該CPU3,從而執行緒5可以到第一緩衝區中獲取排在最前面的一個待處理交易(交易5)進行交易執行。執行緒2在提交完成交易2之後,查看第二緩衝區,當其發現第二緩衝中的與交易3對應的位元組為3時,相應地喚醒執行緒3。執行緒3在被喚醒之後,可進行對CPU的競爭,在搶占到CPU之後,可從第三緩衝區(緩衝區3)中獲取與交易3對應的執行信息,並基於該執行信息開始進行對交易3的提交過程。
可以理解,上文對圖2的描述只是示意性地,而不是用於限制本說明書實施例的範圍。例如,所述等待過程不一定為上述等待前一個交易提交的過程,所述第一緩衝區、第二緩衝區和第三緩衝區的具體形式不一定為圖中所示形式,只要其能記錄下相應的信息即可。下文將詳細描述上述同時執行交易的過程。
圖3示出根據本說明書實施例的一種在區塊鏈中同時執行交易的方法流程圖,所述方法在區塊鏈中的第一節點執行,所述第一節點中預設有第一執行體,所述第一執行體目前在執行第一交易,所述第一交易中包括第一等待過程,所述方法包括:
在步驟S302,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠,所述第一等待過程用於等待其它執行體完成預定操作;以及
在步驟S304,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體,以使得所述第一執行體繼續執行所述第一交易。
首先,在步驟S302,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠,所述第一等待過程用於等待其它執行體完成預定操作。
如上文中參考圖2所述,所述第一執行體例如可以為執行緒、處理、共常式等執行主體。下文中將以執行緒為例進行說明。
在節點中同時執行交易的過程中,對於其中一個正在執行的交易,可能會包括多個等待過程,所述等待過程可能是由於不同的原因引起的。
在一個實施例中,如上文中參考圖2中所述,所述多個同時執行的交易已經預設了預定的提交順序,例如圖2中的交易1~10必須按照其編號的從小到大的順序進行先後提交,以保證各個節點對該多個交易的執行結果是相同的。這裡,在節點中,執行緒在執行交易時,將交易處理結果先保存到僅與該交易對應的緩衝區中,而在提交之後,才將該處理結果保存到各個交易共用的共享記憶體中。例如,在處理第一交易的過程中,需要對第一變數進行寫入操作,則在僅與第一交易對應的緩衝區中先保存該寫入操作之後的第一變數的值,該值僅在處理該第一交易時可以使用,在處理其它交易時並不會對該值進行讀寫。而在提交第一交易之後,第一交易的值被存到共享記憶體中,其它交易也可以讀取到該值,或者透過提交對該值進行修改。
由於各個交易具有預定的提交順序,因此,如圖2中所示,例如所述第一交易為圖2中的交易3,則第一執行體為圖中的執行緒3。如果在執行緒2提交交易2之前,執行緒3先處理完交易3,此時,執行緒3需要等待執行緒2提交完成之後才能進行對交易3的提交。從而,為了不浪費CPU資源,可以使得執行緒3進入休眠狀態,以使得其它待運行執行緒透過搶占該讓出的CPU,繼續執行其它待處理的交易,這樣就充分利用了CPU資源,提高了同時執行交易的速度。執行緒3在休眠之前需要留下信號,以使得交易2在提交之後,相應的執行交易2的執行緒(即執行緒2)會知道執行緒3在等交易2的提交、並且執行緒3為休眠狀態。如圖2中所示,例如,可在共享記憶體中設置第二緩衝區(緩衝區2),第二緩衝區用於記錄這樣的情況。第二緩衝區包括與各個交易對應的位元組,並且每個位元組的初始值為0。例如,執行緒3在執行完成交易3之後將第二緩衝區中與交易3對應的位元組從0修改為3,從而記錄執行緒3已經執行完交易3,在等待交易2提交,並且即將休眠。可以理解,執行緒3不限於透過這種方式留下信號,例如,執行緒3可在與交易2對應的記憶體中進行該記錄,或者執行緒3可透過字元串的方式進行該記錄等等。執行緒3在進行完上述記錄之後,進入等待過程,在進入等待過程之後,執行緒3透過預定指令進入休眠狀態,以進行等待。
在一個實施例中,例如,圖2中的交易3包括對變數k1的讀取操作。所述第一節點中預設有專用於進行儲存存取的硬體(如CPU、FPGA等等)。執行緒3在開始執行該讀取操作之後,請求所述硬體執行對k1的讀取,並在進行該請求之後進行等待,從而,執行緒3可在所述請求之後進入休眠狀態。所述硬體接收到該請求之後,記錄下執行緒3的該請求,透過其中的一個執行緒(例如執行緒11)從共享記憶體中的變數表中讀取k1的值。
在一個實施例中,各個執行緒在執行交易且未提交該交易時,將對變數的讀、寫操作記錄到共享記憶體中。例如,執行緒1在進行交易1中對變數k1的寫入操作之後,在共享記憶體中的變數寫表的與k1對應的位元中進行標記,執行緒3在將要讀取k1之前,查詢所述變數寫表,當其發現交易1進行了對k1的寫入操作、且交易2還未進行對k1的寫入操作之後,由於執行緒3只有在交易1提交之後才能讀取到該寫入操作對應的值,因此,執行緒3需要等待交易1提交之後,再進行對變數k1的讀取,從而,執行緒3在執行到所述讀取操作的代碼之後查詢該變數寫表,並基於查詢結果在共享記憶體中的與第二緩衝區類似的緩衝區中記錄其在等待交易1的提交,然後進入休眠狀態,以進行等待。
在一個實施例中,交易3中包括對變數k1的讀取操作,執行緒3在開始該讀取操作之後,推斷正在同時執行的多個交易中提交順序在交易3之前的各個交易(例如圖2中的交易1~2)是否將要對變數k1進行寫入操作。在一個實施例中,執行緒3可基於第一節點中的歷史計算資料(交易執行歷史),確定變數k1的交易衝突機率,如果該衝突機率大於預定臨限值,則可推斷交易1和交易2都將要對k1進行寫入操作,從而,執行緒3可以在共享記憶體中與第二緩衝區類似的緩衝區中記錄其在等待交易2的提交,然後進入休眠狀態,以等待交易2提交完成再進行對k1的讀取。或者,如果交易2在處理過程中將對k1的寫入值寫入共享記憶體中與交易2對應的緩衝區(該緩衝區不是與各個交易對應的變數表)中,則可等待交易2執行完k1的寫入後,進行對k1的讀取。在一個實施例中,交易3可基於前面各個交易的交易資料,確定其與前面各個交易的衝突機率,並基於該衝突機率,推斷所述各個交易是否將要對k1進行寫入操作,從而確定是否在進行讀取操作之前進入休眠狀態,以進行等待。例如,在確定交易1對k1的寫入機率大於等於預定臨限值、且交易2對k1的寫入機率小於預定臨限值的情況中,執行緒3在所述緩衝區5中記錄其在等待交易1的提交或寫入,然後進入等待過程,即進入休眠狀態。
在步驟S304,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體,以使得所述第一執行體繼續執行所述第一交易。
在上述交易3在執行完成之後等待交易2的提交的實施例中,執行緒2在提交完成交易2之後,會查詢第二緩衝區,以確定執行緒3是否在等它。當執行緒2發現第二緩衝區中與交易3對應的位元組為3的情況中,執行緒2知道執行緒3目前為休眠狀態,因此,執行緒2喚醒執行緒3,以使得執行緒3可以繼續執行交易3。執行緒3在被喚醒之後,可將第二緩衝區中的“3”修改為0,以指示執行緒3已被喚醒。執行緒3在被喚醒之後首先是處於待運行狀態,其將與其它的空閒執行緒一起競爭CPU,等執行緒3搶占到CPU之後,其可以開始進行對交易3的提交。在進行交易3的提交之前,執行緒3可以先查詢一下,根據在前提交的交易的記錄,確定交易3是否需要重做,在不需要重做的情況下,執行緒3可以提交交易3。在該第一節點中還可能設置了交易窗口,透過該交易窗口控制可同時同時執行的交易的最大總數,該交易窗口的兩邊分別是目前同時執行的編號最小的交易和編號最大的交易。從而,執行緒3在提交交易3之後,還可以將交易窗口中的編號最小交易修改為4。
在執行緒3等待其它執行緒(執行緒11)返回變數讀取值的實施例中,執行緒11在讀取到變數k1的值之後,其根據硬體中對所述請求的記錄,喚醒執行緒3,並將該讀取到的值提供(例如,發送)給執行緒3,從而執行緒3可同樣地在搶占到CPU之後,基於從執行緒11獲取的變數k1的值繼續執行該交易3。可以理解,這裡不一定透過執行緒11將所述讀取的值發送給執行緒3,例如,執行緒11在讀取到k1的值之後,可將k1的值存到預定位址,從而執行緒3在被喚醒之後可在該預定位址獲取該k1的值。
在執行緒3基於變數寫表等待交易1的相應操作以進行對k1的讀取操作的實施例中,執行緒3可與上述第一個實施例類似地,透過記錄一個信號而使得執行緒1在執行了相應操作之後喚醒執行緒3。例如,執行緒3可在與該場景對應的(共享的或僅對應於交易1的)緩衝區中記錄其在等交易1提交。從而,執行緒1在提交交易1之後,會查詢該緩衝區,並基於執行緒3的記錄喚醒執行緒3,從而使得執行緒3在搶占到CPU之後可以繼續執行對k1的讀取操作。
在執行緒3基於衝突機率等待交易2的相應操作以繼續對變數k1的讀取的實施例中,執行緒3可與上述實施例類似地,透過記錄一個信號而使得執行緒2在執行了相應操作之後喚醒執行緒3。例如,執行緒3可在與該場景對應的(共享的或僅對應於交易2的)緩衝區中記錄其在等交易2提交。從而,執行緒2在提交交易2之後,會查詢該緩衝區,並基於執行緒3的記錄喚醒執行緒3,從而使得執行緒3在搶占到CPU之後可以繼續執行對k1的讀取操作。
圖4示出根據本說明書一個實施例的一種在區塊鏈中同時執行交易的裝置400,所述裝置部署在區塊鏈中的第一節點中,所述第一節點中預設有第一執行體,所述第一執行體目前在處理第一交易,所述裝置包括:
休眠單元41,配置為,在所述第一執行體在處理所述第一交易的過程中開始第一等待過程之後,使得所述第一執行體休眠,所述第一等待過程用於等待其它執行體完成預定操作;以及
喚醒單元42,配置為,當所述其它執行體完成所述預定操作之後,透過所述其它執行體喚醒所述第一執行體,以使得所述第一執行體繼續執行所述第一交易。
在一個實施例中,所述第一節點中還預設有第二執行體,所述第二執行體在使得所述第一執行體休眠之前為待運行狀態,所述裝置還包括,執行單元43,配置為,在使得所述第一執行體休眠之後,透過所述第二執行體開始執行所述第一節點中的待處理的第二交易,其中,所述第二執行體在使得所述第一執行體休眠之後搶占到之前與所述第一執行體相應的CPU。
在一個實施例中,所述休眠單元41還配置為,在所述第一執行體處理完成所述第一交易之後,在確定第三交易未提交的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第三交易的提交,之後使得所述第一執行體開始第一等待過程,其中,所述第三交易根據預定提交順序為所述第一交易的前一個交易。
在一個實施例中,所述第一節點中還預設有第三執行體,所述第三交易由第三執行體執行,其中,所述喚醒單元42還配置為,在所述第三執行體提交所述第三交易之後,透過所述第三執行體基於所述記錄喚醒所述第一執行體。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,所述休眠單元41還配置為,在所述第一執行體請求對所述第一變數的讀取之後,使得所述第一執行體開始第一等待過程。
在一個實施例中,所述第一節點中還預設有第四執行體,其中,所述第四執行體在所述第一執行體請求對所述第一變數的讀取之後進行對所述第一變數的讀取,其中,所述喚醒單元42還配置為,當所述第四執行體在讀取到第一變數的值之後,透過所述第四執行體喚醒所述第一執行體、並將所述第一變數的值提供給第一執行體。
在一個實施例中,所述喚醒單元42還配置為,當所述第一等待過程結束之後,喚醒所述第一執行體,以使得所述第一執行體在搶占到CPU之後繼續執行所述第一交易。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,所述休眠單元41還配置為,在所述第一執行體執行到所述讀取操作的代碼之後,確定提交順序在第一交易之前、且未提交的各個交易是否為已執行了對第一變數的寫入操作的衝突交易,所述各個交易中包括第四交易,在確定所述第四交易為距離第一交易最近的衝突交易的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第四交易的提交,之後使得所述第一執行體開始第一等待過程。
在一個實施例中,所述喚醒單元42還配置為,當執行第四交易的執行緒提交第四交易之後,透過該執行緒基於所述第一執行體在共享記憶體中的記錄喚醒所述第一執行體。
在一個實施例中,所述第一交易中包括對第一變數的讀取操作,其中,所述休眠單元41還配置為,在所述第一執行體執行到所述讀取操作的代碼之後,推斷提交順序在第一交易之前、且未提交的各個交易是否為將要對第一變數進行寫入操作的衝突交易,所述各個交易中包括第五交易,在推斷所述第五交易為距離第一交易最近的衝突交易的情況中,使得所述第一執行體在共享記憶體中記錄其在等待第五交易的提交或者在等待第五交易進行寫入操作,之後使得所述第一執行體開始第一等待過程。
本說明書另一方面提供一種電腦可讀儲存媒體,其上儲存有電腦程式,當所述電腦程式在電腦中執行時,令電腦執行上述任一項方法。
本說明書另一方面提供一種計算設備,包括記憶體和處理器,其特徵在於,所述記憶體中儲存有可執行代碼,所述處理器執行所述可執行代碼時,實現上述任一項方法。
透過根據本說明書實施例的同時執行交易的方案,在執行體執行交易過程中需要等待時進入休眠狀態,讓出CPU資源,在等待過程結束之後被喚醒以繼續執行交易,執行體在讓出CPU資源之後,其它執行體可搶占該CPU以處理其它的交易,從而提高了CPU的利用率,加快了交易同時執行的總體速度。
需要理解,本文中的“第一”,“第二”等描述,僅僅為了描述的簡單而對相似概念進行區分,並不具有其他限定作用。
本說明書中的各個實施例均採用漸進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對於系統實施例而言,由於其基本相似於方法實施例,所以描述的比較簡單,相關之處參見方法實施例的部分說明即可。
上述對本說明書特定實施例進行了描述。其它實施例在所附申請專利範圍的範圍內。在一些情況下,在申請專利範圍中記載的動作或步驟可以按照不同於實施例中的順序來執行並且仍然可以實現期望的結果。另外,在附圖中描繪的過程不一定要求示出的特定順序或者連續順序才能實現期望的結果。在某些實施方式中,多任務處理和平行處理也是可以的或者可能是有利的。
本領域普通技術人員應該還可以進一步意識到,結合本文中所公開的實施例描述的各示例的單元及演算法步驟,能夠以電子硬體、電腦軟體或者二者的結合來實現,為了清楚地說明硬體和軟體的可互換性,在上述說明中已經按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬體還是軟體方式來執行,取決於技術方案的特定應用和設計約束條件。本領域普通技術人員可以對每個特定的應用來使用不同方法來實現所描述的功能,但是這種實現不應認為超出本申請的範圍。
結合本文中所公開的實施例描述的方法或演算法的步驟可以用硬體、處理器執行的軟體模組,或者二者的結合來實施。軟體模組可以置於隨機記憶體(RAM)、記憶體、唯讀記憶體(ROM)、電可編程ROM、電可抹除可編程ROM、暫存器、硬碟、可移動磁碟、CD-ROM、或技術領域內所公知的任意其它形式的儲存媒體中。
以上所述的具體實施方式,對本發明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發明的具體實施方式而已,並不用於限定本發明的保護範圍,凡在本發明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發明的保護範圍之內。
11:節點
12:節點
13:節點
S302:步驟
S304:步驟
400:同時執行交易裝置
41:休眠單元
42:喚醒單元
43:執行單元
透過結合附圖描述本說明書實施例,可以使得本說明書實施例更加清楚:
[圖1]示出根據本說明書實施例的區塊鏈系統示意圖;
[圖2]示出在區塊鏈中各個節點透過多個執行緒同時執行交易的示意圖;
[圖3]示出根據本說明書實施例的一種在區塊鏈中同時執行交易的方法流程圖;
[圖4]示出根據本說明書一個實施例的一種在區塊鏈中同時執行交易的裝置。